Pregunta

Seguimiento de este comentario de la pregunta Escritura de firmware: ¿ensamblaje o nivel alto? :

Al compilar código C ++ para la plataforma Arduino , ¿puede usar funciones virtuales, excepciones, etc.? ¿O le gustaría (tiene que) utilizar un subconjunto de C ++ (como se describe en el comentario )?

¿Alguna otra advertencia al programar para la plataforma Arduino?

¿Fue útil?

Solución

El entorno Arduino utiliza la versión AVR de la cadena de herramientas GCC. El código se compila como C ++, por lo que puede usar clases. Las funciones virtuales son posibles; Las vtables se almacenarán en la sección .data y tendrán las direcciones correctas. De hecho, la clase base Print usa funciones virtuales para adaptar los distintos '' print '' métodos para los diferentes tipos de salida.

Las excepciones no son compatibles debido a razones de espacio de código. El entorno Arduino pasa " -fno-excepciones " a la línea de comando del compilador. Consulte la fuente para verificar esto. .

Las plantillas son compatibles. Por ejemplo, esta técnica de operador de inserción de flujo sin costo funciona bien utilizando una plantilla simple y un operador en línea.

Otros consejos

El software Arduino usa avr-gcc para compilar bocetos. Las siguientes limitaciones provienen de las avrlibc FAQ (¿Puedo usar C ++ en el AVR?) :

Soportado

  • Funciones virtuales
  • Constructores y destructores (incluidos los globales)

No compatible

  • C ++ funciones estándar, clases y clases de plantilla (pero vea este puerto de uClibc ++ para Arduino )
  • operadores new y delete (intentar usarlos hará que el enlazador se queje de referencias externas indefinidas). Esto significa que los objetos solo se pueden crear en la pila. Si se requiere una asignación de memoria dinámica, debe implementarse utilizando malloc () y free () de los tipos C
  • Excepciones. Dado que las excepciones están habilitadas de manera predeterminada en la interfaz de C ++, deben desactivarse explícitamente usando -fno-exceptions en las opciones del compilador. El IDE de Arduino lo hace automáticamente cuando inicia avr-gcc

Otros problemas

  • Algunos de los archivos de inclusión suministrados no son seguros para C ++, es decir, deben envolverse con
    extern " C " {. . . }

La usabilidad de las funciones no está limitada por la plataforma, sino por el compilador que está utilizando.

Verificaría la documentación de su compilador sobre qué funciones de idioma son compatibles.

Comeau computing tiene un compilador de C ++ a C que admite todas las funciones de C ++. No solo funciones virtuales, o excepciones, sino también exportación. Debería llamar a Comeau para que apunte al idioma Arduino, pero no debería ser demasiado difícil.

La documentación dice:

  

El lenguaje Arduino se basa en C / C ++ y admite todas las construcciones estándar de C y algunas características de C ++.

No dice nada sobre las funciones virtuales que puedo encontrar.

Probé un programa simple y se compila bien. Sin embargo, no lo he probado en el hardware Arduino.

EDITAR: tampoco he probado excepciones.

Utilicé g ++ con este Makefile y comencé con este código . C ++ desperdicia algo de espacio. Pero los protothreads son demasiado geniales para no usarlos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top