Arduinoスケッチをデバッグするにはどうすればよいですか?


10

最近Arduinoのコーディングを始めました。そして、コードのこれらのバグは私を殺しています。Arduinoにはハードウェアデバッガーがないため、serial.print()が唯一の手段です。Arduinoコードをデバッグするために実装するメソッド/プラクティスは何ですか?


IDEおよびデバッガーツールのplayground.arduino.cc/Main/DevelopmentToolsをご覧ください
Dallo

回答:


8

モジュール性はあなたの友達です。メインループを記述して、関数を呼び出す関数を呼び出して、関数をシンプルにします。メインループから始め、次のレベルを下げて、スタブ関数を作成します。空のどちらか:

function foo(){
    ;
}

または偽物:

function read_temperature(){
    return(95);
}

、それは続行するために必要な呼び出しレベルを返すだけです。そのレベルが機能したら、レベルを下げて、同様にスタブ関数を呼び出す単純なコードの入力を開始します。アプリケーションが機能するようになるまで、関数のスタブを一度に徐々に解除します。

不正な値を返す関数をデバッグしたり、アプリケーションの残りの部分から影響を受けない関数を作成したりするには、足場を作成します。これは、関数にいくつかの例の値を入力するだけの簡単なスケッチであり、関数内でパラメーター値を出力します関数のどの部分が失敗しているのかについての洞察が得られるまで、いくつかの中間値。端末で値を返すように促す偽の関数も作成しました。(明らかに、この手法は、システムが人間の比較的氷河の速度に耐えられる場合にのみ機能します。足場のもう1つの用途です。)

スタブは、ハードウェアにインターフェースする機能の代わりに特にうまく機能し、データシート、タイミングの問題、および他の方法では機能しなくなる可能性のあるその他の特徴(部品がないなど)に飛び込む前に、アプリケーションの起動を開始できます。あなたの進歩。

タイミングの問題といえば、ISRへの出入りなど、プログラムの特定のポイントで出力ピンを切り替えると、Arduinoピンで方形波が得られ、その周波数またはデューティサイクルで内部タイミングをある程度把握できます。あなたのプログラムの。ダイレクトポートI / Oフォーム。

PORTC ^= 0x01;

、を呼び出すよりもタイミングをゆがめdigitalWrite()ます。便利なスコープ、または周波数やデューティサイクルを測定できるDMMの1つがある場合に役立ちます。

同様に、アナログ出力ピンを使用して、タイミングを過度に乱したり、シリアルI / O関数でコードを肥大化させたりすることなく、プログラム内から数値をメーターに出力できます。ここでもダイレクトI / Oフォームを使用します。


6

Serial.print()を使用し、LEDを点滅させます。

これでほとんどのことができます。

また、コードが読みやすく、理解しやすいことも確認しています。物事を単純なステップに分解し、各ステップの関数を作成して、イベントの正確なシーケンスを確認できるようにします。


5

3その他のテクニック:

  • 各段階でゆっくりとテストすることにより、プログラムの機能を構築します。これにより、一度に小さなバグのセットのみに直面します。

  • コマンドインタプリタを中心にプログラムを構築して、ここでのように一度にセクションを操作できるようにし ます

  • 重要な時間にパルスアウトし、スコープを使用します。


3

Visual Studio用のVisual MicroプラグインはArduino Debugを提供します。ソースコードのトレースとブレークを含み、式や変数を「監視」および/または変更することもできます。

ここに画像の説明を入力してください


1
これは、コードに挿入された自動生成シリアルプリントを介して行われることに注意してください。
per1234 2017

シリアルまたはwifiの印刷と読み取りが実際のコードではなくコードの一時コピーに挿入されることを除いて、それは正しいです!これはすべて、visualmicro.comのドキュメントで明確に説明されており、ハードウェアデバッガーを備えた少数のユーザー(通常、Unoなどではありません)もサポートされています。それぞれの方法には、独自の長所と短所があります。
Visual Micro

Debugger for Arduinoから:「コードのステップ実行はサポートされておらず、デバッガーと通信するためにビルドする前にプログラムに挿入された隠しコードに基づいていました。」
Peter Mortensen 2017

そのとおり。これにより、ユーザーがシリアルプリントを追加する必要がなくなり、CPUの実行中に名前付き変数を更新できるようになり、グラフやデジタルピンなどが表示されます。ハードウェアデバッガーとは異なりますが、高速で簡単で、その他の利点があります。これはすべて、visualmicro.comに詳しく記載されているので、読んでください。ボードがgdbをサポートしている場合、またはatmel studioを使用している場合は、もちろん他のデバッグオプションがあります。すべては、専門知識とハードウェアの種類によって異なります。本物のArduinoをお持ちの場合は、Atmelスタジオでarduinoをatmelのデバッグまたはシミュレーションと組み合わせることができます。
Visual Micro

2

ARMや他のプラットフォーム(AVR、PICとまともなツール)のような豪華なツールから行くArduinoのデバッグ機能が制限されすぎていることに同意します。しかし、これはエントリーが少ないスターターツールです。

Serial.print()はあなたの友達です。私の特定のプロジェクト(大学)には、LEDが接続されていなかったため、Serial.print()を使用しています。ステートメントを通じてコードが適切に実行されるかどうかをテストしたい場合は、通常、Serial.print( "A");を配置します。、その後、デバッグしているセクションを介してB、Cなどに移動します。デバッグレターと期待どおりの動作を比較します。

それ以外には、ブレークポイントやコードのステップはありません。Arduinoは、AVR atmegaチップ、ブートローダー+開発環境、および大量のソフトウェアライブラリを備えたボードに過ぎません。残念ながら、ブートローダーを使用すると、デバッグ機能が制限されます。


0

serial.printより制御された方法を使用するには、デバッグのオンとオフを切り替えるグローバルブール変数を定義できます。の行は、デバッグフラグがオンの場合にのみ実行されるステートメントserial.print内にラップされますif。このようにして、コードが終わった後でもデバッグ行を残すことができますが、後でデバッグフラグをオフに設定してください。


0

直接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を使用することを防ぎます。


0

LEDを点滅させ、シリアルポートに印刷し、一度に数行のコードの小さなセクションを書き込み、デバッグします。

モジュール化できる場合があります。たとえば、Cの場合、ホストコンピューターや他のプロセッサのハードウェアに影響を与えない計算関数を開発してテストしたり、関数をテストベンチでラップして入力を供給したり、出力をチェックしたりできます。

もう1つの同様の方法は、1つにアクセスできる場合は命令セットシミュレーターを使用することです(そうでない場合、それは非常に教育的でやりがいのあるプロジェクトです。それらのいくつかを実行した後、1〜2週間のうちに1つ実行できます)。誰かがプロセッサのVerilogまたはVHDLクローン(OpenCoresなど)を持っている場合は、GHDL、Verirator、またはIcarus Verilogを試すことができます。関心のある周辺機器を含めるのに十分近い場合があり、内部で何が行われているのかを信号レベルで確認できます。

おそらくそれは完全なクローンではないかもしれませんが、それで十分かもしれません。Verilatorを使用すると、C / C ++でペリフェラルを非常に簡単に作成できるため、AVRデバイスを接続したものをシミュレーションできます。

UART出力、LEDの点滅、GPIOラインの点滅、オシロスコープまたは電圧計の使用。クレイジーにならないための鍵は、コードの小さなセクションを書いてデバッグすることです。私は一度に10行を記述し、1000行よりも100テストを実行し、それらをすべて一度にデバッグすることをお勧めします。特に、ほとんどのデータシートやプログラマーを見つけた場合、ハードウェアのリファレンスマニュアルは常に正しいとは限りません。常にいくつかのハッキングが必要です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.