2009-05-22 15 views
8

Qualcuno potrebbe dirmi se è possibile masterizzare un microcontroller 8051 con un programma C++? Ho provato a cercarlo online ma non riesco a capire con certezza se è possibile o no. Keil usa C, ma il programma che devo scrivere è molto stringente e C è abbastanza ostile rispetto a C#, che è quello che sono abituato a usare. Al momento, sto cercando di scrivere il codice in C ma sta diventando molto complicato, quindi sarei estremamente sollevato se potessi scrivere in C++.C++ per microcontrollore 8051?

Avrei bisogno di un compilatore C++ che crea un file di output esadecimale che può quindi essere masterizzato sul microcontrollore. Qualcuno ha sentito di qualcosa che potrei usare? Inoltre, C usa un file di intestazione che ti permette di fare riferimento alle porte, ma quando ho provato a scoprire se questo file di intestazione è usato anche in C++, non ho trovato alcuna informazione su di esso.

Aggiunta: Il microcontrollore che sto utilizzando è un Atmel AT89C51 con 4K Byte di memoria flash riprogrammabile e 128 x 8 bit di RAM interna. Questo è in realtà per un robot per un progetto all'università e la codifica in realtà non richiede OOP. Ha solo un sacco di tabelle di ricerca che sono in formato array di stringhe 2D. L'unico motivo per cui volevo prendere in considerazione il C++ era dovuto al modo in cui sembravano essere state manipolate le stringhe (a causa della mia mancanza di esperienza in C).

E qualcuno sa circa il file di intestazione? C usa #include reg51.h ma ho cercato di scoprire se questo funziona per C++ e non ho trovato nulla su di esso.

+4

Non so se esiste un modo nativo, ma è sempre possibile utilizzare il convertitore di linguaggio cLL cL ++ da LLVM. – Zifre

+0

Bene quanta memoria hai (sia ROM che RAM)? – lothar

+3

Lascia perdere! Probabilmente avrai bisogno di ogni singolo ** bit ** della RAM da 128 byte e del 4096 byte flash. Si consiglia vivamente di utilizzare il linguaggio di assemblaggio ... –

risposta

2

C'è un compilatore commerciale da ceibo.

Tuttavia se è possibile utilizzare C++ (in particolare stringa STL) dipende dalla quantità di risorse (ROM e RAM avrete.

C'è un 8051 site con forum, tutorial e download dove è possibile ottenere alcuni più risorse per programmazione del 8051.

11

Mi chiedo se questa sia davvero una buona idea in primo luogo. Capisco il ragionamento che sta dietro il voler usare C++ su C nel caso generale, ma nel caso di un microcontrollore ad architettura a 8 bit di Harvard vorrei mettere in guardia contro questo.

cose da tenere in mente:

  • Il supporto per il debug a livello di origine sarà a metà strada tra il basso e l'impossibile.
  • Overhead di runtime di OOP su una macchina a 8 bit. Consiglio vivamente di fare un serio benchmarking prima di dedicarmi a uno strumento.
  • memoria non è a buon mercato a sistemi embedded e si avrà senza dubbio alcune limitazioni di spazio indirizzo.

Inoltre, se davvero intenzione di fare un po 'sul serio la gestione delle stringhe mi consiglia di utilizzare la libreria standard C, piuttosto che una libreria di oggetti stringa semplicemente perché si ha un migliore controllo sul posto di sostituzione e così copie stringa diventano chiaramente ovvio nel codice.

Si prega di postare un po 'sul microcontrollore che si intende utilizzare (memoria dati, memoria programma) e se ci sono requisiti di prestazione che devono essere soddisfatti in modo da poter aiutare un po' più concretamente.

+1

"Il supporto per il debug a livello di origine sarà tra il minimo e l'impossibile". IMHO non sarà diverso dal debugging C. Se il target ha JTAG, dovrebbe essere abbastanza stretto se il debugger ha il supporto per esso. – lothar

+0

Da quello che ho capito, tutti gli strumenti 8051 C++ traducono in C e utilizzano una piattaforma popolare come strumenti Keil o sistemi IAR. Sono questi strumenti che eseguono il supporto per il debug dell'IDE. Naturalmente potrei sbagliare completamente :-) – mikelong

+2

Ricorda che C++ esegue la computazione/generazione del codice in fase di compilazione in modo da poter generare, in linea di principio, un codice migliore di quello che farebbe qualsiasi compilatore C. Sto lavorando su una porta LLVM ad un'architettura a 8 bit (mi spiace, non posso dire altro) e il front-end C++ genera un codice numerico bellissimo che è impossibile generare da C pura! Fondamentalmente ho una versione hackerata di Eigen 3 che genera codice numerico a virgola fissa per un'architettura a 8 bit con moltiplicatore hardware. Codice che è alla pari con l'assemblaggio scritto a mano, tra l'altro. –

1

Si potrebbe prendere in considerazione fornendo ulteriori dettagli sul tipo di programma che si intende eseguire su quel microcontrollore:

Lei ha parlato di C++, così come C# in un commento, entrambi i quali non sono sicuramente utilizzati idealmente per l'elaborazione di stringhe pesanti su un microcontrollore, per non parlare del fatto che si sta probabilmente considerando un utilizzo intensivo dell'STL, che incrementerebbe ulteriormente le dimensioni dell'eseguibile?

Quindi quali sono esattamente i tuoi principali vincoli (RAM, CPU, ROM ecc.)?

Se si ritiene che sia necessario eseguire questa elaborazione di stringa in modalità OO, è consigliabile prendere in considerazione l'esecuzione di un interprete di script incorporato leggero sul controller, in modo da poter fornire le routine di elaborazione delle stringhe utilizzando il linguaggio di scripting. , mentre l'interprete stesso sarebbe ANSI C compilato su un file HEX (ad esempio lua o nasal sembrerebbero entrambi candidati idonei).

Tuttavia, tenere in considerazione che un linguaggio di scripting come lua di solito imporrà circa 100kb + di sovraccarico nello spazio, Nasal è leggermente più leggero e può essere compilato a 50-70 kb se si disabilitano determinate estensioni.

Inoltre, sono disponibili altri interpreti di script che sono specificatamente pensati per essere utilizzati su piattaforme incorporate.

+0

Per un processore come questo, l'esecuzione di un motore di scripting sarebbe enormemente eccessivo. Molto meglio scrivere alcune efficienti routine di stringa in C o C++. –

+0

si riduce davvero a ciò che deve essere fatto, ci sono molti altri obiettivi incorporati come ad esempio router che non forniscono molto più potere di dire un 8051, ma utilizzano ancora motori di scripting, cioè per fornire un interfaccia utente flessibile e utilizzabile per il browser – none

+0

@none - Sono a lei una tra l'altro! :-) – CodeConfused

0

Sono disponibili diversi compilatori commerciali. Il numero 1 nel settore è da Keil Software.

+0

Ho usato anche Keil. IMHO, il loro IDE è la migliore opzione per lo sviluppo 8051 C. - Ma le mie scansioni del sito Web mi portano a concludere che non * offrono * compilatori C++ per 8051. Mi sto perdendo qualcosa? – Nate

+2

Ho appena parlato con uno dei loro sviluppatori, e hai ragione. È solo C. Quindi, la mia risposta non soddisfa i requisiti dell'OP. ; – NotMe

4

I sistemi IAR hanno un 8051 compiler che può compilare C++ in modo nativo (nessuna conversione in C) e il debug del livello di origine non dovrebbe essere un problema.

+0

Ecco un collegamento per il compilatore C/C++ 8051 di IAR: http://iar.com/website1/1.0.1.0/244/1/ – Nate

+0

Grazie, post aggiornato. Ero troppo pigro per scavare il link. – JesperE

0

Si potrebbe provare a convertire il codice C++ in codice C e quindi compilarlo con il compilatore C esistente.

Dovresti essere in grado di creare un Makefile che chiama il compilatore C++ e poi esegue il compilatore C in seguito.

Non è la soluzione più elegante, ma in realtà è abbastanza insolito per utilizzare C++ su dispositivi di piccole dimensioni come il 8051.

Diniego: Non ho effettivamente provato questo quindi buona fortuna! Se fossi in me, mi limiterei a C e scrivere alcune funzioni di gestione delle stringhe robuste.

0

Altri hanno menzionato che ci sono compilatori C++ per l'8051. Immagino che il problema principale con quelli sarà il costo. Un sacco di aziende ti permetteranno di scrivere assembly gratuitamente ma di caricare il compilatore C o C++. Probabilmente stiamo parlando di poche centinaia di dollari qui.

La mia domanda principale è che cosa sta diventando "disordinato" nel codice? Quali caratteristiche stai cercando di usare in C++ che sta diventando disordinato in C? Alcune delle caratteristiche in C++ non si traducono bene in un ambiente embedded di questo tipo (flussi, costruttori, distruttori, ecc.). C può fare molte delle funzioni di tipo orientato agli oggetti con le strutture. Altre funzioni dovrebbero essere evitate (qualsiasi cosa con gestione dinamica della memoria).

Farei uno sforzo per farlo funzionare in C prima di spendere potenzialmente molti soldi e ottenere un codice che è grande, lento e poco maneggevole.

+0

Sto iniziando a pensare che tu abbia ragione, Stephen. :( Semplicemente non c'è nulla di facilmente disponibile – CodeConfused

1

IAR sembra offrire a C/C++ compiler for 8051'sa C/C++ compiler for 8051's. - Ma in piena divulgazione, ho usato solo i compilatori C di Keil per lo sviluppo 8051.

Per quanto riguarda i problemi del file di intestazione: i file di intestazione sono spesso distribuiti dal fornitore IDE o dal produttore dell'hardware e spesso forniscono una rappresentazione simbolica dei mapping dei registri. È possibile che venga richiesto un modesto quantitativo di per incorporare un file di intestazione basato su C in un progetto C++. - Se stai per cambiare i compilatori/IDE, puoi spesso aspettarti un po 'di massaggio del tuo codice sorgente per accogliere il nuovo compilatore. (Leggi: l'accesso al codice C da un codice C++ spesso mi costringe a fermarmi un giorno per farlo correttamente.)

0

Sembra che tu voglia un compilatore C++ in modo da poter usare std::string. std::string richiede un heap. Non si dispone di un heap utilizzabile con soli 128x8 bit di RAM interna, in particolare non per gli oggetti std::string Si consideri che se si legge una stringa di 80 caratteri da una porta seriale, che consuma oltre il 60% della RAM disponibile. Utilizzerai anche la RAM esterna? Quanto?

Il tuo firmware ha davvero bisogno di gestire l'elaborazione delle stringhe in fase di runtime? Ad esempio, invia/riceve comandi come stringhe tramite una porta seriale o qualche altra interfaccia? In tal caso, dovresti isolare il più possibile la gestione delle stringhe dal resto del codice e utilizzare i token (tipi enumerati o costanti integrali #defined) altrove. In caso contrario, si avranno meno problemi ad inserire la logica nella memoria vincolata del processore utilizzando token anziché stringhe.

Inoltre, se è necessario eseguire l'analisi delle stringhe, è preferibile scrivere una macchina a stati che elabora i caratteri uno alla volta, in modo da non dover gestire stringhe complete. Di nuovo, 128 byte non hanno molto spazio per l'elaborazione delle stringhe.

+1

Solo un chiarimento Come sapete, std :: string è solo un typedef per basic_string, con char e un allocatore, invece di un allocatore di massa può essere implementato un allocatore personalizzato , dove non viene utilizzata memoria heap –

+0

@Johann Gerell: Sospetto che la scrittura di un allocatore STL personalizzato che gestisce le stringhe memorizzate nella ROM sarebbe significativamente più difficile (se possibile) rispetto alla riscrittura dell'elaborazione della stringa in C. Tenere presente che Il sistema di destinazione dell'OP ha solo 128 byte di RAM e 4 KB di flash, il che significa che le tabelle di ricerca devono essere memorizzate in flash. – bk1e

0

Perché non utilizzare una libreria di stringhe C? Come bstrlib o simile? C++ non è quello che ti serve per questo microcontrollore.

0

sì, è possibile masterizzare la memoria del microcontroller 8051 con un programma C++ e inoltre sono disponibili diversi compilatori gratuiti che possono essere utilizzati per creare file Hex e quindi inviare i file al microcontrollore. È possibile trovare qualsiasi informazione sul processo di programmazione del microcontrollore in un comprehensive article with tutorials, compilers, simulators, etc