26

C をサポートする単体テスト フレームワークはたくさんありますが、マイクロ コントローラー コード (私の場合は PIC ですが、質問はそれよりも一般的なものだと思います) の単体テストを作成する方法に少し困惑しています。

マイクロ コントローラー用に記述されたコードの多くは、レジスターへの構成とデータ値の書き込み、レジスターからの着信データの読み取り、および割り込みイベントへの応答を中心に展開されます。これに対する最も効果的な方法について、誰かがいくつかの指針を提供できるかどうか疑問に思っています。

4

4 に答える 4

36

あなたが書く;

「マイクロコントローラー用に書かれたコードの多くは、構成とデータ値のレジスターへの書き込み、レジスターからの受信データの読み取り、および割り込みイベントへの応答を中心に展開しています」.

これは実際にはよくあることに同意しますが、実際にはこれが良いことだとは思いません。物事を少し考え直すと、テストの目標を達成するのに役立つと思います。

おそらく、マイクロコントローラーのプログラマー好きなときに手を伸ばしてハードウェアに触れることができるため、多くの (ほとんどの?) プログラマーは、コード全体でまさにそれを行う習慣を身につけています。多くの場合、この習慣は疑う余地なく守られています。おそらく、この種の作業を行っている非常に多くの人々が、トレーニングや傾向によってコンピューター サイエンティストではなく EE であるためです。私は知っています、私は自分でそのように始めました。

私が言おうとしているのは、マイクロコントローラ プロジェクトは、他のソフトウェア プロジェクトと同じように適切に設計できるし、適切に設計する必要があるということです。優れた設計の非常に重要な部分は、ハードウェア ドライバーへのハードウェア アクセスを制限することです。レジスタの書き込み、割り込みへの応答などを行うすべてのコードをモジュールに分割し、ソフトウェアの残りの部分にハードウェアへの適切でクリーンな抽象化されたアクセスを提供します。ロジック アナライザー、オシロスコープ、カスタム テスト リグ、またはその他の適切なものを使用して、ターゲット上でこれらのドライバー モジュールをテストします。

非常に重要な点は、ソフトウェアの残りの部分 (できれば大部分) が、ホスト システムで実行およびテストできる単なる C コードになっていることです。ホスト システムでは、テスト対象のコードが何を行っているかを可視化できるように、ハードウェア モジュールがスタブ アウトされます。このコードでは、主流の単体テスト アプローチを使用できます。これにはいくつかの準備と作業が必要ですが、よく整理されていれば、すべてのプロジェクトに適用できる再利用可能なシステムを作成できます。潜在的なメリットは計り知れません。ここで、これらのアイデアについてもう少し詳しく書きました。

[ http://discuss.joelonsoftware.com/default.asp?joel.3.530964.12][1]

于 2009-06-06T03:09:32.790 に答える
3

これに対する 1 つのアプローチは、エミュレーターを使用することです。私は AVR エミュレーターに取り組んできましたが、それを使用するためのアイデアの 1 つは、実際にコードを単体テストすることです。エミュレーターは、CPU とレジスター、割り込み、およびさまざまな周辺機器を実装し、(私の場合) エミュレートされた UART に書き込まれたバイトstdoutは、エミュレーターの通常のアドレスに移動します。このようにして、単体テスト コードをエミュレーターで実行し、そのテスト結果をコンソールに書き込むことができます。

もちろん、エミュレーターが実際の CPU の動作を正しく実装していることも確認する必要があります。そうしないと、その上にある単体テストは信頼できません。

于 2009-06-06T02:20:42.280 に答える
2

レジスタ アクセス関数/マクロのモック バージョンを記述します。*(volatile int*)0xDEADBEEF = 0xBADF00Dこれは、コードが一般的なレジスタアクセス関数のセットを使用していることを前提としており、どこにでもあるようなアドホックなものではないことに注意してください。

テスト コード (一部のアーキテクチャでは問題が発生する可能性があります¹) から割り込みハンドラーを直接呼び出します。利用可能な場合は「ソフトウェア割り込み」を使用し、非同期で実行する必要がある場合はタイマー割り込みハンドラーから呼び出します。これには、モックアップできる関数/マクロで割り込みを有効/無効にするコードをラップする必要がある場合があります。

¹ 8051 が頭に浮かびます。少なくとも Keil 8051 コンパイラでは、割り込み関数を直接呼び出すことはできません。ただし、これは C プリプロセッサで解決できます。

于 2009-06-06T02:32:19.743 に答える
0

コントローラー自体を使用して、テストできるイベントを生成できるようなループバック モードはありますか?

于 2009-06-06T02:19:05.667 に答える