¿Será posible escribir código en C ++ para microcontroladores PIC en el futuro?

8

¿Alguna vez será posible usar C ++ para codificar PIC? ¿Hay alguna limitación de hardware que nos impide usar C ++? ¿Cuánto aumenta el tamaño del archivo .hex generado y el tiempo de ejecución del programa cuando usamos C ++ en lugar de C? ¿Es prácticamente posible usar C ++ para los PIC actuales? ¿Hay algún plan futuro o desarrollo continuo sobre esto?

hkBattousai
fuente
Creo que es posible y seguirá siendo posible, pero AFAIK no se recomienda ya que implementa estructuras y funciones de alto nivel que no son adecuadas para una programación fuertemente relacionada con el hardware
clabacchio
3
Para el debate de idoneidad - electronics.stackexchange.com/questions/3027/…
Toby Jaffey
2
Dado que la respuesta es "Sí, ya existen compiladores de C ++", voy a dejar que este se mantenga, pero en el futuro debe tener en cuenta que las preguntas de Stack Exchange deben ser sobre hechos verificables, no suposiciones sobre el futuro.
Kevin Vermeer
2
@clabacchio: No necesariamente es cierto. En C ++, solo paga por lo que usa. Vea mi respuesta en: electronics.stackexchange.com/questions/3027/…
Rocketmagnet
"PIC" es una generalización inútil. En algunos PIC de gama baja (piense en 10F200), C es casi imposible de usar. En algunos PIC de gama alta (serie 32MX) se rumorea que C ++ se usa en este momento, y ciertamente no hay ninguna razón técnica por la que no pueda. Entonces, un mejor enfoque podría dar una respuesta más útil, en este momento todos están respondiendo una pregunta diferente.
Wouter van Ooijen

Respuestas:

17

¿Alguna vez será posible usar C ++ para codificar PIC?

Sí, es posible ahora. Para dsPIC, existe el compilador C ++ de IAR Systems (aunque es muy antiguo y no es compatible).

Otra opción es usar un convertidor de C ++ a C. Usando un paso previo a la construcción, convierta el C ++ a C, luego dele el (desagradable) C a su compilador de C normal. Eche un vistazo al LLVM o al compilador de C ++ de Comeau, que ambos hacen eso. Comeau's solo cuesta $ 50, pero probablemente tomará algún esfuerzo lograr que toda la cadena de herramientas y las bibliotecas funcionen correctamente.

¿Hay alguna limitación de hardware que nos impide usar C ++?

Respuesta corta, no, no hay limitaciones de hardware. Respuesta larga, C ++ ciertamente alienta el uso de un montón y / o pila, con el que lucharán las MCU más pequeñas con RAM limitada.

¿Por qué luchan con un montón / pila? Por dos razones: A) muchas MCU tienen RAM limitada, no lo suficiente para un montón ciertamente, y apenas lo suficiente para una pila. B) muchas MCU no manejan bien los punteros, por lo que el uso de variables en la pila realmente mata el rendimiento.

Cuando las personas preguntan sobre el uso de C ++ en una MCU, encuentro constructivo comparar C ++ con C. Las mismas preguntas se hicieron (y aún se preguntan) sobre C en una MCU. La gente solía negarse ante la idea. ¿Un lenguaje de alto nivel, en 256 bytes RAM MCU? Imposible. Pero ahora todos sabemos que es posible. He escrito C para un PIC12. No hay problema. Es posible porque A) los desarrolladores de software saben que deben tener un poco de cuidado: no use malloc (), etc. y B) el compilador ha sido escrito especialmente para la MCU. El compilador también tendrá mucho cuidado con la asignación de memoria, no intentará crear un montón y es posible que no cree una pila. Algunos compiladores de C simplemente no le permitirán escribir código reentrante (recursivo) que requiere absolutamente una pila.

Sabiendo que es posible escribir C para una MCU, las mismas respuestas se aplican a la cuestión de escribir C ++ en una MCU. Mientras el compilador comprenda las limitaciones del dispositivo de destino y el usuario también comprenda el idioma, realmente no hay problema. En C ++, solo paga por lo que usa. Es perfectamente posible escribir C ++ (con objetos y todo) que produzca la salida asm exacta que habría obtenido si hubiera usado C.

Ahora, los PIC32 ciertamente pueden hacer frente a C ++. Tienen hasta 64kB de RAM y se basan en el núcleo MIPS, que es un procesador de 32 bits debidamente desarrollado. Puede manejar punteros y una pila, así como una PC. De hecho, hay PC basadas en el MIPS (o al menos, solía haber).

Lamentablemente, hay tantos malentendidos en torno a C ++. Incluso los codificadores muy experimentados parecen no tener idea de cómo funciona el lenguaje. Vea mi respuesta sobre por qué C ++ es adecuado en CPU integradas.

¿Cuánto aumenta el tamaño del archivo .hex generado y el tiempo de ejecución del programa cuando usamos C ++ en lugar de C?

Como dije, puede que no haya diferencia. Bjarne Stroustrup hizo una comparación de un grupo de compiladores C / C ++ para comparar el rendimiento de tiempo y espacio para una serie de operaciones. Los resultados variaron ampliamente. ¡En algunos casos, el C ++ salió más lento y más grande, algunos casos más lento y más pequeño, o más rápido y más grande, e incluso más rápido y más pequeño! Entonces, la respuesta a su pregunta es que depende en gran medida del compilador, pero en general, no necesita hacer ninguna diferencia. Para obtener más detalles, consulte el Informe técnico sobre el rendimiento de C ++

¿Hay algún plan futuro o desarrollo continuo sobre esto?

Eso no lo se. Sé que el compilador Microchip C32 es de código abierto, y puede descargar la fuente. También sé que alguien con quien trabajé realmente encontró algunas instrucciones en línea y logró que el compilador compilara código C ++. Pero dejó la compañía antes de poder establecerme con una cadena de herramientas adecuada.


ACTUALIZAR

Microchip ahora tiene un compilador C ++ disponible para su gama PIC32 de MCU integradas.


Rocketmagnet
fuente
de la página web de IAR: "Producto heredado: IAR Embedded Workbench para dsPIC es un producto heredado. IAR Systems no lo actualiza y no es posible comprar un Acuerdo de Soporte y Actualización".
Jason S
Sé que los productos IAR son geniales, pero desafortunadamente son muy caros y parece "viejo". Sé que C ++ es factible en cualquier plataforma siempre que no use todas las funciones. Sin embargo, agrega la posibilidad de una capa adicional de abstracción con clases. No uso plantillas a menudo, tampoco uso asignaciones de memoria dinámica. ¿Alguien conoce a algún otro competidor para C ++ en PIC24 / PIC32?
Hans
Sí, lo siento, no fue realmente un gran hallazgo. Permítanme agregar algunas cosas más a mi respuesta.
Rocketmagnet
1
Consideraría a C como un competidor de C ++ en un microcontrolador. No puedo pensar en nada que quisiera hacer en C ++ que no pueda hacer en C y hay menos llamadas a funciones invisibles (constructores, destructores, etc.). Hace que el código sea más determinista y claro. ¿Qué características de C ++ son imprescindibles y no se pueden confundir con C?
AngryEE
1
Uno podría preguntarse: "¿Qué características de C son imprescindibles que no se pueden confundir en ASM?" Responda "nada". Los beneficios son una mayor capacidad para que el diseñador especifique el diseño y haga que el compilador verifique que la implementación sea correcta. Consulte mi respuesta electronics.stackexchange.com/questions/3027/… para obtener una lista de los beneficios reales e inmediatos de C ++ a este respecto.
Rocketmagnet
5

¿Cuánto aumenta el tamaño del archivo .hex generado y el tiempo de ejecución del programa cuando usamos C ++ en lugar de C?

Depende de las características que uses. Si usa las características centrales orientadas a objetos (clase + métodos), es probable que tenga muy poco efecto (variables / nombres de funciones alterados por más tiempo, por lo que la tabla de símbolos probablemente aumentará un poco). Las plantillas tampoco deberían agregar mucho con un buen compilador.

Si te vuelves loco y utilizas cosas como la Biblioteca de plantillas estándar, y usas asignación de memoria dinámica y excepciones, entonces es probable que te encuentres con una gran cantidad de código.

Jason S
fuente
Como advertencia para el OP, tenga mucho cuidado con la asignación de memoria en arquitecturas de memoria pequeñas y sistemas integrados siempre en ejecución.
kenny
¿podría el "-1" er comentar por qué él / ella no está de acuerdo?
Jason S
No soy el -1er, pero las plantillas son una característica que debe usarse con mucho cuidado para evitar la hinchazón de código. Fácilmente puede terminar con muchas copias de un algoritmo cuando sea suficiente.
Peter Green
Para hacerlo, en realidad tendría que usar la plantilla con varios tipos de datos diferentes, y una copia NO SERÍA suficiente a menos que esté usando un código polimórfico que tenga una clase base común. (En cuyo caso hay un costo de tiempo de ejecución). Las plantillas no hacen que su código se hinche mágicamente, solo causan código hinchado cuando los usa con múltiples tipos de datos cuando no está al tanto de las consecuencias.
Jason S
1

Al generalizar un poco su pregunta, hay procesadores ARM creados para el mercado integrado que contienen una MMU (unidad de administración de memoria). El tamaño de la memoria y la asignación hicieron que los lenguajes como java y c ++ fueran malas opciones incrustadas. A medida que los procesadores integrados continúan volviéndose más rápidos y potentes, y la memoria se vuelve más densa y barata, las opciones de idioma disponibles para los ingenieros integrados cambian drásticamente. Un procesador ARM de 600MHz de 32 bits con MMU y una tarjeta Flash de 64G es un gran candidato para aplicaciones c ++. Si se ajusta a la definición del procesador integrado clásico es otro problema.

Spearson
fuente
0

Probablemente sí ... pero de todos modos no deberías ... C es el lenguaje de incrustado y no hay ventajas de usar C ++. O más bien, las ventajas de C superan con creces las ventajas de C ++ para embebido. No pierdas tu tiempo.

  • si sabe cómo usar punteros de función, etc. Puede codificar como C ++, no hay ningún problema allí.
Ktc
fuente
55
Siento disentir. Puede usar muchas características de C ++ (clases, plantillas, sobrecarga de operadores, referencias) con un costo de tiempo de ejecución bajo o nulo. Sí, puedes hacer todas estas cosas en C simple con construcciones hack, pero es un lastre para tu cerebro, y preferiría estar usando C ++. (por supuesto, preferiría estar usando un lenguaje mejor, pero elegiría un compilador de C ++ en un abrir y cerrar de ojos en lugar de C.)
Jason S
1
Clases = estructuras (sin métodos integrados, pero si lo desea, puede almacenar un puntero de función en la estructura y llamarlo). Plantillas = usas esas ??? Sobrecarga del operador = sí, a mí también me gustaría. Referencias = punteros, ¿no? Con C, al menos, puede usar solo las 'características' de C ++ que desee sin preocuparse por el exceso de generación de código o tener que incluir una gran biblioteca aleatoria solo para obtener algo para compilar.
AngryEE
1
También ruego diferir.
Rocketmagnet
3
Sí, las plantillas son una forma extremadamente poderosa de generar código confiable y de alto rendimiento. Las referencias son un puntero más confiable. Con C ++ también solo paga por las funciones que utiliza. Creo que realmente necesitas entender más C ++.
Rocketmagnet
3
No sé qué quieres decir con "C es el lenguaje de incrustado". Claro, es muy popular. ¿Estás diciendo que es el mejor idioma posible? Seguramente no.
Rocketmagnet