¿Alguna vez será posible usar C++ para codificar PIC? ¿Hay alguna limitación de hardware que nos impida 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 en curso sobre esto?
¿Alguna vez será posible usar C++ para codificar PIC?
Sí, ahora es posible. 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 de preconstrucción, convierta el C++ a C, luego entregue el C (aspecto desagradable) a su compilador de C normal. Eche un vistazo a LLVM o al compilador C++ de Comeau, que hacen eso. Comeau cuesta solo $ 50, pero probablemente requerirá un poco de esfuerzo hacer que toda la cadena de herramientas y las bibliotecas funcionen correctamente.
¿Hay alguna limitación de hardware que nos impida usar C++?
Respuesta corta, no, no hay limitaciones de hardware. Respuesta larga, C ++ ciertamente fomenta el uso de un montón y / o pila, con lo que las MCU más pequeñas con RAM limitada tendrán problemas.
¿Por qué luchan con un montón/pila? Por dos razones: A) muchas MCU tienen RAM limitada, ciertamente no suficiente para un montón y apenas 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, me parece constructivo comparar C++ con C. Se hicieron (y aún se hacen) exactamente las mismas preguntas sobre C en una MCU. La gente solía resistirse a la idea. ¿Un lenguaje de alto nivel, en MCU de RAM de 256 bytes? 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 usen malloc(), etc. y B) el compilador ha sido escrito especialmente para 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. Siempre que el compilador comprenda las limitaciones del dispositivo de destino y el usuario también comprenda el idioma, no hay ningún problema. En C++, solo pagas por lo que usas. Es perfectamente posible escribir C++ (con objetos y todo) que produzca la salida exacta de ASM que habrías obtenido si hubieras 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 adecuadamente desarrollado. Puede manejar punteros y una pila, así como una PC. De hecho, hay PC basadas en MIPS (o al menos, solía haber).
Lamentablemente, hay muchos malentendidos en torno a C++. Incluso los codificadores con mucha experiencia 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, en 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 en curso sobre esto?
Eso no lo sé. Sé que el compilador Microchip C32 es de código abierto y puede descargar el código fuente. También sé que alguien con quien trabajé encontró algunas instrucciones en línea y logró que el compilador compilara código C++. Pero dejó la empresa antes de poder ofrecerme una cadena de herramientas adecuada.
ACTUALIZAR
Microchip ahora tiene un compilador C++ disponible para su gama PIC32 de MCU integrados.
¿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 funciones que uses. Si usa las características principales orientadas a objetos (clase + métodos), es probable que tenga muy poco efecto (los nombres de variables/funciones alterados son más largos, por lo que es probable que la tabla de símbolos aumente un poco). Las plantillas tampoco deberían agregar mucho con un buen compilador.
Si te vuelves loco e incorporas elementos como la biblioteca de plantillas estándar y usas la asignación de memoria dinámica y las excepciones, es probable que te encuentres con un código inflado.
Ya hay compiladores de C++ para pic, por ejemplo, http://www.sourceboost.com/Products/BoostCpp/Overview.html
No he usado esto y no sé nada al respecto aparte de que existe ...
Generalizando un poco su pregunta, hay procesadores ARM que están diseñados para el mercado integrado que contienen una MMU (unidad de administración de memoria). El tamaño y la asignación de la memoria hicieron que lenguajes como Java y C++ fueran malas opciones integradas. A medida que los procesadores integrados se vuelven más rápidos y potentes, y que la memoria se vuelve más densa y económica, las opciones de idioma disponibles para los ingenieros integrados cambian drásticamente. Un procesador ARM de 32 bits a 600 MHz con MMU y una tarjeta Flash de 64 G es un gran candidato para las aplicaciones de C++. Si se ajusta a la definición del procesador integrado clásico es otra cuestión.
Probablemente sí... pero no deberías de todos modos... 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 sistemas integrados. No pierdas tu tiempo.
inline int foo(unsigned char x) { return foo_byte(x); }
y convertir cada llamada a foo()
la que pasa an unsigned char
en una llamada a foo_byte()
.
clabacchio
toby jaffey
kevin vermeer
Rocketmagnet
Wouter van Ooijen