書籍「12ステップで作る組込みOS自作入門」実践記。今回は3rdステップです。
Windows 10+Cygwin環境でやってます。
Windows系SEの日記: 【12ステップで作る組込みOS自作入門】Windows 10+Cygwinで実装中
3rdステップでは、H8/3069Fのメモリ構成と静的変数の書き換え対応が主な内容です。
組込み環境でのC言語プログラミングの場合、初期値を持つ静的変数がROMに展開されます。そのままだとその値を書き換えることができません。
なので、静的変数を書き換える処理が存在する場合、静的変数をRAMにあらかじめコピーする処理を自力で作りこむ必要があります。
この辺の処理は、C言語での組込みプログラミングでは定番の処理のようですが、3rdステップではその実装について説明されてます。
理解するうえで、最初悩んだ部分は
ROMの静的変数をRAMにメモリコピーする処理
memcpy(&data_start, &erodata, (long)&edata - (long)&data_start);
の箇所です。
メモリのコピー元(ROMの静的変数格納場所の開始アドレス)がなぜ
&erodata
でOKなのかが最初わからなかったのですが(同じアドレスを指すんじゃないかと最初思いました)、本書のセクションとセグメントの違いに関する記載を再読することで、&erodataがROM側、&data_startがRAM側を指すことが理解できました。
実行結果はこんな感じです。
ちゃんと静的変数も書き換わってます。
一応、前回作成したダンプ関数で静的変数のアドレスも確認してみました。
puts("global_data = ");
putxval(global_data, 0);
puts("\n");
dumphex(&global_data, 2);
puts("\n\n");
puts("global_bss = ");
putxval(global_bss, 0);
puts("\n");
dumphex(&global_bss, 2);
puts("\n\n");
puts("static_data = ");
putxval(static_data, 0);
puts("\n");
dumphex(&static_data, 2);
puts("\n\n");
puts("static_bss = ");
putxval(static_bss, 0);
puts("\n");
dumphex(&static_bss, 2);
puts("\n\n");
本書の記載と同様のアドレスになってますね。