AVRアセンブリ言語の単体テスト


11

アセンブリコードをどのようにユニットテストしますか?

私はヘキサポッドロボットプロジェクトの一部としてシリアルサーボコントローラーに取り組んでいますが、コードは複雑になりつつあります;)とにかく、C ++サーバー開発者としての日常業務で単体テストを使用することに慣れています。私のAVRアセンブリコードに同じ種類のテストを適用しようとしています。私は問題なく動作する方法を見つけましたが(ここを参照)、標準ツールやテクニックが足りない場合は興味があります。

更新:サーボコントローラの完全なソースと単体テストに興味がある方のために、ここで利用できるようになりました

回答:


3

私はこれもエレガントだと説明しますが、私の侵入を許してもらえれば、問題を追加したいと思います。

このような状況で機能する非常に高価なソフトウェアパッケージがあることは知っていますが、私が働いている会社では、必要なことを確実に行わない限り、コストを賄うことはできません。

テスト駆動開発(TDD)は、私が開発について聞いた優れたシステムの1つであり、私はそれを楽しんでいますが、通常、時間を費やす問題は、多くの場合グリッチと呼ばれる複雑な割り込みおよびハードウェアイベントによって引き起こされます。星が並ぶと2時間ごとに問題が発生するのはささいなことのようですが、スマートフォンが週に1回だけフリーズした場合は、エンジニアの名前を呪います。私たちの場合、物事が本当に壊れたときにフィードロットにトレッキングする必要があります。ご想像のとおり、私はそれを避けたいと思います。

サブシステムの機能をチェックするための非常にインテリジェントなソリューションを見てきました。適切に実装されていれば、1週間の50時間のうち3時間は節約できますが、不具合の状況を見つけるインテリジェントな方法があれば、数週間の作業を節約できます。重い負荷の下で時々フィールドで発生する「バグ」を探します。

この投稿はおそらく大きな助けにはならないでしょうが、私はすべてを明らかにすることですべてを解決しやすくなると思います。グリッチの状況を見つけるためのTDDの方法があった場合、それを支払うために数万人を割り当てることができます。-マックス


1
割り込みコードと非割り込みコードの間の相互作用をテストすることについては、実際には考えていません。それは良い点です。メインラインのシリアルコードをテストするのと同じ方法で、割り込み状況の外でPWM生成タイマーの割り込みコードをテストすることを計画していました。そのすべてをカバーできたとしても、私はまだ相互作用を見逃していると思います。私はテスト内から割り込みをトリガーできると思います(タイマー割り込みで簡単ですが、すべての割り込みコードをテストハーネス内のタイマー割り込みで実行するように設定できます)。ささいなことですが。
Len Holgate、

1
私はあなたを誤解するかもしれませんが、私は割り込みと割り込みコードの相互作用に非常に注意を払います。おそらく、アトミック操作をもっと緩やかにする必要がありますが、オプティマイザがあるレベルで害を及ぼすことが示されていません。問題は、ある割り込みが別の割り込みを遅延させるときに発生します。私が学生に役立つ一般的なものは、割り込み駆動のPWM生成です。チップでCompareモジュールを使用するなど、非常に正確な速度が必要な場合、別の割り込みが他の何かに時間を費やしてビジー状態になり、50uSだけ遅れて世界が終わる可能性があります。
Kortuk、2009年

1
場合によっては、優先度を設定したり、内部で割り込みを無効にしてグローバル割り込みを再度有効にしたりすることもできますが、プラットフォームに依存しますが、独自の開発の最も簡単な方法は、割り込みに必要な時間を絶対に必要なものに制限し、通常のコードを実行することです残りの作業。
Kortuk、2009年

1
私の現在のデザインは、提案された新しいデザインと同様に、私のブログで説明されています。現在、タイマー割り込みによって生成されたPWMの64チャネルがあり、他の割り込みはありません。シリアルはポーリングによって行われます。つまり、PWMは非常に安定していますが、シリアルに問題がある可能性があります。私の新しい設計では、UARTの割り込みとPWM生成のタイマーを使用し、割り込みを慎重に再有効化およびブロックして、グリッチのないPWMおよびグリッチのないUART処理を保証します...
Len Holgate

2
私はPWMを例として使用していましたが、この問題が発生したシステムには3つのSPIインターフェイスがあり、SPI接続の1つに使用する3つのチップがあります。4つの異なるポート割り込みがあり、外部チップの状態の変化や他のいくつかの状況が通知されます。インターフェースの数が多いほど、問題は悪化します。
Kortuk、2009年

2

面白い。クリスマスの後、私はPicsを使ってアセンブラを実行することを検討することを計画していました。もう少し時間があれば、システムをよく見ていきます。

私が見ることができる1つの方法は、モックオブジェクトなどを作成および破棄するために、ある種のフレームワークを別の言語でスクリプト化することですが、これをチップ/シミュレーションにどのようにインターフェイスさせるかが問題になります。

しかし、それが面倒になりすぎると、単体テストの利点を上回ってしまい、使用したくないという気持ちになります。


シミュレーター内で機能させることは、コードを個別のファイルに分割し、実際のコードでジャンプするラベルの一部を単に「モック」する方法を見つけるまで、最初のハードルでした。完了したらすべてを投稿します。ユニットテストをコードに組み込むにはしばらく時間がかかりますが、それだけの価値はあります。
Len Holgate、

私はあなたの方法論を検討する適切な機会を得たので、私はそれは非常にエレガントだと思います。Picsよりもコミュニティベースのものが非常に多いため、クリスマス後にAVRSを確認する予定です。AVRアセンブラープログラミング用のまともなLinux IDEとはどんなアイデアか。
Amos、

1
AVR Studio(Atmelの無料ツールセット)の代わりに使用できるGNUツールチェーンがあります。Linuxで実行することはおそらく可能ですが、私はそうする必要はありませんでした。
Len Holgate、

LinuxでのAVRの開発に関するLinux Journalの記事へのリンクを見つけたところです:linuxjournal.com/article/7289
Len Holgate

その記事に関する私の主な懸念は、それが2005年のものであるため、古くなっている可能性があるということです。
Amos、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.