回答:
モジュール性はあなたの友達です。メインループを記述して、関数を呼び出す関数を呼び出して、関数をシンプルにします。メインループから始め、次のレベルを下げて、スタブ関数を作成します。空のどちらか:
function foo(){
;
}
または偽物:
function read_temperature(){
return(95);
}
、それは続行するために必要な呼び出しレベルを返すだけです。そのレベルが機能したら、レベルを下げて、同様にスタブ関数を呼び出す単純なコードの入力を開始します。アプリケーションが機能するようになるまで、関数のスタブを一度に徐々に解除します。
不正な値を返す関数をデバッグしたり、アプリケーションの残りの部分から影響を受けない関数を作成したりするには、足場を作成します。これは、関数にいくつかの例の値を入力するだけの簡単なスケッチであり、関数内でパラメーター値を出力します関数のどの部分が失敗しているのかについての洞察が得られるまで、いくつかの中間値。端末で値を返すように促す偽の関数も作成しました。(明らかに、この手法は、システムが人間の比較的氷河の速度に耐えられる場合にのみ機能します。足場のもう1つの用途です。)
スタブは、ハードウェアにインターフェースする機能の代わりに特にうまく機能し、データシート、タイミングの問題、および他の方法では機能しなくなる可能性のあるその他の特徴(部品がないなど)に飛び込む前に、アプリケーションの起動を開始できます。あなたの進歩。
タイミングの問題といえば、ISRへの出入りなど、プログラムの特定のポイントで出力ピンを切り替えると、Arduinoピンで方形波が得られ、その周波数またはデューティサイクルで内部タイミングをある程度把握できます。あなたのプログラムの。ダイレクトポートI / Oフォーム。
PORTC ^= 0x01;
、を呼び出すよりもタイミングをゆがめdigitalWrite()
ます。便利なスコープ、または周波数やデューティサイクルを測定できるDMMの1つがある場合に役立ちます。
同様に、アナログ出力ピンを使用して、タイミングを過度に乱したり、シリアルI / O関数でコードを肥大化させたりすることなく、プログラム内から数値をメーターに出力できます。ここでもダイレクトI / Oフォームを使用します。
3その他のテクニック:
Visual Studio用のVisual MicroプラグインはArduino Debugを提供します。ソースコードのトレースとブレークを含み、式や変数を「監視」および/または変更することもできます。
ARMや他のプラットフォーム(AVR、PICとまともなツール)のような豪華なツールから行くArduinoのデバッグ機能が制限されすぎていることに同意します。しかし、これはエントリーが少ないスターターツールです。
Serial.print()はあなたの友達です。私の特定のプロジェクト(大学)には、LEDが接続されていなかったため、Serial.print()を使用しています。ステートメントを通じてコードが適切に実行されるかどうかをテストしたい場合は、通常、Serial.print( "A");を配置します。、その後、デバッグしているセクションを介してB、Cなどに移動します。デバッグレターと期待どおりの動作を比較します。
それ以外には、ブレークポイントやコードのステップはありません。Arduinoは、AVR atmegaチップ、ブートローダー+開発環境、および大量のソフトウェアライブラリを備えたボードに過ぎません。残念ながら、ブートローダーを使用すると、デバッグ機能が制限されます。
直接serial.printよりも、マクロを使用します。例:
#ifdef TRACE1
#define trace1(s) serial.print(s)
#define traceln1(s) serial.println(s)
#else
#define trace1(s)
#define traceln1(s)
#endif
次のように使用します。
function doIt(param1, param2) {
trace1("->doIt("); trace1("param1: "); trace1(param1); trace1(" param2: "); trace1(param2); traceln1(")");
...
traceln1("<-doIt");
}
(#ifdef TRACE2 ...)
詳細が異なるトレースレベルがある場合があります。
また、「F」マクロを使用することもできます(trace1(F("param1"));)
。「F」マクロは、文字列が非常に限られた量のSRAMを使用することを防ぎます。
LEDを点滅させ、シリアルポートに印刷し、一度に数行のコードの小さなセクションを書き込み、デバッグします。
モジュール化できる場合があります。たとえば、Cの場合、ホストコンピューターや他のプロセッサのハードウェアに影響を与えない計算関数を開発してテストしたり、関数をテストベンチでラップして入力を供給したり、出力をチェックしたりできます。
もう1つの同様の方法は、1つにアクセスできる場合は命令セットシミュレーターを使用することです(そうでない場合、それは非常に教育的でやりがいのあるプロジェクトです。それらのいくつかを実行した後、1〜2週間のうちに1つ実行できます)。誰かがプロセッサのVerilogまたはVHDLクローン(OpenCoresなど)を持っている場合は、GHDL、Verirator、またはIcarus Verilogを試すことができます。関心のある周辺機器を含めるのに十分近い場合があり、内部で何が行われているのかを信号レベルで確認できます。
おそらくそれは完全なクローンではないかもしれませんが、それで十分かもしれません。Verilatorを使用すると、C / C ++でペリフェラルを非常に簡単に作成できるため、AVRデバイスを接続したものをシミュレーションできます。
UART出力、LEDの点滅、GPIOラインの点滅、オシロスコープまたは電圧計の使用。クレイジーにならないための鍵は、コードの小さなセクションを書いてデバッグすることです。私は一度に10行を記述し、1000行よりも100テストを実行し、それらをすべて一度にデバッグすることをお勧めします。特に、ほとんどのデータシートやプログラマーを見つけた場合、ハードウェアのリファレンスマニュアルは常に正しいとは限りません。常にいくつかのハッキングが必要です。