Domanda

Sto scrivendo un programma, più specificamente un bootloader, per un sistema incorporato. Userò una libreria C per interagire con alcuni componenti hardware e ho la possibilità di scriverla in C o C ++. C'è qualche motivo per cui dovrei scegliere l'uno rispetto all'altro? Non ho bisogno delle funzionalità orientate agli oggetti di C ++ ma ha un sistema di tipo più forte. Potrebbe avere altre funzionalità linguistiche che renderebbero il programma più robusto? So che alcune persone evitano il C ++ perché può (ma non sempre) generare grandi immagini del firmware.

È stato utile?

Soluzione

Questa non è una domanda particolarmente semplice a cui rispondere. Dipende da una serie di fattori tra cui:

  • Come preferisci il layout del tuo codice.
  • Se è disponibile un compilatore C ++ per la tua destinazione (e qualsiasi altra destinazione su cui potresti voler utilizzare il bootloader).
  • Quanto è importante la dimensione del codice per la tua applicazione (stiamo parlando forse del 10% in più, non di MB come suggerito da un'altra risposta).

Personalmente, mi piacciono molto le lezioni come modo per definire il mio codice. Anche quando scrivo il codice C, tenderò a mantenere tutto in file modulari con funzioni statiche di ambito di file "simulando" funzioni membro e (alcune) variabili statiche di ambito file per "simulare" variabili membro. Detto questo, la maggior parte dei miei progetti embedded esistenti (che sono tutti relativamente piccoli, fino a un massimo di 128kB di flash incluso bootloader, ma di solito meno) sono stati scritti in C. Ora che ho un compilatore C ++, Sto sicuramente pensando di passare al C ++.

Ci sono notevoli vantaggi in C ++ dal semplice uso di riferimenti, sovraccarico e modelli, anche se non si arriva alle classi. Certamente, smetterei di usare molte funzionalità più avanzate, incluso l'uso dell'allocazione dinamica della memoria (nuova). Inoltre, eviterei l'allocazione dinamica della memoria (malloc ecc.) Anche in C incorporata, se possibile.

Se si dispone di un compilatore C ++ (anche se è solo g ++), vale la pena eseguire il codice attraverso di esso solo per il controllo del tipo aggiuntivo in modo da poter ridurre il numero di problemi nel codice. Il compilatore C ++ può rilevare alcune cose che nemmeno gli strumenti di analisi statica possono individuare.

Per una buona discussione su molte ragioni non valide le persone rifiutano il C ++, vedi l'articolo di Dan Saks su Embedded.com .

Altri suggerimenti

Per un bootloader la scelta ovvia è C, specialmente su un sistema incorporato. Il codice generato dovrà essere vicino al metallo e molto facile da eseguire il debug, probabilmente cadendo in assembly, il che diventa rapidamente difficile senza cura in C ++. Anche le catene di strumenti C sono molto più onnipresenti delle catene di strumenti C ++, consentendo al bootloader di essere utilizzato su più piattaforme. Infine, i binari generati sono generalmente più piccoli e usano meno memoria quando sono scritti in stile C.

Se non è necessario utilizzare l'orientamento agli oggetti, utilizzare C. Scelta semplice lì. È più semplice e più facile, pur svolgendo lo stesso compito.

Alcuni duri a morire non saranno d'accordo, ma OO è ciò che rende C ++ > C e viceversa in molte circostanze.

Userei C a meno che non ci sia un motivo specifico per usare C ++. Per un Bootloader non avrai davvero bisogno di OO.

Utilizza lo strumento più semplice che eseguirà il lavoro.

Scrivere programmi in C non equivale a scriverlo in C ++. Se sai come farlo solo in C ++, allora la tua scelta è C ++. Per scrivere bootloader sarà meglio minimizzare il codice, quindi probabilmente dovrai disabilitare la libreria C ++ standard. Se sai come scrivere in C, allora dovresti usare C: è la scelta più comune per questo tipo di attività.

La maggior parte delle risposte precedenti presuppone che il tuo bootloader sia piccolo e semplice, in genere è il caso; tuttavia, se diventa più complesso (ad esempio devi essere in grado di caricare da una porta Ethernet, una porta USB o una porta seriale ... devi convalidare il codice che viene caricato prima di cancellare il tuo codice esistente, ecc.) potresti prendere in considerazione C ++.

Ho anche scoperto che il bootloader e l'applicazione in genere condividono una certa quantità di codice comune, quindi potresti anche prendere in considerazione l'idea di utilizzare la stessa lingua dell'applicazione per facilitare la condivisione del codice.

Il linguaggio C è sostanzialmente più semplice da analizzare rispetto al C ++. Ciò significa che un programma che è sia C valido che C ++ valido verrà compilato più velocemente come programma C. Probabilmente non è una delle maggiori preoccupazioni, ma è solo un'altra ragione per cui il C ++ è probabilmente eccessivo.

Vai con C ++ e scegli quali funzionalità linguistiche ti servono. Hai ancora il pieno controllo del codice oggetto di output purché comprendi le astrazioni C ++ che stai utilizzando.

L'uso di OO può comunque funzionare bene se si evita l'uso di funzioni virtuali. Evita tipi di oggetti immutabili che richiedono molta copia per passare valori, come std :: string. Tuttavia, puoi comunque utilizzare funzionalità come i modelli senza alcun impatto reale sulle prestazioni di runtime.

Usa C con µClibc . Semplifica il tuo codice e ne riduce il footprint. Può essere trovato in: www.uclibc.org .

Per un'attività così specifica come un bootloader non userei sicuramente C ++. Penso che la libreria standard c ++ sia almeno un paio di MB, non qualcosa che vuoi in un bootloader. Vai con C.

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