[H8奮闘記 SRAM動作のアプリを C で作る(その1)]

SRAM上でアプリを動作できるようになったので、ROM更新回数制限を気にしなくて
済むようになりました。しかし、これまでは全てアセンブラによるアプリ制作です。
アセンブラによるアプリ制作は、速度が必要な場合・厳密なクロックを知りたい場合
などには便利ですが、ちょっとした実験をしたい場合や複雑な構造を持たせる場合など
には不向きです。

アセンブラでもいろいろとライブラリを揃えていけば、それほど難解にはなりませんが
数式をわかりやすく記述できないとか、レジスタに名前を付けられないとか、できあがっ
たソースが分かりにくくなる傾向にありますね。
幸いなことに、AKI-H8 のセットには、Cコンパイラと BASICコンパイラが付属しています。
BASICコンパイラはまだ見ていませんが、 Cコンパイラの方はこれまで使ったアセンブラと
相性が良いようです。

先のブートローダのテストプログラム biostest を C で書き直してみました。
biostest

Cコンパイラの入った CD の内容を、HDD のどこかへコピーして、CC38H.EXE のある場所に
アセンブラ CD の ASMフォルダの内容をコピーしておきます。
CC38H.EXE のある場所に biostest フォルダがくるように biostest.zip を解凍します。
これで、biostest/mk.bat を実行すればコンパイルされます。

アセンブラでは、.section 疑似命令により「セクション名」を付けて、領域の種類を区別
していますが、C では、このセクション名が決めうちでふられています。

P ... プログラム領域
C ... 定数領域
B ... 未初期化データ領域
D ... 初期化データ領域

SRAM上で実行させるので、リンカの SUB ファイルに次のように記述します。

start P(200000), C(260000)

biostest では、静的変数を使わないため B と D セクションはありません。
定数領域 C には、"Hello, world!" などの文字列が格納されています。
この記述では、P を 0x200000 (SRAMの先頭アドレス), C を 0x260000 (SRAMの後半)に割り
当てています。
ブートローダがメモリへ書き込むので、必ず RAM のアドレスでなければなりません。
内蔵RAM も使えますが、内蔵RAM の前半 256byte は疑似割り込みベクタなので割り込みを利用
する場合には、ここにデータなどを置くことはできません。また、内蔵RAM の後半はスタック
に利用しているので、スタックの内容を破壊するような高いアドレスを指定すると、ブートローダ
自身がロード中に暴走してしまいます。
SRAM は、0x200000〜0x27FFFF の範囲で存在するので、普通は P, C, B, D のいずれもこの場所を
指定すべきです。そうすればスタックを大量に使わない場合、C 側でスタックの初期化も必要な
くなります。(ブートローダが設定した内蔵RAMスタックをそのまま利用するため)

SUB ファイルには実行開始アドレスも記述できます。

entry _main

これで、ダウンロード直後に _main へ飛ぶようになります。
ただし、この場合注意すべきは C の「静的変数は 0 で初期化されている」という仕様を満たして
いない点です。
0 初期化を期待しているようなアプリの場合は、entry でいきなり _main へ飛ばずに、B セクション
ゼロクリア処理を行うアセンブラルーチンを entry に記述し、そのアセンブラルーチンから _main へ
飛ぶのが良いでしょう。

CC38H.EXE のマニュアルには「D セクションを ROM と RAM に二重にもつ」と書かれていますが、
SRAM 実行の場合は、最初から RAM (SRAM) なので、二重にもつ必要はありません。ダウンロード時に
MOT ファイルに書かれている内容が、SRAM の目的の場所に書き込まれ初期化された状態になり、
実行時はそのまま更新できるからです。
(ROMアプリの場合は、起動時 RAM 内容が不定なので必要に応じて RAM 内容を初期化して RAM側を
使うようにしなければなりません)

SUB ファイルの中に print文を記述しておくと、そこで指定したファイル名の map ファイルを生成
してくれます。

print biostest

通常は必要ありませんが、SRAM 512KB をめいっぱい使いたい場合には、各セクションの開始アドレス
を厳密に決めたくなります。そのときに、まずおおざっぱ(512KBに収まってなくても言い)にビルド
して、map ファイルを作ってしまいます。すると、map ファイルには各セクションのサイズが記述され
ているので、それを参考に余分な隙間を詰めてギリギリの開始アドレスを記述してビルドし直します。
こうすることで、無駄なく SRAM を使うことができます。

[前へ][▲上へ][次へ]