Modularität ist dein Freund. Schreiben Sie Ihre Hauptschleife, indem Sie Funktionen aufrufen, die Funktionen aufrufen, ... bis die Ebene erreicht ist, auf der Ihre Funktionen einfach wären. Beginnen Sie mit der Hauptschleife und der nächsten Ebene nach unten, und machen Sie Stub-Funktionen. entweder leer:
function foo(){
;
}
oder falsch:
function read_temperature(){
return(95);
}
, die nichts anderes tun, als alles zurückzugeben, was die aufrufende Ebene benötigt, um fortfahren zu können. Wenn diese Ebene funktioniert, gehen Sie eine Ebene nach unten und geben Sie einfachen Code ein, der ebenfalls Stub-Funktionen aufruft. Deaktivieren Sie nach und nach eine Funktion, bis Sie eine funktionierende Anwendung haben.
Um eine Funktion zu debuggen, die einen fehlerhaften Wert zurückgibt, oder um eine Funktion zu erstellen, die keinen Einfluss auf den Rest Ihrer Anwendung hat, können Sie ein Gerüst erstellen - eine einfache Skizze, die der Funktion nur einige Beispielwerte zuführt und innerhalb der Funktion Parameterwerte druckt und einige Zwischenwerte, bis Sie einen Einblick erhalten, welcher Teil der Funktion fehlschlägt. Ich habe sogar Fälschungsfunktionen erstellt, die mich auf dem Terminal auffordern, einen Wert zurückzugeben. (Offensichtlich kann diese Technik nur funktionieren, wenn das System die relativ eiszeitliche Geschwindigkeit von uns Menschen toleriert! Eine andere Verwendung für Gerüste.)
Stubbing eignet sich besonders gut für Funktionen, die mit der Hardware verbunden sind. So können Sie die Anwendung aufrufen, bevor Sie sich mit Datenblättern, Zeitproblemen und anderen Kleinigkeiten (z. B. ohne Teile!) Befassen müssen, die andernfalls möglicherweise zum Stillstand kommen dein Fortschritt.
Wenn Sie von Timing-Problemen sprechen und einen Ausgangs-Pin an einem bestimmten Punkt in Ihrem Programm umschalten, z. B. beim Ein- und Ausstieg aus einem ISR, erhalten Sie eine Rechteckwelle am Arduino-Pin, deren Frequenz oder Arbeitszyklus Ihnen einen Einblick in das interne Timing geben kann Ihres Programms. Das direkte Port-I / O-Formular, z.
PORTC ^= 0x01;
, verzerrt das Timing weniger als das Aufrufen digitalWrite()
. Nützlich, wenn Sie ein Oszilloskop zur Hand haben oder eines der DMMs mit der Fähigkeit, Frequenz und / oder Arbeitszyklus zu messen.
In ähnlicher Weise können Sie einen analogen Ausgangspin verwenden, um einen numerischen Wert aus dem Programm heraus an Ihr Messgerät auszugeben, ohne das Timing zu stark zu stören oder den Code mit den seriellen E / A-Funktionen aufzublähen. Verwenden Sie auch hier die direkten E / A-Formulare.