Sarà possibile scrivere codice in C ++ per i microcontrollori PIC in futuro?


8

Sarà mai possibile usare C ++ per codificare PIC? Esistono limiti hardware che ci impediscono di utilizzare C ++? Quanto aumentano le dimensioni del file .hex generato e il tempo di esecuzione del programma quando utilizziamo C ++ anziché C? È praticamente possibile usare C ++ per i PIC attuali? Ci sono piani futuri o sviluppi in corso su questo?


Penso che sia possibile e rimarrà possibile, ma AFAIK non è raccomandato in quanto implementa strutture e funzioni di alto livello che non sono adatte per la programmazione fortemente correlata all'hardware
clabacchio


2
Poiché la risposta è "Sì, ci sono già compilatori C ++ già esistenti", lo lascerò in piedi, ma in futuro dovresti essere consapevole che le domande su Stack Exchange dovrebbero riguardare fatti verificabili, non supposizioni sul futuro.
Kevin Vermeer,

2
@clabacchio: non necessariamente vero. In C ++, paghi solo ciò che usi. Vedi la mia risposta su: electronics.stackexchange.com/questions/3027/…
Rocketmagnet

"PICs" è una generalizzazione inutile. Su alcuni PIC di fascia bassa (pensa 10F200) C è quasi impossibile da usare. Su alcuni PIC di fascia alta (serie 32MX) si dice che C ++ sia usato in questo momento, e non c'è certamente alcun motivo tecnico per cui non ci sia riuscito. Quindi una migliore messa a fuoco potrebbe dare una risposta più utilizzabile, proprio ora tutti stanno effettivamente rispondendo a una domanda diversa.
Wouter van Ooijen,

Risposte:


17

Sarà mai possibile usare C ++ per codificare PIC?

Sì, è possibile ora. Per dsPIC, c'è il compilatore C ++ IAR Systems (anche se è molto vecchio e non supportato).

Un'altra opzione è quella di utilizzare un convertitore da C ++ a C. Usando un passo pre-build, converti C ++ in C, quindi dai (cattiva) C al tuo normale compilatore C. Dai un'occhiata a LLVM o al compilatore C ++ di Comeau che lo fanno entrambi. Comeau's costa solo $ 50, ma probabilmente ci vorrà qualche sforzo per far funzionare correttamente l'intera toolchain e le librerie.

Esistono limiti hardware che ci impediscono di utilizzare C ++?

Risposta breve, no, non ci sono limiti hardware. Risposta lunga, C ++ sicuramente incoraggia l'uso di un heap e / o stack, con cui le MCU più piccole con RAM limitata avranno difficoltà.

Perché lottano con un heap / stack? Per due motivi: A) molte MCU hanno una RAM limitata, certamente non sufficiente per un heap e appena sufficiente per uno stack. B) molte MCU non gestiscono bene i puntatori, quindi l'uso delle variabili nello stack uccide davvero le prestazioni.

Quando le persone chiedono di usare C ++ su un MCU, trovo costruttivo confrontare C ++ con C. Le stesse stesse domande sono state (e ancora vengono) poste su C su un MCU. La gente era solita abbandonare l'idea. Un linguaggio di alto livello, su MCU RAM 256 byte ?? Impossibile. Ma ora sappiamo tutti che è possibile. Ho scritto C per un PIC12. Nessun problema. È possibile perché A) gli sviluppatori di software sanno che devono stare un po 'attenti: non usare malloc () ecc. E B) il compilatore è stato scritto appositamente per l'MCU. Il compilatore presterà inoltre particolare attenzione all'allocazione della memoria, non tenterà di creare un heap e potrebbe non creare uno stack. Alcuni compilatori C semplicemente non ti permetteranno di scrivere codice rientrante (ricorsivo) che richiede assolutamente uno stack.

Sapendo che è possibile scrivere C per un MCU, le stesse risposte si applicano alla domanda di scrivere C ++ su un MCU. Finché il compilatore comprende i limiti del dispositivo di destinazione e anche l'utente capisce la lingua, non c'è davvero alcun problema. In C ++, paghi solo ciò che usi. È perfettamente possibile scrivere C ++ (con oggetti e tutto) che produca l'output esatto che avresti ottenuto se avessi usato C.

Ora, i PIC32 possono certamente far fronte al C ++. Hanno fino a 64 KB di RAM e si basano sul core MIPS, che è un processore a 32 bit correttamente cresciuto. Può gestire puntatori, stack e PC. In effetti, ci sono PC basati sul MIPS (o almeno un tempo).

Purtroppo, ci sono così tanti malintesi riguardo al C ++. Persino programmatori di grande esperienza sembrano non avere idea di come funzioni la lingua. Vedi la mia risposta sul perché C ++ è adatto per le CPU integrate.

Quanto aumentano le dimensioni del file .hex generato e il tempo di esecuzione del programma quando utilizziamo C ++ anziché C?

Come ho detto, potrebbe non esserci alcuna differenza. Bjarne Stroustrup ha fatto un confronto tra un gruppo di compilatori C / C ++ per confrontare le prestazioni di tempo e spazio per una serie di operazioni. I risultati sono variati ampiamente. In alcuni casi, il C ++ è uscito più lento e più grande, in alcuni casi più lento e più piccolo, o più veloce e più grande, e ancora più veloce e più piccolo! Quindi, la risposta alla tua domanda è che dipende fortemente dal compilatore, ma in generale non deve fare alcuna differenza. Per maggiori dettagli, consultare il Rapporto tecnico sulle prestazioni C ++

Ci sono piani futuri o sviluppi in corso su questo?

Che non lo so. So che il compilatore Microchip C32 è open source e puoi scaricare il sorgente. So anche che qualcuno con cui ho lavorato ha effettivamente trovato alcune istruzioni online e sono riuscito a far compilare il codice C ++ al compilatore. Ma ha lasciato l'azienda prima che fosse in grado di installarmi con una catena di strumenti adeguata.


AGGIORNARE

Microchip ora ha un compilatore C ++ disponibile per la gamma PIC32 di MCU integrate.



dalla pagina Web IAR: "Prodotto legacy: IAR Embedded Workbench per dsPIC è un prodotto legacy. IAR Systems non lo aggiorna e non è possibile acquistare un contratto di supporto e aggiornamento per esso."
Jason S

So che i prodotti IAR sono fantastici, ma purtroppo molto costosi e sembra "vecchio". So che il C ++ è fattibile su qualsiasi piattaforma purché tu non usi tutte le funzionalità. Tuttavia, aggiunge la possibilità di un ulteriore livello di astrazione con le classi. Non utilizzo spesso modelli, né utilizzo allocazioni di memoria dinamica. Qualcuno conosce qualche altro concorrente per C ++ su PIC24 / PIC32?
Hans

Sì, scusa, non è stata davvero una grande scoperta. Vorrei aggiungere alcune altre cose alla mia risposta.
Rocketmagnet

1
Considererei C un concorrente di C ++ su un microcontrollore. Non riesco a pensare a qualcosa che vorrei fare in C ++ che non posso fare in C e ci sono meno chiamate di funzioni invisibili (costruttori, distruttori, ecc.). Rende il codice più deterministico e chiaro. Quali caratteristiche di C ++ sono un must che non possono essere confuse con C?
AngryEE,

1
Ci si potrebbe chiedere: "Quali caratteristiche di C sono un must che non possono essere confuse in ASM?" Rispondi, "Niente". I vantaggi sono una maggiore capacità per il progettista di specificare il progetto e far verificare al compilatore che l'implementazione sia corretta. Vedi la mia risposta electronics.stackexchange.com/questions/3027/… per un elenco dei vantaggi reali e immediati del C ++ in questo senso.
Rocketmagnet

5

Quanto aumentano le dimensioni del file .hex generato e il tempo di esecuzione del programma quando utilizziamo C ++ anziché C?

Dipende dalle funzionalità che usi. Se si utilizzano le funzionalità orientate agli oggetti di base (metodi class +), è probabile che abbiano effetti molto limitati (nomi di variabili / funzioni alterati più lunghi, quindi la tabella dei simboli probabilmente aumenterà leggermente). Neanche i template dovrebbero aggiungere molto con un buon compilatore.

Se impazzisci e inserisci cose come la Libreria dei modelli standard e utilizzi l'allocazione dinamica della memoria e le eccezioni, è probabile che ti imbatti in codice gonfio.


Basta un avvertimento per l'OP, fare molta attenzione all'allocazione della memoria su architetture di memoria di piccole dimensioni e sistemi embedded sempre in esecuzione.
Kenny,

potrebbe "-1" er commentare perché non è d'accordo?
Jason S

Non sono il -1er, ma i modelli sono una funzionalità che deve essere utilizzata con molta attenzione per evitare il gonfiamento del codice. Puoi facilmente finire con molte copie di un algoritmo quando uno sarebbe sufficiente.
Peter Green,

Per fare ciò dovresti effettivamente utilizzare il modello con diversi tipi di dati e una copia NON è sufficiente a meno che tu non stia usando un codice polimorfico che ha una classe base comune. (Nel qual caso vi è un costo di runtime.) I modelli non causano il rigonfiamento magico del codice, ma causano codice gonfiato solo quando li si utilizza con più tipi di dati quando non si è consapevoli delle conseguenze.
Jason S,


1

Generalizzando in qualche modo la tua domanda, ci sono processori ARM costruiti per il mercato embedded che contengono una MMU (unità di gestione della memoria). Le dimensioni e l'allocazione della memoria hanno reso le lingue come java e c ++ scarse scelte integrate. Man mano che i processori integrati continuano a diventare più veloci e più potenti e quando la memoria diventa sempre più densa ed economica, le scelte linguistiche disponibili per gli ingegneri embedded cambiano radicalmente. Un processore ARM a 32 bit 600MHz con MMU e una scheda Flash 64G è un ottimo candidato per applicazioni c ++. Se si adatta alla definizione del classico processore integrato è un altro problema.


0

Probabilmente sì .. ma non dovresti comunque ... C è il linguaggio di embedded e non ci sono vantaggi nell'usare C ++. O meglio, i vantaggi di C superano di gran lunga i vantaggi di C ++ per embedded. Non perdere tempo.

  • se sai come usare i puntatori a funzione ecc. Puoi scrivere codice come C ++, non ci sono problemi.

5
Mi permetto di dissentire. È possibile utilizzare molte funzionalità di C ++ (classi, modelli, sovraccarico dell'operatore, riferimenti) con costi di runtime minimi o nulli. Sì, puoi fare tutte queste cose in semplice C con costrutti hackish, ma è un problema per il tuo cervello e preferirei molto usare C ++. (ovviamente preferirei di gran lunga usare un linguaggio migliore, ma sceglierei un compilatore C ++ in un baleno rispetto al semplice C.)
Jason S

1
Classes = structs (senza metodi integrati, ma se lo desideri, puoi memorizzare un puntatore a funzione nella struttura e chiamarlo). Modelli = usi quelli ??? Sovraccarico dell'operatore = sì Vorrei anche quello. Riferimenti = puntatori, no? Con C almeno puoi usare solo le "caratteristiche" di C ++ che desideri senza preoccuparti della generazione di codice in eccesso o dover includere una grande libreria casuale solo per ottenere qualcosa da compilare.
AngryEE,

1
Mi permetto anche di dissentire.
Rocketmagnet,

3
Sì, i modelli sono un modo estremamente potente per generare codice affidabile e ad alte prestazioni. I riferimenti sono un puntatore più affidabile. Con C ++ paghi solo per le funzionalità che usi. Penso che tu abbia davvero bisogno di capire di più C ++.
Rocketmagnet

3
Non so cosa intendi con "C è il linguaggio di incorporato". Certo, è molto popolare. Stai dicendo che è la migliore lingua possibile? Sicuramente no.
Rocketmagnet
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.