オブジェクト指向分科会で話をしていた、「main」を呼び出すのものについて考えて見ます。もちろん、Windows上で_tmain()を呼び出すものはWindowsそのものですので、この時点はWindowsが神ですね。
じゃ電源入れたときにはどうなるのよ?
(ごめんなさい、またしてもAT系の話じゃありません。やつはBIOSが起動Program Counterにいるのでよくわかってないです^-^;)
ここでは、とりあえずSH-3とかいうマイコンでありながら内蔵ROMを持っていないPCみたいなマイコンで取り上げてみます。
ここで行われることは、
電源On -> FLASHROMからの読み出し -> RAMへ展開 -> 展開されたRAMのmainにPCを移動。
になります。もちろんここでのmainはOSのmainかもしれないですし、メッセージループを待る単なるループプログラムかもしれません。
1.電源On
この時点では、CPUのプログラムカウンタが0x00000000に固定されていて、このメモリ番地に実行可能なプログラムを配置します。(この時点ではRAMも使えないですし、周辺回路も当然動きませんので、最低限の設定をCPUにセットすることにします。)
ここでやることは、
・周波数の設定
・RAMのアクセス速度の設定、外部I/Oのアクセス速度の設定
・キャッシュレジスタの設定
・SDRAMのクロックレイテンシ、リフレッシュタイマの設定、プリチャージの設定
・C言語のスタック領域の確保とレジスタの設定
・次のステージへJUMP
と、いったところでBIOSみたいな部分になります。
2.RAMへ展開
ここからは、スタックがセットされたのでC言語で記述可能です。
SDRAMや周辺回路へのアクセスが可能になった時点で、FLASHROMからSDRAMへプログラムとデータを展開します。当然、FLASHROMに格納されているプログラムが指し示すポインタは、すべてSDRAMへの展開後のポインタでなくてはいけないです。
プログラムを展開したところで、割り込みのアドレスを設定します。例外が発生したときや、シリアル入力などにジャンプするアドレスをすべて定義します。
3.mainにJump
ここでやっと、mainに飛べます。
ここではスタックを一旦リセットしたいので、mainの実ポインタを引数に設定してStart( main )を呼び出すような記述をします。
_Start:
JMP @R4
NOP
.END
といったところ。意外と面倒くさいんですねぇ。
投稿日時 : 2007年7月23日 9:27