最近手をつけれていなかったH8で自作OSを作る勉強を再開しました。
「12ステップで作る組込みOS自作入門」
を読み進めながら1月上旬くらいまで続けて勉強していたのですが、6thステップで
うまく動かなくなりはまっていました。
ロードするプログラムについて、
XMODEMの転送は無事完了し、その後のELFフォーマット解析も問題なく動いていました。
ところが、ロードしたプログラムのエントリポイントがなぜか0になってしまいました。
いろいろ調べてみると、ロードしたプログラムのBSS領域の準備のためにメモリを
0で初期化した後でエントリポイントも0になっていました。
「メモリ領域をつぶしている!」
と思い
ブートローダ側のプログラムのサイズを見てみるとなんと、13KB程になっていました。
私は書籍のソースをコードにデバッグ用のシリアル出力を行うなどいろいろ遊びすぎて
しまっていたようです。
このトラブルでショックを受けた私は、やる気がなくなってしまい。
「また気がむいたら再開しよう。。。」
と匙をなげて、RubyやFlashのコードを書いて遊んだり本を読んだりしていました。
最近になって、このままではやっぱり駄目だと思いH8の勉強を再開し、
改めて書籍のコードをよく見るところからはじめたのですが、
オリジナルのMakefileを見ていて大事なことに気がつきました。
オリジナルのMakefileのコンパイルオプションには
CFLAGS += -Os
というオプション指定があるのですが、私のMakefileにはこれが抜かっていたのです。
GCCの -O はズバリ
「最適化」
しかも
- Osはサイズの最適化らしいです。
気付いた瞬間
「ブートローダのバイナリサイズがやたら大きかったのはこれだったのか!!!」
と思いました。
試しに今まで遊んでいたコードのコンパイルオプションに -Os を付けてみたところ
バイナリサイズが半分くらいになりました。
同時に、いままで最適化について自分がなにも分かっていないということに改めて気付きました。
最適化をかけるとスピードやサイズが良くなるというイメージはありますがちゃんと理解できていません。
※てか、最適化をかけるのはリンカの仕事?誰がかけてくれるんだろう。。
最適化については本でも買って勉強しよみようかと思います。
H8の勉強はMakefileを修正するところから再開だ!
GCCのコンパイルオプションについてももう少しちゃんと勉強しないといけないなぁ。
がんばるぞ〜。