[組み込み] 初心者の組み込み開発覚え書き

仕事で組み込み開発のオファーが来る頻度は多くない。時間が許せば個人的にマイコンを使った電子工作をやりたいけど正直時間が無い。そんな中、今回PICを搭載した流体系のコントローラーの開発に参加する機会があり、組み込み開発初心者であるが故にさまざまな問題に直面した。今思えば、ある程度経験があれば避けられた問題ばかり。自分の戒めの意味をこめて、今後同じ間違えを犯さないように覚え書き。

1) ハードを受け取ったら、まずハードの動作確認を

ハード担当者から受け取ったプロト基板は正しく動作するという前提でソフトのデバッグ作業を始めてしまったために、ハード的な実装や配線のミスにより周辺機器が動作しないことをソフトのせいだと思い込み、ソフトの確認に散々時間を費やした挙句にやっと「もしかしてハードの不備?」と気づく始末で、結果として途方もなく時間を浪費してしまった。ハードを受け取ったら、その見栄えや実装がどんなに美しくても、必ず基本動作をチェックしてからソフトのデバッグを開始するべき。簡単なテストプログラムを作成し、入力ポートに接続されているスイッチやセンサからステータスが取り込めるか、出力ポートに接続されているLEDやリレーが駆動できるか、シリアルポートにキャラクタが出力できるか、など、ハードの基本動作に限った確認を最初に行い、「ハードは問題ない」と確信を持ってからソフトのデバッグ作業に入ること。

2) ソフトのデバッグを始める前にマイコンの基本機能を確認する

今回マイコンとして40ピンのPICを使ったけど、発注元の都合で開発途中でチップの種類が変更された。これは僕の手落ち以外の何者でもないけど、プログラマは変更されたチップに合わせて設定変更したものの、コンパイラ側の設定は以前のチップのままだったため、アナログポートを読む組み込み関数を呼ぶと戻ってこないという問題に直面。最初は原因がわからず途方にくれましたが、一晩徹夜しても理由がわからずに設定を疑い始めたところでチップの種類が誤っていることに気づき、設定変更したところ動くようになった。実際のソフトのデバッグを始める前には、簡単なテストプログラムを作成してタイマーやA/D入力、割り込みを使っているならば割り込みの動作を事前に確認しておいたほうがよい。

3) 上級言語を使う場合にはコンパイラのクセを知ること

僕は組み込みでもC言語やBASICを使いたいと思うけど、心配なのはコンパイラのクセ。実績があるコンパイラならば、コンパイラ自体のバグは少ないだろうけど、上級言語をどのようにアセンブラに展開するかはコンパイラ次第。初期の段階で必ずリストを生成して目を通し、ステップ数が多いアセンブラに展開されている命令は「遅い処理」として自覚する必要あり。特に製品としてのフェイルセーフを考えると、トラブル検知に時間がかかったり、周辺機器を安全に停止させるのに時間がかかったのでは、その間に不慮の事態に陥る危険性が生ずるので危険。今回は流体系の処理で異常高圧を検知してシステムを緊急停止させる処理があったけど、停止までの時間が数百ミリ秒もかかっていることが判明し、上級言語で書いた数行の命令がアセンブラでかなりのステップ数に展開されていることに起因していることがテスト段階になって露呈した。

4) 作成したテストケースに漏れがないか、これでもかというぐらい確認する

基板には複数のボタンが載った操作パネルが接続されるけど、順番にボタンを押す組み合わせに漏れがあって、その漏れているところがバグった。全ての組み合わせがテストケースで網羅されているか、チャートなどを作成してこれでもかというぐらい確認することが大事。テストに時間を掛けてもケースが漏れていたのでは意味がない。