Scrittura di software incorporato senza hardware


8

Considera che il team hardware impiegherà 2 mesi per sviluppare dell'hardware, ma a quel punto avrò bisogno del software pronto.

La mia domanda è che come posso scrivere il software e testarlo senza avere l'hardware?

Ci sono degli standard da seguire? Come si fa?


A seconda della complessità dell'hardware, potresti provare un simulatore. È abbastanza fattibile se è solo un microcontrollore con periferiche semplici. Più di questo e sei sfortunato su quella rotta.
Albero

6
Prova a trovare schede di sviluppo per i micro e tutti gli altri dispositivi periferici che stai utilizzando e prova a collegarli tutti in un modo che assomigli molto al design del tuo team hardware. Sarà grande e brutto, ma dovresti essere in grado di mettere insieme un sistema abbastanza vicino alla cosa reale - almeno per quanto può dire il tuo firmware ...
brhans

Nel peggiore dei casi, se non è possibile simulare correttamente l'hardware, è necessario disabilitarlo. Solo un paio di settimane fa volevo testare la comunicazione di rete con un altro programma, solo per scoprire che avrebbe funzionato exit()perché cercava di eseguire il mmap degli indirizzi codificati in / dev / mem.
Isanae,

1
In realtà è preferibile, in molti casi, utilizzare un simulatore per lo sviluppo di software incorporato, molto più facile da eseguire il debug. Il problema, ovviamente, è che hai bisogno di un simulatore decente. A volte ce n'è uno generico che può essere adattato, a volte un tirocinante intelligente può scriverne uno in una frenesia di programmazione alimentata dalla caffeina.
Hot Licks

Risposte:


34

Non si verifica l'hardware durante le fasi iniziali dello sviluppo del firmware. Le strategie comuni per affrontare questo sono:

  1. Passa il tempo a progettare attentamente il sistema prima di scrivere qualsiasi codice. Ovviamente dovresti farlo comunque, ma in questo caso è ancora più importante del solito. È molto più facile eseguire il debug di software ben congegnato rispetto a un pasticcio a base di pasta.

  2. Modularizza correttamente tutto, riducendo al minimo le interfacce tra i moduli. Ciò contribuirà a contenere i bug dei singoli moduli e consentirà di testare più facilmente i singoli moduli.

  3. Scrivi il codice dal basso verso l'alto, i driver che toccano l'hardware vanno per primi, la logica dell'applicazione di alto livello per ultima. Ciò consente di scoprire precocemente gli inconvenienti imposti dall'architettura. Non abbiate paura di cambiare l'architettura man mano che le realtà hardware vengono alla luce, ma assicuratevi che tutta la documentazione sia aggiornata di conseguenza.

  4. Simulare. La maggior parte delle aziende di microcontrollori fornisce simulatori software dei loro microcontrollori. Questi possono andare solo così lontano, ma possono ancora essere molto utili. Simulare gli ingressi e misurare le uscite dell'hardware può essere difficile, ma controllare la logica di livello superiore in questo modo non dovrebbe essere troppo difficile.

    È qui che il design modulare aiuta di nuovo. Se non riesci a simulare ragionevolmente alcune interazioni hardware di basso livello, usi una versione diversa del modulo che tocca quell'hardware ma che passa le sue azioni simulate ai livelli superiori. I livelli superiori non sapranno che sta succedendo. Non controllerai il modulo di basso livello in questo modo, ma quasi tutto il resto.

In breve, usa buone pratiche di progettazione del software, che ovviamente dovresti comunque fare.


Vorrei aggiungere: ottenere schede di sviluppo (sì, più, perché probabilmente ne ucciderai almeno una ...) in ASAP e metterai a posto i driver di basso livello. Unit test quanto più codice possibile. Sì, è possibile inserire il codice che tocca l'hardware. No, non è possibile simulare completamente l'hardware, ma è possibile ottenere il 90% della funzionalità corretta anche prima di eseguire il flashing per la prima volta. Ho fatto tutto quanto sopra in un recente progetto e avevamo il 99% di funzionalità in atto e funzionante quando è arrivato l'hardware reale. È stato magnifico.
CHendrix,

13

Senza alcuna comprensione di ciò che stai sviluppando o su quale famiglia di microcontrollori si baserà alla fine il tuo hardware, la maggior parte delle famiglie di microcontrollori ha a disposizione sistemi di sviluppo a basso costo che dispongono di una suite di periferiche comuni, che potrebbero consentirti di simula almeno parte dell'eventuale hardware di destinazione.


1
Concordato. Lo direi più fortemente. In una situazione come questa in cui il software deve essere completato contemporaneamente all'hardware, utilizzerei solo un microcontrollore con una scheda di sviluppo o valutazione adeguata.
Steve G,

Anche se hai avuto un'idea di ciò che l'OP sta sviluppando, la maggior parte delle famiglie di microcontrollori ha ancora simulatori disponibili.
Olin Lathrop,

Uso entrambi i metodi. Tuttavia, tengo d'occhio anche le apparecchiature di prova richieste per la linea di produzione. È possibile riunirsi con gli ingegneri di produzione e progettare l'hardware per testare i driver che possono quindi far parte dei test di produzione. Se sei fortunato, possono persino costruire hardware per una scheda / prototipo di sviluppo in modo da poter avanzare anche nel processo. Dipende tutto da come si presenta la richiesta di aiuto ...
Cucchiaio

Questa è la risposta migliore a questa domanda, poiché ho sempre una scheda di sviluppo per programmare le funzionalità di base prima di provarla sul pcb.
lucas92,

2

A seconda della dipendenza dall'hardware, l'applicazione potrebbe iniziare a implementare il progetto su un PC standard (Windows, Linux ...). La maggior parte degli accessi periferici dovrebbe comunque essere astratta, quindi non è un grosso problema implementare alcune funzioni fittizie, che verranno sostituite in seguito. Se non è possibile simulare un comportamento, potresti almeno fare un modello del sistema (API ...), quindi l'implementazione effettiva andrà molto più veloce e più chiara, non appena l'hardware è pronto.

Naturalmente ci sono molte cose che non possono essere simulate, come il comportamento in tempo reale o driver hardware complessi. D'altra parte, un ADC guidato da interrupt può essere facilmente simulato usando un thread che legge valori da un file o da una porta di rete.

Naturalmente tutto ciò dipende fortemente da vari fattori:

  • Puoi usare la stessa / simile toolchain su controller e pc (ad es. Gcc)?
  • Quanto dipende l'hardware dal sistema?
  • Quanto hai esperienza con la programmazione per PC?

Per prima cosa, sto progettando praticamente tutti i moduli firmware su un PC.


Anch'io. Alcune differenze tra compilatori (intrinseci, parole chiave speciali, SO chiuso e stack di rete non del tutto compatibili con BSD) e bug (con C ++) costringono a un uso intensivo di file pre-inclusi specifici per file e preprocessore, ma il codice stesso può essere quasi identico tra DSP e PC. Per la versione PC posso usare il controllo degli errori di runtime forte e pesante (CodeGuard) e le sue funzionalità di debug non possono essere abbinate su piattaforme integrate. Il vantaggio aggiuntivo è che posso avere pochi dispositivi virtuali extra per qualsiasi rete e test di carico.
TMSZ,

Con la disponibilità di Raspberry Pi e BeagleBone, il tuo ambiente di sviluppo potrebbe essere altrettanto facilmente il tuo ambiente di runtime - nessun problema con toolchain, ecc. Inoltre, puoi utilizzare valgrind / helgrind, gdb, ecc.
jhfrontz

1

Prova a ottenere un simulatore per il tuo chip. È necessario simulare tutti gli input previsti e anche alcuni imprevisti. Modulare / astrarre il più possibile e scrivere test unitari. Se puoi, quei test possono diventare parte del tuo codice reale e si trasformano in una funzione (test automatico della scheda).

Se non riesci a ottenere un simulatore, riassumi il più possibile attraverso un HAL (livello di astrazione hardware). Tutti i conducenti lo superano. Prova ad astrarre tutto l'assemblaggio specifico della piattaforma dietro una chiamata di funzione C e pensa anche a quelli come driver. Scrivi il resto come codice C / C ++ portatile e crea un sottile HAL per x86 ed eseguilo sul tuo computer con tutti i casi di test.

In questo modo, quando si ottiene l'hardware, sarà sufficiente eseguire il debug dell'HAL. Più è sottile, più veloce sarà il debug e far funzionare tutto. Ricordate che se si utilizza la piattaforma-specifici di montaggio per ops più veloci, si voglio MOLTO per ottenere prove bit-esatto .


L'esattezza dei bit è particolarmente importante se si utilizza DSP a punto fisso.
Ronan Paixão,

Può applicarsi o meno a un caso particolare, ma in generale la precisione del bit ha il suo prezzo. QEMU recentemente (2 anni fa) ha deciso di implementare FPU bit-esatta, e indovina cosa è successo alle prestazioni ?
Dmitry Grigoryev,

L'esattezza dei bit non è molto importante quando si utilizza una FPU. È estremamente importante se si utilizza il punto fisso, però. Soprattutto perché il punto fisso del software necessita di controlli extra ovunque.
Ronan Paixão,

Il che è il risultato di cattive pratiche di codifica. Le persone hanno imparato a prendere precauzioni quando usano i a == bconfronti con i float, ma li usano ancora senza pensarci con numeri a virgola fissa.
Dmitry Grigoryev,

Mentre le cattive pratiche di codifica sono piuttosto un problema, ci sono molti altri problemi, specialmente nei casi limite. Gli overflow vengono in mente rapidamente, così come la perdita di precisione , l' arrotondamento , la saturazione e la larghezza rispetto allo spostamento dei bit . Con tutto ciò, è facile ignorare una certa perdita di precisione nei casi di test comuni. Il problema è quando la tua app raggiunge casi minori e gli errori passano dai bit frazionari a quelli interi, che si verificano se l'intervallo viene calcolato male. Basta controllare la pagina delle caratteristiche di MATLAB Designer a virgola fissa per vedere cos'altro potrebbe andare storto in un attimo.
Ronan Paixão,

1

La tua domanda è un po 'ampia. Hardware (HW) potrebbe significare sviluppo ASIC / FPGA completamente personalizzato, DSP programmati dall'assemblatore o "solo" un tipico sistema embedded basato su microprocessori / microcontrollori / SoC standardizzati ecc. (Ovviamente un SoC potrebbe contenere anche un DSP che potresti voler programmare ....). Per elevate quantità di vendita, renderlo un ASIC non è raro.

Ma per un progetto di 2 mesi mi aspetto che sia basato su un microcontrollore:

In ogni caso, dovresti sollecitare il team hardware a darti un prototipo che puoi iniziare a testare il tuo codice prima della scadenza assoluta - questo potrebbe consistere in una scheda di sviluppo generica, come alcune persone hanno già detto, ma a mio avviso è il loro lavoro per fornire quello giusto per te, e potenzialmente anche alcune periferiche necessarie / simili per i test.

I simulatori sono anche possibili in una certa misura, ma potresti ancora dover caratterizzare alcuni sensori / dati del mondo reale che potresti ottenere. Qui anche il team dell'hardware deve almeno aiutarti.

Oltre a ciò, la progettazione del software può già essere eseguita e tutti i moduli di alto livello possono essere (e dovrebbero essere) implementati e testati in unità senza l'hardware reale. Idealmente, definirai anche un'API insieme al team hardware e ti forniranno le funzioni di livello più basso, quindi qualsiasi modifica apportata sul lato hardware lì (ad esempio semplicemente ridefinendo quali pin della porta usano), non sarà sempre essere critico per te.

In tutti i casi, la comunicazione è la chiave.


0

Sì, è possibile sviluppare il codice per la scheda target prima che vengano prodotte.

Come ?

Innanzitutto devi conoscere l'obiettivo principale di quel sistema. Quindi da questo puoi scegliere il controller in modo appropriato da un'ampia fonte di disponibilità come digikey, mouser.

E scegli un simulatore come Proteus. Questo simulerà l'esatto processore / controller ora puoi iniziare la tua codifica. Ma non puoi aspettarti l'accuratezza come nell'hardware.


Perché votare? Posso sapere qual è il problema con questa risposta?
Photon001,
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.