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?

È stato utile?

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 e delete (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 usando malloc () e free () di C 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 avvia avr-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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top