Codice Arduino C ++: puoi usare funzioni virtuali ed eccezioni?
-
19-08-2019 - |
Domanda
Seguendo questo commento dalla domanda Scrivere firmware: assembly o alto livello? :
Quando si compila il codice C ++ per la piattaforma Arduino , è possibile utilizzare funzioni virtuali, eccezioni, ecc.? O vorresti (devi) usare un sottoinsieme di C ++ (come descritto in il commento )?
Qualche altro avvertimento durante la programmazione per la piattaforma Arduino?
Soluzione
L'ambiente Arduino utilizza la versione AVR della toolchain GCC. Il codice è compilato come C ++, quindi puoi usare le classi. Sono possibili funzioni virtuali; i vtables verranno archiviati nella sezione .data e avranno gli indirizzi corretti. In effetti, la classe Print base utilizza funzioni virtuali per adattare i vari "print" metodi per i diversi tipi di output.
Le eccezioni non sono supportate per motivi di spazio del codice. L'ambiente Arduino passa " -fno-eccezioni " alla riga di comando del compilatore. Vedi la fonte per la verifica di questo .
I modelli sono supportati. Ad esempio, questa tecnica dell'operatore di inserimento del flusso gratuito funziona perfettamente utilizzando un modello semplice e un operatore in linea.
Altri suggerimenti
Il software Arduino utilizza avr-gcc per compilare schizzi. Le seguenti limitazioni sono state ottenute dalle FAQ avrlibc (Posso usare C ++ su l'AVR?) :
supportati
- Funzioni virtuali
- Costruttori e distruttori (compresi quelli globali)
Non supportato
- Funzioni standard C ++, classi e classi modello (ma vedi questa porta di uClibc ++ per Arduino )
- operatori
new
edelete
(tentando di usarli provocherà il linker a lamentarsi di riferimenti esterni non definiti). Ciò significa che gli oggetti possono essere creati solo nello stack. Se è richiesta l'allocazione dinamica della memoria, deve essere implementata usandomalloc ()
efree ()
diC
tipi - Eccezioni. Poiché le eccezioni sono abilitate per impostazione predefinita nel frontend C ++, devono essere esplicitamente disattivate utilizzando
-fno-exceptions
nelle opzioni del compilatore. Questo viene fatto automaticamente dall'IDE di Arduino quando avviaavr-gcc
Altri problemi
- Alcuni dei file di inclusione forniti non sono sicuri per C ++, ovvero devono essere racchiusi in
extern & C; quot; {. . . }
L'usabilità di una funzionalità non è limitata dalla piattaforma ma piuttosto dal compilatore che si sta utilizzando.
Vorrei controllare la documentazione del compilatore su quali funzionalità linguistiche sono supportate.
Comeau computing ha un compilatore da C ++ a C che supporta tutte le funzionalità C ++. Non solo funzioni virtuali o eccezioni, ma anche esportazione. Dovresti chiamare Comeau per farlo indirizzare alla lingua Arduino, ma non dovrebbe essere troppo difficile.
La documentazione dice:
Il linguaggio Arduino si basa su C / C ++ e supporta tutti i costrutti C standard e alcune funzionalità C ++.
Non dice nulla sulle funzioni virtuali che posso trovare.
Ho provato un programma semplice e si compila bene. Non l'ho ancora testato su hardware Arduino.
EDIT: anche io non ho testato eccezioni.
Ho usato g ++ con questo Makefile e ho iniziato con questo codice . Il C ++ spreca spazio. Ma i protothread sono troppo belli per non usarli.