C ++ vs. El lenguaje Arduino?


81

¿Cuáles son las ventajas de cada idioma al usar el Arduino?

Creo que esta es una buena pregunta general, pero agregaré un poco sobre por qué pregunto si alguien quiere darme una propina.

Tengo experiencia en lenguajes preprocesados ​​como JavaScript, PHP, y he manipulado lenguajes como Java y Visual Basic. En otras palabras, conozco técnicas de programación y orientación a objetos tanto clásica como prototípica, pero nada sobre comunicarme directamente con el hardware.

Estoy haciendo un octocopter, y estoy pensando que un enfoque orientado a objetos será el más fácil. (El software tendrá muchas funciones ...) Sin embargo, nunca he escrito en C ++.

Dado que este es un sitio de preguntas y respuestas que se supone que debe ayudar a otros, solo la pregunta general presentada al principio es muy importante, pero agradecería cualquier comentario sobre mi situación.


16
Evite Arduino IDE ya que no merece su nombre IDE, incluso es un editor muy pobre: ​​puede ser bueno para principiantes y bocetos simples, pero uno debería ir rápidamente a algo mejor.
jfpoilpret

44
Este es un desglose bastante sucinto de lo que se entiende por (y lo que realmente está bajo el capó de) el "lenguaje de programación Arduino".
AdjunctProfessorFalcon

10
C++ vs. The Arduino Language?- El "lenguaje Arduino" es C ++. Hay un poco de preprocesamiento para ahorrar prototipos de funciones, pero definitivamente es C ++.
Nick Gammon

2
No existe el lenguaje arduino. Es simplemente una biblioteca.
Overdrivr

2
No tan relacionado con la pregunta como con los comentarios: Atmel studio es gratuito y, en mi humilde opinión, es mejor que visual studio para la programación arduino. También es compatible con el complemento Visual Micro, aunque no es necesario para programar y depurar arduinos.
cyberponk

Respuestas:


55

Mi experiencia personal como profesor (programación, mecatrónica) es que si tienes experiencia previa en programación y conoces conceptos como POO, es mejor optar por C / C ++. El lenguaje arduino es realmente genial para principiantes, pero tiene algunas limitaciones (por ejemplo, debe tener todos sus archivos en la misma carpeta). Y es básicamente una simplificación de C / C ++ (prácticamente puede copiar y pegar el código arduino en un archivo C / C ++, y funcionará). También tiene sentido que pueda usar un IDE bien conocido como eclipse:

http://playground.arduino.cc/Code/Eclipse

Inicialmente se requiere un poco más de configuración y configuración de su entorno de desarrollo, pero en mi humilde opinión, vale la pena para los programadores con experiencia en cualquier otro idioma.

En cualquier caso, no le hará daño comenzar a usar el lenguaje arduino y el IDE arduino durante unos días para familiarizarse con el hardware arduino y luego pasar a C / C ++ con Eclipse para realmente desarrollar su proyecto.


Gracias por tus pensamientos. Usaré el IDE de Arduino para aprender a controlar todas las diferentes piezas de hardware, como sensores y pantallas LCD, etc. Luego pasaré a C ++ para crear el software para el octocopter. ¿Conoces un libro bueno y corto para personas que conocen otros idiomas? El "problema" con muchos libros que he encontrado es que incluyen tanto que no necesito porque estoy en un pequeño microcontrolador Atmel en lugar de una computadora UI.
Amigo de Kim

1
Hay un buen libro "C Programación para Arduino" de Julien Bayle que es útil. Es un lenguaje C no C ++, pero debería ayudarlo a comprender la base.
fenix688

Esa es una buena solicitud: un libro corto y bueno con los conceptos básicos de C ++ para programadores de otros lenguajes. Lo siento, no puedo dar ninguna recomendación, no conozco ninguna buena. De hecho, escribí un libro, con un enfoque práctico (desarrollar un videojuego) para mis alumnos, pero es solo en español. Para un buen y práctico libro de C ++, recomendaría Deitel y Deitel Cómo programar C ++, puede omitir muchos capítulos avanzados.
drodri

1
C ++ admite características OO, el lenguaje C no.
Chris O

1
@FriendofKim No es exactamente lo que quise decir (aunque técnicamente podría hacerlo, el Due es lo suficientemente rápido como para admitir una solución de software para comunicación en serie no megabit, y tiene 5 U (S) ARTS en total, mientras que las bibliotecas Arduino solo proporcionan 4 de pero la placa Due no proporciona pines para uno de los USART de todos modos); las bibliotecas Arduino configuran los USART para usar el modo asíncrono, pero necesitaba sincronizar a hasta 6Mbps (y tuve que usar el modo SPI ya que la entrada tenía que ser tratada como un flujo de bits sin procesar para que no hubiera bits de parada / etc.), lo que también implicaba modificando la configuración predeterminada del controlador PIO.
JAB

48

En teoría ...
No hay realmente un lenguaje Arduino como tal. Realmente es solo C ++ con algunas bibliotecas específicas de dominio. Estos agregan varias características, como funciones a las que puede llamar para controlar el hardware. Si no tuviera esas funciones, necesitaría jugar directamente con registros especiales para controlar todo. Así es como generalmente se realiza la programación integrada. Es rápido, pero puede ser bastante difícil de aprender y comprender.

Además de las funciones, las bibliotecas agregan nombres alternativos para algunos tipos. Por ejemplo, booleany byteno están en el estándar C ++. Sin embargo, son directamente equivalentes a booly unsigned char.

Todas estas cosas significan que probablemente pueda portar código general de C ++ directamente a Arduino sin dificultad. Sin embargo, volver al otro lado puede requerir alguna edición menor.

En la práctica ...
Habiendo dicho todo eso, programar para Arduino no es exactamente lo mismo que la programación general de C ++. Sin embargo, muchas de las diferencias son comunes a toda la programación integrada (como memoria limitada y potencia de procesamiento).

También vale la pena señalar que si está utilizando el IDE oficial de Arduino, entonces hay todo tipo de peculiaridades y limitaciones molestas sobre cómo configurar su código. Hay soluciones en todos los casos (que yo sepa), pero a veces son bastante frustrantes.

Para una flexibilidad total, use un IDE de terceros (como Eclipse) con un complemento para admitir Arduino. Eso debería darle todas las ventajas de C ++, junto con las bibliotecas Arduino.


25

¿Cuáles son las ventajas de C ++ frente al lenguaje Arduino cuando se usa Arduino? Tengo experiencia en lenguajes preprocesados ​​como JavaScript, PHP, y he manipulado lenguajes como Java y Visual Basic.

Primero, el compilador / IDE de Arduino acepta C y C ++ tal cual. De hecho, muchas de las bibliotecas están escritas en C ++. Gran parte del sistema subyacente no está orientado a objetos, pero podría estarlo.

Por lo tanto, "El lenguaje arduino" es C ++ o C.

C ++ no es basura recolectada. Gestiona variables en el alcance, si escribe:

int led = 13;

void blinkTimes(int value)
{
   int i;

   for(i=0;i<value;i++)
   {
      digitalWrite(led, HIGH);
      delay(1000);
      digitalWrite(led, LOW);
      delay(1000);
   }
}

Entonces lo encontrarás ledy ino crecerás ni perderás, sin importar cuántas veces llames blinkTimes.

Si ifuera una clase, se eliminaría de manera similar una vez que finalizara la función. Por lo tanto, mientras no esté utilizando newfunciones de asignación de memoria similares para crear nuevos objetos, no tendrá que preocuparse por las fugas.

Es posible que aún quede sin memoria, si crea enormes clases y utiliza una gran cantidad de ellos en funciones anidadas, pero en general no van a tener problemas hasta que empezar a tratar con newy freefunciones.

Si está usando new, entonces deberá llamar deleteen el momento apropiado. C ++, y por extensión Arduino, no tiene recolección automática de basura, debe administrar explícitamente su propia memoria.


1
De acuerdo, si los objetos instanciados (con nuevos) no se recolectan basura, tendré que aprender eso también. Supongo que cualquier libro sobre C ++ cubrirá eso. Gracias por una buena respuesta!
Amigo de Kim

14

El lenguaje Arduino es C ++, pero es muy diferente de la mayoría de las variedades C ++. El lenguaje Arduino tiene mucha abstracción incorporada, especialmente en las interfaces de hardware, lo que lo hace muy fácil de usar. Si tienes experiencia en Java, C y C ++ deberían ser muy similares.

Las principales diferencias entre Arduino y C ++ están en el almacenamiento de memoria. Por lo general, una computadora moderna tiene más de 2GB de RAM, mientras que Arduino Uno tiene 2kB (1 millón de veces menos). El Arduino también usa instrucciones de 8 bits en lugar de las de 32 bits que usa una computadora. Esto afectará principalmente la cantidad de información que puede almacenar en una variable.

Si eres nuevo en el mundo de Arduino, deberías buscar un tutorial, ya que hay muchos buenos por ahí.


Mencionas la memoria. Tengo el Due que tiene 96 KB de RAM. Pero lo último que quiero es que el helicóptero se bloquee debido a una pérdida de memoria (tener una cámara muy costosa montada en el helicóptero).
Amigo de Kim

¿La memoria en C ++ se maneja automáticamente (como el recolector de basura en Java) si no se especifica lo contrario?
Amigo de Kim

2
El estándar C ++ no garantiza el tamaño de la memoria: c ++ ya se ejecuta en hardware embebido sin modificaciones.
Michael Thorpe

2
Sin embargo, está describiendo diferencias entre las plataformas de hardware, no C ++.
Cybergibbons

55
@FriendofKim En C ++, hay dos formas diferentes de instanciar variables / objetos. Si los instancia localmente (p int blah = 5;. Ej. ), Se destruirán automáticamente cuando salgan del alcance (es decir, al final del bucle o función). Sin embargo, si los instancia en el montón (p int *blah = new int(5);. Ej. ), Debe liberarlos usted mismo. Sin embargo, generalmente no es aconsejable utilizar datos de montón en la programación integrada.
Peter Bloomfield

14

--- Actualización 170412
Hace tres años escribí mi respuesta original desde la perspectiva de que existe un "Arduino C ++" distinto. El lenguaje utilizado en el IDE es C ++ estándar, porque lo implementa el compilador GNU C ++. Las diferencias "aparentes" se deslizan porque el IDE hará un preprocesamiento para ayudar a los recién llegados al idioma a evitar un par de 'gotcha's', completando algunos #includes, f / ex. Pero puede, y lo hago, escribir C ++ correcto y obtener exactamente lo que espera obtener.
--- finaliza la actualización

Limite su uso de las características del lenguaje C ++ a aquellos cuya implementación comprenda completamente. Hay algunas características que se compilan en un código que requiere más recursos de lo que es obvio al leer el código fuente. La lista .lss (fuente y ensamblaje combinados) opcionalmente generados puede darle una buena idea de lo que hizo el compilador de C ++ cuando no estaba buscando.

A su pregunta sobre la memoria: C ++ no recolecta basura. Los lenguajes basados ​​en pilas como C y C ++ asignan almacenamiento temporal en la pila para variables automáticas en la entrada de la función, que luego se libera cuando la función regresa, pero esto no es una verdadera recolección de basura. Los objetos creados en la memoria de almacenamiento dinámico o global viven hasta que los elimine explícitamente. Asegúrese de saber dónde, cuándo y durante cuánto tiempo se crearán diferentes tipos de objetos. Realmente no quieres que tus objetos de codificación newy codificación deletesean involuntarios. Se construirán en la memoria de almacenamiento dinámico, fragmentándola y haciendo que crezca en la pila. Ahí es cuando su código, y su agradable 'helicóptero', se bloqueará.

C hace menos de que lo que puede hacer menos a ti. No es una mala elección. C con algunas de las características de C ++ puede ser una opción aún mejor, dado que elige las características adicionales con prudencia. C ++, si esas son sus dos opciones:

[Respuesta original] - C ++ es un lenguaje estandarizado. Se implementa ampliamente en muchos entornos, incluidos los sistemas integrados y, por lo tanto, se prueba más a fondo que el lenguaje muy parecido a C ++ que es "Arduino". Esto es especialmente importante para aplicaciones de misión crítica / seguridad crítica como la que está planeando. Código estrellado significa un helicóptero estrellado' e incluso si no hace daño a alguien, será romper su máquina costosa.

  • Siendo estándar, C ++ es portátil. ¿Necesita actualizar su procesador? Todo menos el código específico de silicio se transferirá al nuevo. ¿Necesita cambiar su conjunto de herramientas, sistema de desarrollo, sistema operativo host? C ++ será compatible en todas partes. Aunque Arduino IDE se ejecutará en cualquier lugar donde Java sea compatible, es la única herramienta que usa Arduino C ++ y es una herramienta muy limitada. Si desea utilizar Eclipse, las herramientas AVR, ir descalzo en la línea de comandos, desarrollar dentro de Emacs o cualquier otro entorno que prefiera, se admitirá C ++ estándar.

  • El IDE de Arduino hace cosas a sus espaldas, específicamente, #incluye archivos .h cuando cree que los necesita. Incluso si es correcto, realmente desea escribir, o al menos ver y comprender, todo lo que el compilador va a ver. Los lenguajes de programación no están hechos para computadoras (las computadoras comen pedacitos para el desayuno); están hechos para personas, específicamente las personas que lo siguen en el proyecto, los más importantes de los cuales pueden ser ... ¡usted! cuando 6 meses después de escribir un módulo, tiene que volver para mejorarlo, o más probablemente, arreglarlo. Realmente quieres poder ver todo lo que ve el compilador.


2
Esta es una muy buena respuesta. Parece claro que te gusta C ++ y que a mí también me gustaría. ... Pero en serio, saltaré directamente a C ++ tan pronto como haya entendido cómo funciona la "comunicación" con los diferentes sensores, etc.
Amigo de Kim

¿Conoces algún buen libro sobre el tema? (Adecuado para mí, que he estado programando durante años en otros idiomas y solo necesito la "parte incrustada" de C ++.)
Amigo de Kim

¿Crees que Accelerated C ++ es un buen libro para esto?
Amigo de Kim

2
Desearía poder ayudarte con el libro 'correcto', pero llegué a C ++ con una gran cantidad de C detrás de mí y The C Programming Language de Kernighan & Ritchie sigue siendo mi libro de referencia (juego de palabras malo) para cualquier cosa que no sea explícitamente C ++ , y Ellis & Stroustrup's The Annotated C ++ Reference Manual for C ++. Pero para escribir en el hardware, hará bien en mirar algunas de las bibliotecas de dispositivos aportadas por los usuarios en Arduino.cc . Comience ajustando los puertos de E / S con las funciones pinMode (), digitalWrite () y digitalRead (), luego sus equivalentes de E / S analógicas y, finalmente, ...
JRobert

1
... planee escribir directamente en registros de E / S para mejorar la velocidad y el espacio de memoria. Programas como blinky.cpp y hello.cpp son buenos lugares para comenzar a jugar con el hardware. Agregue un multímetro simple y unos pocos LED con las resistencias limitantes de corriente correctas soldadas permanentemente a una pata y debería poder ver resultados reales, si son simples, de sus esfuerzos. Después de eso, lea las hojas de datos de cualquier hardware que le interese para saber qué señales puede leer / debe escribirles para que suenen. Los sensores de temperatura son fáciles de usar y no todos necesitan un registrador de refrigerador. ¡Que te diviertas!
JRobert

10

En mi experiencia, es mejor evitar nuevos y eliminar cuando se ejecuta en máquinas con memoria limitada.

  • La administración de memoria en sí usa un valioso programa y espacio RAM
  • Los vectores ISR se establecen en el tiempo de compilación. Es difícil (¿imposible?) Para una instancia de clase reclamar un ISR en tiempo de ejecución
  • En general, sabrá en el momento de la compilación qué instancias de clase necesita, por ejemplo, antirrebote de 3 botones, un controlador de pantalla y un controlador de pantalla de 2 líneas
  • La gestión de la memoria presenta retrasos desconocidos cuando usa nuevo o borrado.

Puede haber casos en los que esté justificado usar la construcción y destrucción de instancias dinámicas, pero sospecho que son raros.


Siendo completamente nuevo en C ++, tengo una pregunta de seguimiento con respecto a la ETS. ¿Es una mala idea usar la memoria inteligente? Si no, ¿cómo se puede agregar (Eclipse)? He configurado el compilador AVR y funciona bien.
Amigo de Kim

1
Todo lo que dices es correcto, pero no veo cómo es una respuesta a la pregunta de OP. newy también deleteestán disponibles en Arduino IDE.
jfpoilpret

No es una respuesta, sino información muy útil que realmente aprecio.
Amigo de Kim

8

Como se menciona en varias respuestas, si está programando un sistema embebido en general, debe evitar nuevos a menos que esté administrando su propio montón de memoria y realmente sepa cuáles serán los ciclos de vida de su objeto. La asignación estática o las variables de la pila son mucho más seguras. Dicho esto, un truco común para administrar cosas como los búferes de longitud variable asignados para la duración de una función es tener una variable automática (en la pila) que es un objeto que llama nuevo en su constructor, y luego coloca la eliminación en el destructor así que cuando el objeto sale del alcance, el búfer se vuelve a liberar en el montón. Una vez más, esto suele ser de uso limitado en pequeños micros, pero es un buen patrón para recordar.


6

Además de los comentarios anteriores, me gustaría enfatizar aún más los problemas con el funcionamiento de la RAM que tiene en las placas Arduino, particularmente con el Uno (y otros que comparten el mismo microcontrolador). Recientemente escribí un juego simple de Space Invaders que se ejecuta en una matriz de LED de 32x32 y repetidamente encontré problemas causados ​​por poca memoria.

El Uno solo tiene 2048 bytes de RAM. La biblioteca de mi matriz se hizo cargo de 3/4 de eso, dejándome con alrededor de 400 bytes para el juego. Como es mi intención "actualizar" el proyecto en algún momento para ejecutar múltiples juegos con la misma base de programa en el Due más poderoso, diseñé el código con principios OO y mucha herencia de clase. (La clase de juego fue heredada con actualizaciones virtuales y llamadas de sorteo, todas las entidades del juego fueron heredadas).

Me quedé sin memoria simplemente agregando a los invasores. Traté de ahorrar memoria haciendo un campo de bits de sus variables miembro, pero se agotó nuevamente al agregar los objetos de escudo. Después de un poco más de raspado salí corriendo agregando las bombas / balas. En este punto, rastreé el código y eliminé todas las etiquetas "virtuales" (todos mis prototipos de clase están construidos a partir de un fragmento de Visual Assist y los destructores son virtuales automáticamente). Esto redujo a la mitad el uso de mi memoria al instante, liberando lo suficiente como para poder completar el código.

Para resumir, el resultado final es el código C ++ que realmente no usa ninguna característica de C ++. Es posible que también se quede con C y sea muy consciente de su uso de memoria. No obtendrá ayuda si excede los 2 KB, especialmente si está utilizando una asignación dinámica, el código simplemente deja de funcionar y se queda rascándose la cabeza por un tiempo hasta que considere la posibilidad de un desbordamiento de memoria.

PD: las variables de campo de bits son malas. Muy mal. Además de agregar gastos generales de procesamiento, perdí la noción del número de veces que agregaría un nuevo estado al juego, pero el código no se ejecutaba y no podía entender por qué. Mi variable de estado no era lo suficientemente amplia como para contener el nuevo valor de estado, por lo que estaba obteniendo un estado inesperado.


4

El lenguaje Arduino es C ++ (aunque generalmente se implementa en un estilo más parecido a "C con clases", que en realidad es bastante común en el mundo de los microcontroladores de sistemas integrados). Fin de la historia. ¡Basta de que la gente piense que ya es un idioma diferente! Utiliza el compilador g ++.

Prueba:

Habilite la salida detallada durante la compilación en las Preferencias y cargue y aprenderá mucho solo leyendo esas líneas.

Aquí hay una idea adicional:

Mis propias palabras:

El código Arduino es C ++. Las funciones principales de Arduino son simplemente un conjunto de clases y bibliotecas de C ++ que puede usar. Está construido y compilado usando el compilador GNU gcc / g ++ . Sus funciones de configuración () y bucle () simplemente se colocan en la función main () obligatoria ( en realidad aquí, observe que el archivo es "main.cpp", que es un archivo fuente de C ++) automáticamente para usted y hay algo más preprocesamiento realizado para asegurarse de que sea un programa C ++ válido (por ejemplo, escaneo de todos los prototipos de funciones [también conocido como: declaraciones] para usted, de modo que pueda usar una función aunque su prototipo venga más tarde en su archivo .ino). Sin embargo, gran parte de Arduino está escrito en un "estilo C" y, por lo tanto, requiere # extern "C" {}llaves para evitar que C ++la función de "cambio de nombre" (también conocida como "decoración de nombre / decoración de nombre" ) llama a funciones C implementadas por AVR-libc , que es la implementación C para el ATmega328 y otros microcontroladores de arquitectura AVR .

Las palabras de Arduino:

" ¿Puedo programar la placa Arduino en C?
De hecho, ya lo eres; el lenguaje Arduino es simplemente un conjunto de funciones C / C ++ que se pueden invocar desde tu código. Tu boceto sufre cambios menores (por ejemplo, generación automática de prototipos de funciones) y luego se pasa directamente a un compilador de C / C ++ (avr-g ++). Todas las construcciones estándar de C y C ++ compatibles con avr-g ++ deberían funcionar en Arduino. Para obtener más detalles, consulte la página sobre el proceso de compilación de Arduino ".

Fuente: https://www.arduino.cc/en/Main/FAQ#toc13

¿Cuándo usar la biblioteca Arduino frente a C o C ++ puro?

Por lo tanto, use el lenguaje Arduino donde simplifica las cosas y escriba sus propias funciones donde necesite más especialización. Sin embargo, recomiendo alejarse del IDE rápidamente para escribir código, solo úselo para compilar. Establezca las preferencias de IDE para usar "Editor externo". Luego use un editor de código fuente profesional / IDE como Sublime Text 3 , Atom , Visual Studio Code o Eclipse CDT para escribir su código. Luego puede volver a hacer clic en el IDE de Arduino para compilar y cargar. Si opta por Eclipse, hay formas de hacerlo en Eclipse (vea las otras respuestas aquí, y vea el artículo de Eclipse de Arduino ) aquí, así que considere usar esas técnicas también.