main()を呼ぶまでに行うこと

適切に開発環境やひな形となるファイル一式が準備されている場合には意識することはないが,マイコンがリセットされてからc言語におけるmain()を呼ぶまでにはいくつか処理が必要である. これを書いているときにはSH/Tinyにしか興味がないが,どのマイコンにも共通している内容だと思われる.

アドレステーブルの準備

マイコンはリセットされた後,プログラムカウンタ(PC)とスタックポインタ(SP)を セットする必要があるため,特定のアドレスに書かれた数値をPCとSPにセットする. その後はPCに従ってコードが実行される. よって,FLASHの決められたアドレスに, 最初に実行されるべきルーチンのアドレスと スタック初期位置(通常はRAM領域の終端)を書き込む必要がある.

さらに,例外処理や割り込み処理の際に実行される関数のアドレスは, 例外ベクタテーブルなどと呼ばれる領域に書き込む必要がある. マイコンによってはテーブル開始アドレスを変更することができ,ROM,RAM問わず 任意の領域に配置することができるものもある. このテーブルは,例えば,通常のコードとは異なる独自セクションを定義してアセンブリコードで記述し,リンカスクリプトで指定位置に書き込まれるよう指示する方法がとられる.

変数の初期化

リセット直後はRAM領域の値は不定であるので,初期値を代入している変数には初期値をROMから読み出してセットし,初期値を持たない変数には0を代入する. また, c++言語においては静的なクラスのコンストラクタをはじめに呼ぶ必要がある. さらに,ヒープ領域を使用する場合にはその初期値をセットする必要がある. これらの処理をmain()実行に先立って行う必要がある. スタートアップルーチンなどと呼ばれるが,アセンブリコードで記述されることも多いが必ずしもその必要はない. ただし,main()より先に実行するとともに実行後はmain()を呼ぶこと.