Linguaggio di assemblaggio AVR per test unitari


11

Come testate il vostro codice assembly?

Sto lavorando su un servo controller seriale come parte di un progetto di robot esapode e il codice è arrivato al punto in cui sta diventando complicato;) Comunque, sono abituato ad usare unit test nel mio lavoro quotidiano come sviluppatore di server C ++ e così ho cercato di applicare gli stessi tipi di test al mio codice assembly AVR. Ho escogitato un modo che funziona bene per me (vedi qui ) ma sono interessato se ci sono strumenti o tecniche standard che mi mancano.

Aggiornato: per quelli di voi che sono interessati l'intera fonte al servo controller e i test unitari sono ora disponibili qui .

Risposte:


3

Lo descriverei anche come elegante, ma vorrei aggiungere il problema, se perdonerai la mia intrusione.

So che ci sono pacchetti software molto costosi per affrontare situazioni come questa, ma presso l'azienda in cui lavoro non possiamo permetterci il costo a meno che non siamo sicuri che faccia quello di cui abbiamo bisogno.

Test Driven Development (TDD) è uno dei sistemi migliori di cui ho sentito parlare per lo sviluppo, e mi diverto, ma i problemi che richiedono tempo sono normalmente causati da complessi eventi di interruzione e hardware che molti chiamerebbero glitch. Sembra una cosa minore avere un problema ogni 2 ore quando le stelle si allineano, ma se il tuo telefono si bloccasse solo una volta alla settimana, malediresti il ​​nome degli ingegneri. Nel nostro caso, dobbiamo scavare in un sacco di cibo quando le cose si rompono davvero, cosa che, come potete immaginare, mi piace evitare.

Ho visto soluzioni molto intelligenti per verificare la funzionalità dei sottosistemi, che, se implementate correttamente, probabilmente mi farebbero risparmiare 3 ore su una settimana lavorativa di 50 ore, ma se ci fosse un modo intelligente di trovare situazioni glitch mi risparmierebbe settimane di lavoro alla ricerca del "bug" che si presenta occasionalmente sul campo sotto carico pesante.

Questo post probabilmente non aiuta molto, ma trovo che portare tutto alla luce renda tutto più facile da risolvere. Se esistesse un metodo TDD per trovare situazioni glitch, potrei ottenere 10 milioni di migliaia stanziati per pagarlo. -Max


1
Non ho davvero pensato di testare l'interazione tra il codice di interruzione e il codice di non interruzione. È un buon punto. Stavo pianificando di testare il mio codice di interruzione del timer di generazione PWM al di fuori di una situazione di interruzione in modo simile al modo in cui sto testando il mio codice seriale della linea principale. Immagino che anche quando avrò copertura per tutto ciò mi mancherà ancora l'interazione. Suppongo che potrei innescare interruzioni dall'interno dei test (è facile con l'interruzione del timer ma tutto il codice di interruzione potrebbe essere impostato per essere eseguito su un'interruzione del timer all'interno del cablaggio di prova). Non banale però.
Len Holgate,

1
Potrei fraintenderti, ma cerco di stare molto attento alle interazioni del codice senza interruzione e interruzione. Probabilmente dovrei essere più rilassato nel mio uso delle operazioni atomiche, ma non è mai stato dimostrato che causi danni al livello in cui ho il nostro ottimizzatore. I problemi sorgono quando un interrupt ritarda un altro, uno comune con cui aiuto gli studenti sarebbe la generazione di PWM guidata da interrupt. Se hai bisogno di una velocità estremamente precisa, ad esempio usando un modulo Compare nel tuo chip, e un altro interrupt è impegnato a passare del tempo su qualcos'altro e ti ritarda di 50 uS che potrebbe essere la fine del mondo.
Kortuk,

1
In alcuni casi puoi avere la priorità, oppure puoi anche disabilitare l'interrupt stesso e riattivare gli interrupt globali internamente, dipendenti dalla piattaforma, ma il percorso più semplice per il mio sviluppo è limitare il tempo in interruzione a cose assolutamente necessarie e fare in modo che il codice normale il resto del lavoro.
Kortuk,

1
Il mio design attuale è spiegato sul mio blog, così come un nuovo design proposto. In questo momento ho 64 canali di PWM generati da un interrupt timer e nessun altro interrupt; il serial viene eseguito tramite polling. Ciò significa che il PWM è solido ma il seriale potrebbe avere dei problemi. Il mio nuovo design avrebbe utilizzato gli interrupt per UART, nonché il timer per la generazione di PWM e un'attenta riattivazione e blocco degli interrupt per garantire PWM senza glitch ed elaborazione UART senza glitch ...
Len Holgate,

2
Stavo usando il PWM come esempio, il sistema sul quale ho avuto questo problema ha 3 interfacce SPI con 1 delle connessioni SPI con 3 chip che usiamo su di esso. Esistono 4 interrupt di porta diversi che informano del cambiamento nello stato dei chip esterni e alcune altre cose in corso. Il problema peggiora più interfacce hai.
Kortuk,

2

Interessante. Dopo Natale stavo pensando di fare un po 'di assemblaggio con Pics, quando avrò un po' più di tempo darò una buona occhiata al tuo sistema.

Un modo che potrei vedere sarebbe di scrivere una sorta di framework in un linguaggio diverso per creare e abbattere gli oggetti finti, ecc., Ma come si interfaccia questo con il chip / simulazione sarebbe un problema.

Se diventa troppo oneroso, allora questo supererà i vantaggi del test unitario e ti renderà anche meno desideroso di usarlo.


Far funzionare il simulatore all'interno del simulatore è stato il mio ostacolo iniziale fino a quando non ho capito come suddividere il codice in file separati e semplicemente "deridere" alcune delle etichette a cui passarei nel codice reale. Pubblicherò il tutto una volta che avrò finito. Il retrofitting dei test unitari sul codice richiede un po 'di tempo, ma ne è valsa la pena.
Len Holgate,

Ora che ho avuto la possibilità di esaminare la tua metodologia, penso che sia abbastanza elegante. Forse darò un'occhiata ad avrs dopo Natale, dato che sembrano esserci molte più cose basate sulla comunità per loro che per le foto. Qualche idea su quale IDE Linux decente potrebbe essere la programmazione di AVR Assembler.
Amos,

1
C'è una catena di strumenti GNU che puoi usare al posto di AVR Studio (che è il set di strumenti gratuito di Atmel). Probabilmente è possibile eseguirlo su Linux, ma non ne ho avuto bisogno.
Len Holgate,

Ho appena trovato questo link a un articolo del Linux Journal sullo sviluppo di AVR sotto Linux: linuxjournal.com/article/7289
Len Holgate,

La mia principale preoccupazione per quell'articolo è che è del 2005 e quindi potrebbe non essere aggiornato.
Amos,
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.