ベアメタルコードの標準的なテスト方法はありますか


8

レジスタに書き込むときに問題が発生する可能性がほとんどないため、ベアメタルコード、特にデバイス/ペリフェラル初期化コードなどにテスト方法があるかどうかを知りたいです(すべてのアドレスが正しくマッピングされていることがわかったら)。また、この種のコードは通常、デバイスが単一の機能のみに構成されている場合、ブランチ/パスがほとんどないため、ここでどのような種類のテストが必要または適用可能ですか?

回答:


11

新しいボードで内部発振器または外部水晶のどちらを使用しているかを最初に確認することは、クロック周波数が正しく設定されていることです。UART、SPI、I2C、タイマーなどのペリフェラルの多くがそれに依存しているため、これは重要です。

私がそれを確認する方法は、サイクルを手動でカウントできるアセンブリ言語で、または分解リストを取得して同じことを実行できる限りCの短いループでプログラムを書くことです-そしてLEDをオンにしますとオフ。1秒に1回実行されるようにループを設定しました。コードを実行し、LEDが1分間に60回点滅することを確認します。

周辺機器に関する限り、それらをチェックする最良の方法は、オシロスコープがある場合はそれを使用し、UARTのRXライン、SPIのCLK、MOSI、チップ選択ライン、およびSDAとSCLラインを確認することです。 I2C、そしてラインがトグルしていてタイミングが正しいように見えることを確認します。

オシロスコープがない場合は、これらのラインにLEDを配置してから、周辺機器を有効または無効にすることができます。無効にすると、ほとんどのラインがロー(LEDオフ)になりますが、RXリードのように一部はハイになりますUART(LEDオン)の。周辺機器を有効にすると、ラインがトグルするため、ほとんどのLEDが暗くなるはずです。ループ(無効/有効)で実行することで、onまたはdimの違いを簡単に確認できます。

UARTの場合は、TXラインをRXラインにループアラウンドとして接続できます。また、UART-USBケーブルに接続し、PCの実際の端末にRealTermのようなプログラムを接続することもできます。インターフェースのテストに加えて、これは後で他のデバッグに役立つでしょう。

他のコードについては、必要に応じて複数のLEDを使用して、コード内のさまざまなパスが実行されていることを示しています。UARTが機能していて、PCに接続している場合は、サブルーチンを呼び出してコードを散布し、プログラムが到達したポイントを示すメッセージを出力できます(または、標準のCライブラリがある場合は、printfを使用します)。しかし、Vladimir Craveroが以下のコメントで指摘しているように、これはコードをいくらか遅くする可能性があります(1文字の時間は10 µs未満であるため、115,200ボーで、それほど多くありません)。しかし、ISRやその他のタイムクリティカルなコードでは、LEDを使用してください。

以下のコメントでAl Bundyが指摘しているように、特に複数のブレークポイントを設定できる場合はインサーキットデバッガーも役立ち、変更されているメモリ位置にブレークポイントを設定できる場合はさらに便利です。すべてのデバッガにその機能があるわけではありません。

ただし、たとえばペリフェラルレジスタのビットを確認する必要がない限り、デバッガはあまり使用しません。または、検査で見つけられないバグを追跡すること。または初歩的なコードカバレッジ分析。しかし、一般に、プログラムを「通常の」速度で実行するのが好きです。多くの問題が通常表示されるため、プログラムがシングルステップの場合はそうでない場合があるためです。私のプログラムのほとんどは割り込みを頻繁に使用するため、デバッガーの使用が妨げられます。


あなたはほとんどすべてを言った、私は通常fprintfであなたのコードをまき散らすことはそれをかなり遅くすることを追加します、それはあなたが必要でありそしてあなたが何をしているのか知っているならあなたが使うべきものです。ISRなどのfprintfに関するいくつかの質問を見ました(そしていくつかの問題がありました)。
Vladimir Cravero

@VladimirCravero同意する-それがLEDを使うのと同じような理由です。
tcrosley

答えてくれてありがとう。シミュレータのみで実際のハードウェアがない場合に、コードカバレッジに使用するツール/設定に関するポインタはありますか?
穴居人2015年

debugguerはどうですか?言及する価値はありませんか?
Al Bundy

2
@AlBundyたとえばペリフェラルレジスタのビットを確認する必要がない限り、デバッガをあまり使用しません。または、検査で見つけられないバグを追跡すること。または、OPへのコメントで述べたように、基本的なコードカバレッジ分析を実行します。しかし、一般に、プログラムをシングルステップで実行しない場合は多くの問題が発生するため、「通常の」速度でプログラムを実行するのが好きです。私のプログラムのほとんどは割り込みを頻繁に使用するため、デバッガーの使用が妨げられます。これらのコメントのいくつかを私の回答に追加します。
tcrosley
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.