C ++ vs. The Arduino Language?


81

Quali sono i vantaggi di ciascuna lingua quando si utilizza Arduino?

Sto pensando che questa sia una buona domanda generale, ma aggiungerò un po 'del perché sto chiedendo se qualcuno vuole darmi un suggerimento.

Ho esperienza in linguaggi preelaborati come JavaScript, PHP e ho armeggiato con linguaggi come Java e Visual Basic. In altre parole, conosco le tecniche di programmazione e l'orientamento agli oggetti sia classico che prototipo, ma nulla di comunicare direttamente con l'hardware.

Sto realizzando un octocopter e sto pensando che un approccio orientato agli oggetti sarà il più semplice. (Il software avrà moltissime funzionalità ...) Tuttavia non ho mai scritto in C ++.

Dal momento che questo è un sito di domande e risposte che dovrebbe aiutare gli altri, solo la domanda generale presentata all'inizio è di grande importanza, ma apprezzerei qualsiasi commento sulla mia situazione.


16
Evita l'IDE di Arduino in quanto non merita il suo nome IDE, è anche un editor molto scarso: può essere buono per i principianti e gli schizzi semplici ma si dovrebbe andare rapidamente a qualcosa di meglio.
jfpoilpret,

4
Questa è una scomposizione abbastanza concisa di ciò che si intende con (e che cosa in realtà è sotto il cofano) "Arduino Programming Language".
AdjunctProfessorFalcon,

10
C++ vs. The Arduino Language?- Il "linguaggio Arduino" è C ++. C'è un po 'di pre-elaborazione che ti salva facendo prototipi di funzioni, ma sicuramente è C ++.
Nick Gammon

2
Non esiste il linguaggio arduino. È semplicemente una biblioteca.
Overdrivr

2
Non così legato alla domanda quanto ai commenti: Atmel Studio è gratuito e IMHO è meglio di Visual Studio per la programmazione Arduino. Supporta anche il plug-in Visual Micro, anche se non è affatto necessario per la programmazione e il debug di arduinos.
cyberponk,

Risposte:


55

La mia esperienza personale come professore (programmazione, meccatronica) è che se hai precedenti esperienze di programmazione e sei a conoscenza di concetti come OOP, è meglio scegliere C / C ++. Il linguaggio arduino è davvero ottimo per i principianti, ma presenta alcune limitazioni (ad es. Devi avere tutti i tuoi file nella stessa cartella). Ed è fondamentalmente una semplificazione di C / C ++ (puoi praticamente copiare e incollare il codice arduino in un file C / C ++ e funzionerà). Inoltre ha senso che puoi usare un IDE ben noto come eclissi:

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

Inizialmente è richiesto un po 'più di installazione e configurazione del tuo ambiente di sviluppo, ma IMHO ne vale la pena per i programmatori con esperienza in qualsiasi altra lingua.

In ogni caso, non ti farà male iniziare a utilizzare il linguaggio arduino e l'IDE arduino per alcuni giorni per familiarizzare con l'hardware arduino e quindi passare a C / C ++ con Eclipse per sviluppare davvero il tuo progetto.


Grazie per i tuoi pensieri Userò l'IDE di Arduino per imparare a controllare tutti i diversi componenti hardware come sensori, schermi LCD ecc. Poi passerò al C ++ per creare il software per l'octocopter. Conosci un buon e breve libro per persone che conoscono altre lingue? Il "problema" con molti libri che ho scoperto è che includono così tanto che non mi serve perché sono su un piccolo microcontrollore Atmel piuttosto che su un computer UI.
Amico di Kim,

1
C'è un bel libro "C Programming for Arduino" di Julien Bayle che è utile. Non è un linguaggio C + C ++ ma dovrebbe aiutarti a capirne le basi.
fenix688

Questa è una buona richiesta: un libro breve e buono con le basi del C ++ per programmatori di altre lingue. Mi dispiace non posso dare alcun consiglio, non ne sono a conoscenza. In effetti, ho scritto un libro, con un focus pratico (sviluppare un videogioco) per i miei studenti, ma è solo in spagnolo. Per un libro C ++ valido e pratico, consiglierei Deitel & Deitel Come programmare C ++, potresti saltare molti capitoli avanzati.
Drodri,

1
C ++ supporta le funzionalità OO, il linguaggio C no.
Chris O

1
@FriendofKim Non è esattamente quello che intendevo (sebbene tecnicamente tu potessi, Due è abbastanza veloce da supportare una soluzione software per la comunicazione seriale non megabit, e ha 5 U (S) in totale mentre le librerie Arduino forniscono solo 4 di ma iirc la scheda Due non fornisce comunque i pin per uno degli USART); le librerie di Arduino configurano gli USART per usare la modalità asincrona, ma avevo bisogno di sincrona fino a 6 Mbps (e dovevo usare la modalità SPI poiché l'input doveva essere trattato come un flusso di bit grezzo quindi nessun bit di stop / ecc.), che comportava anche modifica della configurazione predefinita del controller PIO.
JAB

48

In teoria ...
Non esiste davvero una lingua Arduino in quanto tale. È davvero solo C ++ con alcune librerie specifiche del dominio. Questi aggiungono varie funzioni, come le funzioni che puoi chiamare per controllare l'hardware. Se non avessi quelle funzioni, avresti bisogno di armeggiare direttamente con registri speciali per controllare tutto. Ecco come viene solitamente eseguita la programmazione integrata. È veloce, ma può essere abbastanza difficile da imparare e capire.

Oltre alle funzioni, le librerie aggiungono nomi alternativi per alcuni tipi. Ad esempio, booleane bytenon sono nello standard C ++. Tuttavia, sono direttamente equivalenti a boole unsigned char.

Tutte queste cose significano che puoi probabilmente portare il codice C ++ generale direttamente su Arduino senza difficoltà. Tuttavia, tornare indietro potrebbe richiedere alcune modifiche minori.

In pratica ...
Detto questo, la programmazione per Arduino non è esattamente la stessa della programmazione C ++ generale. Molte differenze sono comuni a tutta la programmazione integrata (come memoria limitata e potenza di elaborazione).

Vale anche la pena notare che se si utilizza l'IDE Arduino ufficiale, ci sono tutti i tipi di fastidiose stranezze e limitazioni su come impostare il codice. Ci sono soluzioni alternative in tutti i casi (per quanto ne so), ma a volte sono piuttosto frustranti.

Per la massima flessibilità, utilizzare un IDE di terze parti (come Eclipse) con un plug-in per supportare Arduino. Questo dovrebbe darti tutti i vantaggi del C ++, insieme alle librerie Arduino.


25

Quali sono i vantaggi del C ++ rispetto al linguaggio Arduino quando si utilizza Arduino? Ho esperienza in linguaggi preelaborati come JavaScript, PHP e ho armeggiato con linguaggi come Java e Visual Basic.

Innanzitutto, il compilatore / IDE di Arduino accetta C e C ++ così com'è. In effetti molte librerie sono scritte in C ++. Gran parte del sistema sottostante non è orientato agli oggetti, ma potrebbe esserlo.

Pertanto, "Il linguaggio arduino" è C ++ o C.

C ++ non è garbage collection. Gestisce le variabili nell'ambito - se scrivi:

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);
   }
}

Quindi lo troverai lede inon crescere o perdere, indipendentemente da quante volte chiami blinkTimes.

Se ifosse una classe, verrebbe eliminata allo stesso modo una volta terminata la funzione. Quindi, fintanto che non stai utilizzando newo funzioni simili di allocazione della memoria per creare nuovi oggetti, non dovrai preoccuparti di perdite.

Potresti ancora rimanere senza memoria, se crei enormi classi e ne usi molte in funzioni profondamente annidate, ma in generale non avrai problemi fino a quando non inizi a occuparti di newe freefunzioni.

Se stai usando new, dovrai chiamare deleteal momento opportuno. C ++, e per estensione Arduino, non ha una garbage collection automatica, devi gestire esplicitamente la tua memoria.


1
Ok, se gli oggetti istanziati (con nuovi) non vengono raccolti, dovrò imparare anche questo. Suppongo che qualsiasi libro su C ++ lo tratterà. Grazie per una buona risposta!
Amico di Kim,

14

Il linguaggio Arduino è C ++, ma è molto diverso dalla maggior parte delle varietà C ++. Il linguaggio Arduino ha molte astrazioni integrate, specialmente nelle interfacce hardware, che lo rende molto semplice da usare. Se hai uno sfondo in Java, C e C ++ dovrebbero essere molto simili.

Le principali differenze tra Arduino e C ++ sono nella memoria. Di solito un computer moderno ha più di 2 GB di RAM, mentre Arduino Uno ha 2 KB (1 milione di volte in meno). Arduino utilizza anche istruzioni a 8 bit invece di quelle a 32 bit utilizzate da un computer. Ciò influirà principalmente sulla quantità di informazioni che è possibile archiviare in una variabile.

Se sei molto nuovo nel mondo di Arduino, dovresti cercare un tutorial, poiché ce ne sono molti buoni là fuori.


Hai citato la memoria. Ho il Due che ha 96 KB di RAM. Ma l'ultima cosa che voglio è che l'elicottero si blocchi a causa di una perdita di memoria (avendo una videocamera molto costosa montata sull'elicottero).
Amico di Kim,

La memoria in C ++ viene gestita automaticamente (come il Garbage Collector in Java) se non diversamente specificato?
Amico di Kim,

2
Lo standard C ++ non fornisce garanzie circa le dimensioni della memoria: c ++ è già in esecuzione su hardware incorporato senza modifiche.
Michael Thorpe,

2
Stai descrivendo le differenze tra le piattaforme hardware, non C ++ lì.
Cybergibbons

5
@FriendofKim In C ++, ci sono due modi diversi di istanziare variabili / oggetti. Se li istanziate localmente (ad es. int blah = 5;), Verranno distrutti automaticamente quando escono dall'ambito (ovvero alla fine del loop o della funzione). Tuttavia, se li si crea un'istanza nel mucchio (ad esempio int *blah = new int(5);), allora è necessario rilasciare voi stessi. Tuttavia, di solito non è saggio utilizzare i dati heap nella programmazione integrata.
Peter Bloomfield,

14

--- Aggiornamento 170412
Ho scritto la mia risposta originale tre anni fa dal punto di vista dell'esistente "Arduino C ++". Il linguaggio utilizzato nell'IDE è C ++ standard, poiché è implementato dal compilatore GNU C ++. Differenze "apparenti" si insinuano perché l'IDE eseguirà alcune preelaborazioni per aiutare i nuovi arrivati ​​nella lingua a evitare un paio di "gotcha", compilando alcuni #includes, f / ex. Ma puoi - e lo faccio - scrivere il C ++ corretto e ottenere esattamente quello che ti aspetti di ottenere.
--- fine aggiornamento

Limitare l'uso delle funzionalità del linguaggio C ++ a coloro di cui si comprende appieno l'implementazione. Ci sono alcune funzionalità che si compilano in un codice più dispendioso in termini di risorse di quanto sia ovvio dalla lettura del codice sorgente. L'elenco .lss (sorgente unito e assembly) generato facoltativamente può darti alcune buone informazioni su cosa ha fatto il compilatore C ++ quando non lo cercavi.

Alla tua domanda sulla memoria: C ++ non è garbage-collection. I linguaggi basati su stack come C e C ++ allocano l'archiviazione temporanea nello stack per le variabili automatiche all'ingresso della funzione, che viene quindi rilasciata quando la funzione ritorna, ma questa non è vera garbage collection. Gli oggetti creati nella memoria heap o globale rimangono attivi fino a quando non li elimini esplicitamente. Assicurati di sapere dove, quando e per quanto tempo verranno creati diversi tipi di oggetti. Non vuoi davvero che i tuoi oggetti code new-ing e delete-ing siano volenti o nolenti. Saranno costruiti nella memoria dell'heap, frammentandola e facendola crescere nella pila. Questo è quando il tuo codice - e il tuo bel 'elicottero' andrà in crash.

C fa meno per te, quindi può fare di meno per te. Non è una cattiva scelta. C con alcune delle funzionalità di C ++ può essere una scelta ancora migliore, dato che scegli le funzionalità extra con giudizio.C ++, se queste sono le tue due scelte:

[Risposta originale] - C ++ è un linguaggio standardizzato. È ampiamente utilizzato in molti ambienti, inclusi i sistemi embedded, e quindi è stato testato in modo più approfondito rispetto al linguaggio molto simile al C ++ che è "Arduino". Ciò è particolarmente importante per le applicazioni mission-critical / safety-critical come quelle che stai pianificando. Codice Crashed significa un elicottero si è schiantato' e, anche se non fa male qualcuno, sarà rompere la vostra macchina costosa.

  • Essendo standard, C ++ è portatile. Devi aggiornare il tuo processore? Tutto tranne il codice specifico per il silicio verrà trasferito a quello nuovo. Devi modificare il set di strumenti, il sistema di sviluppo, il sistema operativo host? Il C ++ sarà supportato ovunque. Sebbene Arduino IDE verrà eseguito ovunque sia supportato Java, è l'unico strumento che utilizza Arduino C ++ ed è uno strumento molto limitato. Se si desidera utilizzare Eclipse, gli strumenti AVR, andare a piedi nudi sulla riga di comando, sviluppare all'interno di Emacs o qualsiasi altro ambiente preferito, sarà supportato lo standard C ++.

  • L'IDE di Arduino fa le cose alle tue spalle - in particolare, include i file .h quando pensa di averne bisogno. Anche se è corretto, vuoi davvero scrivere, o almeno vedere e capire, tutto ciò che il compilatore vedrà. I linguaggi di programmazione non sono fatti per i computer (i computer mangiano pezzi per colazione); sono fatti per le persone, in particolare le persone che ti seguono nel progetto, il più importante dei quali potresti essere ... tu !, quando 6 mesi dopo aver scritto un modulo, devi tornare per migliorarlo, o altro probabilmente, aggiustalo. Vuoi davvero essere in grado di vedere tutto ciò che vede il compilatore.


2
Questa è davvero una buona risposta. Sembra chiaro che ti piace il C ++ e che anche a me dovrebbe piacere! ... Ma seriamente, passerò direttamente al C ++ non appena avrò capito come funziona la "comunicazione" con i diversi sensori ecc.
Amico di Kim,

Conosci qualche buon libro sull'argomento? (Adatto per me che ho programmato per anni in altre lingue, e ho solo bisogno della "parte incorporata" di C ++.)
Amico di Kim

Pensi che il C ++ accelerato sia un buon libro per questo?
Amico di Kim,

2
Vorrei poterti aiutare con il libro "giusto", ma sono venuto in C ++ con un sacco di C dietro di me e The C Programming Language di Kernighan & Ritchie è ancora il mio libro preferito (brutto gioco di parole) per qualsiasi cosa non esplicitamente C ++ e The Annotated C ++ Reference Manual for Ellis & Stroustrup per C ++. Ma per scrivere su hardware, farai bene a guardare alcune delle librerie di dispositivi fornite dagli utenti su Arduino.cc . Inizia ottimizzando le porte I / O con le funzioni pinMode (), digitalWrite () e digitalRead (), quindi le loro controparti analogiche di I / O e infine ...
JRobert

1
... pianifica di scrivere direttamente nei registri I / O per migliorare la velocità e lo spazio di memoria. Programmi come blinky.cpp e hello.cpp sono buoni posti per iniziare a scherzare con l'hardware. Aggiungi un semplice multimetro e alcuni LED con i giusti resistori limitatori di corrente saldati permanentemente su una gamba e dovresti essere in grado di vedere risultati reali, seppure semplici, dai tuoi sforzi. Successivamente, leggi le schede tecniche di qualsiasi hardware che ti interessa per sapere quali segnali puoi leggere / devi scrivere loro per farli suonare. I sensori di temperatura sono facili da usare e non tutti hanno bisogno di un logger per il frigo? Divertiti!
JRobert

10

Nella mia esperienza, è meglio evitare nuovi ed eliminare quando si esegue su macchine con memoria limitata.

  • La stessa gestione della memoria utilizza un prezioso programma e spazio RAM
  • I vettori ISR ​​sono impostati in fase di compilazione. È difficile (impossibile?) Per un'istanza di classe richiedere un ISR in fase di esecuzione
  • Generalmente saprai al momento della compilazione di quali istanze di classe hai bisogno, ad esempio debouncer a 3 pulsanti, un driver di visualizzazione e un driver di visualizzazione a 2 righe
  • La gestione della memoria introduce ritardi sconosciuti quando si utilizza nuovo o elimina.

Ci possono essere casi in cui è giustificato usare la costruzione e la distruzione di istanze dinamiche, ma sospetto che siano rare.


Essendo completamente nuovo in C ++, ho una domanda di follow-up riguardante lo STD. È una cattiva idea memoria saggia usarlo? In caso contrario, come può essere aggiunto (Eclipse)? Ho installato il compilatore AVR e funziona bene.
Amico di Kim,

1
Tutto quello che dici è corretto ma non vedo come questa sia una risposta alla domanda OP. newe deletesono disponibili anche in IDE Arduino.
jfpoilpret

Non è una risposta, ma informazioni molto utili che apprezzo molto.
Amico di Kim,

8

Come accennato in diverse risposte, se si sta programmando un sistema embedded in generale, è necessario evitarne di nuovi a meno che non si gestisca il proprio mucchio di memoria e si sappia davvero quali saranno i cicli di vita degli oggetti. L'allocazione statica o le variabili dello stack sono molto più sicure. Detto questo, un trucco comune per gestire cose come i buffer di lunghezza variabile allocati per la durata di una funzione è avere una variabile automatica (nello stack) che è un oggetto che chiama nuovo nel suo costruttore, e quindi inserire l' eliminazione nel distruttore quindi quando l'oggetto esce dall'ambito, il buffer viene rilasciato nuovamente nell'heap. Ancora una volta, questo è di solito un uso limitato in piccoli micro, ma è un bel motivo da ricordare.


6

Oltre ai commenti sopra, vorrei sottolineare ulteriormente i problemi con il funzionamento della RAM che hai sulle schede Arduino, in particolare con Uno (e altri che condividono lo stesso microcontrollore). Di recente ho scritto un semplice gioco Space Invaders in esecuzione su una matrice LED 32x32 e ho riscontrato ripetutamente problemi causati da memoria insufficiente.

Uno ha solo 2048 byte di RAM. La libreria per la mia matrice ne ha occupati oltre 3/4, lasciandomi con circa 400 byte per il gioco. Poiché è mia intenzione "aggiornare" il progetto a un certo punto per eseguire più giochi con lo stesso programma sulla base del più potente Due, ho progettato il codice con i responsabili OO e molta eredità di classe. (La classe di gioco è stata ereditata con aggiornamento virtuale e richiama chiamate, le entità di gioco sono state tutte ereditate).

Ho praticamente esaurito la memoria aggiungendo semplicemente gli invasori. Ho provato a risparmiare memoria mettendo in campo bit le loro variabili membro ma sono finita di nuovo quando ho aggiunto gli oggetti shield. Dopo un po 'più di raschiatura sono finito aggiungendo bombe / proiettili. A questo punto ho analizzato il codice e rimosso tutti i tag "virtuali" (tutti i miei prototipi di classe sono creati da uno snippet di Visual Assist e i distruttori sono tutti automaticamente virtuali). Ciò ha dimezzato all'istante il mio utilizzo della memoria, liberandomi abbastanza da poter completare il codice.

Per farla breve, il risultato finale è il codice C ++ che in realtà non utilizza alcuna funzionalità C ++. Potresti anche attenerti a C ed essere molto consapevole dell'utilizzo della memoria. Non si ottiene alcun aiuto se si superano i 2 KB, in particolare se si utilizza un'allocazione dinamica, il codice smette di funzionare e viene lasciato a grattarsi la testa per un po 'fino a quando si considera la possibilità di overflow della memoria.

PS: le variabili di bit fielding sono errate. Molto brutto. Oltre ad aggiungere un overhead di elaborazione, ho perso traccia del numero di volte in cui avrei aggiunto un nuovo stato al gioco, ma il codice non sarebbe stato eseguito e non riuscivo a capire il perché. La mia variabile di stato non era abbastanza ampia da contenere il nuovo valore di stato, quindi stavo ottenendo uno stato inaspettato.


4

Il linguaggio Arduino è C ++ (sebbene di solito implementato in uno stile più simile a "C con classi", che in realtà è abbastanza comune nel mondo dei microcontrollori di sistemi embedded). Fine della storia. Basta con le persone che pensano che sia già una lingua diversa! Utilizza il compilatore g ++.

Prova:

Abilita l'output dettagliato durante la compilazione nelle Preferenze e carica e imparerai molto leggendo quelle righe.

Ecco alcune informazioni aggiuntive:

Parole mie:

Il codice Arduino è C ++. Le funzioni principali di Arduino sono semplicemente un insieme di classi e librerie C ++ che è possibile utilizzare. È costruito e compilato usando il compilatore GNU gcc / g ++ . Le funzioni setup () e loop () vengono semplicemente inserite nella funzione main () obbligatoria ( proprio qui in realtà - notate che il file è "main.cpp", che è un file sorgente C ++) automaticamente per voi e c'è qualche extra preelaborazione eseguita per assicurarsi che sia un programma C ++ valido (es: scansione per tutti i prototipi di funzione [aka: dichiarazioni] per te in modo che tu possa usare una funzione anche se il suo prototipo viene successivamente nel tuo file .ino). Gran parte di Arduino è scritto in uno "stile C", tuttavia, e quindi richiede le # extern "C" {}parentesi graffe attorno ad esso per impedire al C ++ diLa funzione "name-mangling" (nota anche come "decorazione del nome / decorazione del nome" ) chiama le funzioni C implementate da AVR-libc , che è l'implementazione C per ATmega328 e altri microcontrollori con architettura AVR .

Le parole di Arduino:

" Posso programmare la scheda Arduino in C?
In effetti, lo sei già; il linguaggio Arduino è semplicemente un insieme di funzioni C / C ++ che possono essere chiamate dal tuo codice. Il tuo schizzo subisce lievi modifiche (ad es. Generazione automatica di prototipi di funzioni) e quindi viene passato direttamente a un compilatore C / C ++ (avr-g ++). Tutti i costrutti standard C e C ++ supportati da avr-g ++ dovrebbero funzionare in Arduino. Per ulteriori dettagli, consultare la pagina sul processo di compilazione di Arduino . "

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

Quando utilizzare la libreria Arduino vs C o C ++ puro?

Quindi, usa il linguaggio Arduino dove semplifica le cose e scrivi le tue funzioni dove hai bisogno di maggiore specializzazione. Consiglio vivamente di allontanarsi dall'IDE rapidamente anche se per scrivere il codice - basta usarlo per la compilazione. Imposta le preferenze IDE per utilizzare "Editor esterno". Quindi utilizzare un editor / IDE di codice sorgente professionale come Sublime Text 3 , Atom , Visual Studio Code o Eclipse CDT per scrivere il codice. È quindi possibile fare clic di nuovo sull'IDE di Arduino per compilare e caricare. Se vai con Eclipse, ci sono modi per farlo in Eclipse (vedi le altre risposte qui, e vedi anche l' articolo Eclipse del parco giochi Arduino qui), quindi considera di usare anche queste tecniche.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.