先日 Atmel 社のワンチップマイコン Atmega168 で Tumblr 新着件数表示ボードを作り、ソースを公開しましたが、このために統合開発環境 WinAVR で私が書いたコードは PC で作成するプログラムと同様に main 以降の関数と割込関数だけでした。
通常の PC や UNIX サーバでユーザプログラムをリンクすると通常は書いたプログラムにスタートアッププログラムがリンクされて実行バイナリができあがりますが、WinAVR で使っている AVR-gcc コンパイラでは自分が書いていないプログラムがどういうふうに組まれてマイコン上で動くバイナリが作成されているのかを調べてみました。
調査対象はビルドしたときに作られるリストファイルです。リストファイルとは拡張子が *.lss のファイルで、中身はテキスト型式で、ビルドされたプログラムについて C 言語との対応がわかるように、対応するアセンブリと機械語が書かれたファイルです。
次に調べたいことですが、こちらは今回私がコードを書かなかった部分の処理がどうなっているかです。つまり、
- 割り込みベクタテーブル
- 電源リセットがかかり、プログラムカウンタがリセットベクタに移ってから main 関数が呼ばれるまでの処理
- main が終わった後の処理(実際には main 内で無限ループなので main は終わりませんが)
- 割り込みが発生し、処理が割り込みベクタに移ってから私が書いた割り込み処理関数が呼ばれるまで
- プログラムのメモリ上の配置
です。
ということで明日以降、上記の項目それぞれがどうなっているのか説明していきたいと思います。PC で言えば「電源ON → BIOS 起動 → OS 起動」に当たる部分でしょうか。今回の Tumblr 新着件数プログラムは OS は使っていないですし、ペリフェラルの初期化も main の中で行っているので完全に同じ対応ではないですが。
よろしければどうぞお付き合いください。












コメントする