組み込みソフトウェアの開発では、ICE(In Circuit Emulator)というものを使用することがあります。
ICE自体は非常に高価なもので、通常のソフトウェア開発ではなかなか使用する機会が少なく、インターネット上にもICEデバッグに関する情報はあまり多くないように感じていました。ですので、備忘録を兼ねて情報を残しておきます。
問題点の説明
ICEではフリーランさせるための「Go」と命令文を一行ずつ解釈して実行する「STEP」があります。
今回の問題点は
- Goで実行するとプログラムが先に進まないように見える
- なのに、STEPで一行ずつ実行すると先に進むように見える
ということであり、言い換えると、
なぜ、フリーランだと進まないのに、一行ずつ実行する(=一行ずつフリーランする)と先に進むのか?
という疑問が出てきて、分からなくなっているはずです。
「Go」と「STEPを連続実行」の違い
背景にある解釈としては
Goで実行 = STEPを連続実行
と考えていませんか?
もし、この認識があるなら改めましょう。
挙動は異なります。STEPの連続実行では割り込みが入りません。
※ICEによって異なる可能性がありますので、注意。
逆に言い換えれば、GoとSTEP実行で挙動が異なるなら割り込みが関与している可能性大です。
つまり、GoとSTEPの連続実行で挙動が異なる場合はまず割り込みを疑いましょう。
- 割り込みに処理を取られて無限ループに陥っている
- 割り込み処理を行っていないために割り込みから抜けられない、など
結論:ツールの仕様を理解しておくことが大切
ICEはデバッガですが、使えばバグが取り除ける訳ではありません。
システムとツールを理解し、Goの場合はどう動いているのか、STEPの場合はどう動いているのか、といったことをイメージしながら地道にデバッグするしかありません。
とはいえ、実際のソフトウェア開発では、壁にぶつかってみないことには、どこに壁があるのかも分かりません。なるべく壁がないように設計しますが、それでも壁がないことなんてありえません。
このページを読まれた方は組み込みソフトウェアの開発者かと思います。お互い頑張りましょう。
仕事に活用できるプログラミングの考え方を身に着けるために、オススメの本を紹介しておきます。経験を積んだ今だからこそ分かるとても大切な原則をまとめてくれている本です。
ICEデバッグ時にはソースコードも手掛かりとなる
ICEデバッグ時のSTEP実行には、アセンブラレベルで実行する場合やC言語レベルで実行する場合があります。デバッグ中にはソースコードが表示されますので、コードの書き方も非常に大切な手掛かりとなります。以下の記事ではコードコメントの書き方を紹介しています。プログラマとしての考え方を広げるためにも是非一読してみてください。
コメント