La modularità è tua amica. Scrivi il tuo ciclo principale per fare la sua cosa chiamando le funzioni, che chiamano funzioni, ..., fino al livello in cui le tue funzioni sarebbero semplici. Inizia con il loop principale e il livello successivo in basso, crea funzioni di stub; vuoto:
function foo(){
;
}
o falso:
function read_temperature(){
return(95);
}
, che non fanno altro che restituire qualunque sia il livello di chiamata necessario affinché sia in grado di continuare. Quando quel livello funziona, passa a un livello inferiore e inizia a compilare un semplice codice che chiama allo stesso modo le funzioni di stub. Disimpegnare gradualmente una funzione alla volta fino a quando non si dispone di un'applicazione funzionante.
Per eseguire il debug di una funzione che restituisce un valore errato o per crearne una senza alcuna influenza dal resto dell'applicazione, è possibile creare un'impalcatura: un semplice schizzo che fornisce semplicemente alla funzione alcuni valori di esempio e all'interno della funzione, stampare i valori dei parametri e alcuni valori intermedi, fino a quando non si ottiene una visione di quale parte della funzione non funziona. Ho anche creato funzioni di simulazione che mi richiedono sul terminale di restituire un valore. (Ovviamente questa tecnica può funzionare solo se il sistema può tollerare la velocità relativamente glaciale di noi umani! Un altro uso per i ponteggi.)
Lo stubbing funziona particolarmente bene per sostituire le funzioni che si interfacciano con l'hardware, permettendoti di iniziare ad aprire l'applicazione prima di immergerti in schede tecniche, problemi di temporizzazione e altre minuzie (come, non avere le parti!) Che potrebbero altrimenti bloccarsi i tuoi progressi.
Parlare di problemi di temporizzazione, attivare o disattivare un pin di uscita in un determinato punto del programma, come l'ingresso e l'uscita da un ISR, ti dà un'onda quadra sul pin di Arduino la cui frequenza o ciclo di lavoro può darti un'idea del tempismo interno del tuo programma. Il modulo I / O porta diretta, ad es.
PORTC ^= 0x01;
, distorcerà i tempi meno che chiamare digitalWrite()
. Utile se hai un 'ambito utile o uno dei DMM con la capacità di misurare la frequenza e / o il duty-cycle.
Allo stesso modo, è possibile utilizzare un pin di uscita analogica per inviare un valore numerico al misuratore dall'interno del programma senza disturbare troppo i tempi o gonfiare il codice con le funzioni I / O seriali. Utilizzare qui anche i moduli I / O diretti.