12Stepで作る組み込みOS自作入門 3rdStep
今日は「12Stepで作る組み込みOS自作入門」の3rdStepをやってみた。
「12Stepで作る組み込みOS自作入門」はこの本。
下回りの知識つけたいけど何から手つけていいかわからなかったので、
少し触れたことのあるH8を使っていて、内容的にも面白そうなこの本使って勉強している。
今回の3rd Stepは主にリンカスクリプト、メモリの割り当てとは何かといった内容。
Step2までで作成したプログラムだと、次のような状態になっている。
- プログラムはすべてROMに書き込んでいる状態
->後から書き換えができない。
->静的変数(global変数、static修飾子をつけた変数)は上書きできない。
->Cの文法に則っていても、期待動作しない!! - Stack領域はRAMに割り当てている
->auto変数はstack領域を使用するので問題なく使用可。
そのため、リンカスクリプトを何かを通して上記を修正していく。
ポイントは3つ
- メモリ上に展開されたプログラムは以下の領域から構成される。
実行ファイル(ELFファイル)の内部はSection,Segment二種類の管理単位を持つ。
- Section
リンク時に、各objectファイルが持つ同じ領域の内容をリンカがまとめるためのもの - Segment
プログラムの実行時にloaderが参照し、メモリ上に展開する際に使用されるもの
- Section
初期値を持つ静的変数は最初はROMに値を記しておき、main関数に行く前にramにコピーすることで実現されている。
ポイントまとめるのむずいわ
まぁ文章書き、情報整理の練習の意味合いも含めてるので頑張る
あれ。。。初期値未指定の静的変数のゼロクリア処理したはずなのに、0ではない値が入っている。。。
どこ間違えてるか探さないと。
->ゼロクリア処理の関数名を間違えてました。。。
ついに次はブートローダー作成!!!
sleep復帰時のclock安定化待ちとは?
H8のマニュアル読んでいたら以下の文章が。
ソフトウェアスタンバイモード(clock停止するモード)の解除について以下の記述。
「NMI、IRQ2 ~IRQ0 割り 込み 要求 信号が 入力 され ると 、ク ロック の発 振が 開始 され 、SYSCR の STS2~STS0 ビットによって設定された時間が経過した後、安定したクロックが本 LSI 全体に供給されて、*ソ フトウェアスタンバイモー ドは解除され、割り込み例 外処理を開始します。」
すぐにclockは安定しないらしい。なんで?
以下に関係ありそうな記事。
FAQ 1008974 : クロック発振安定時間(Clock Oscillation stabilization time) – ルネサス エレクトロニクス株式会社
水晶振動子、セラミック振動子を用いて作られた発振回路は、発振成長期間というものを経て安定した発振になるらしい。
発振成長期間中は以下の2点の特徴がある。
- 振幅が小さい
- 高周波の成分がかなり多く含まれている
- つまり、ノイジーなギザギザした波形になるということ。
これにより、マイコン動作のためのclockの規格を満足できない。
疑問
なぜ、高周波成分が多く含まれていると、ダメなの?