[H8奮闘記 H8/3048FにBootLoaderを焼き込む(その1)]
H8のフラッシュロムは、公称 100回の更新回数限界があります。
100回を超えると、いつ更新できなくなるかわからないので不安ですし、たくさん予備を購入
できるほど安価でもありません。更新回数を気にしながらデバッグしていたら、気軽にデバッグ
できなくて、開発効率が落ちてしまいます。
限られたプライベートタイムで開発するには、開発効率の低下は致命的です。
そこで、追加したSRAMと通信ポートを利用して、更新回数を気にせずに動作確認できる環境を
作ることにしました。
電源を投入すると、フラッシュロムから起動するので、そこに「通信ポートからプログラムを受
け取ってSRAMへ転送して実行するファームウェア」を書き込みます。
そんなファームウェアは付属していないので、自作するしかありません。ということで、機能仕
様です。開発効率向上が目的なので、これに時間をかけては本末転倒です。短期間で完成できる
ように機能は必要最低限にとどめます。
機能:
・起動すると直ちに受信待ち状態になる
・受け取るファイルは MOTファイルとする
・通信プロトコルは無し、ベタでただひたすら受け取るのみ
・SRAM上で動作するアプリから割り込みも利用できる
こんなところでしょうか。
■MOTファイルの構造
MOTファイルは、昔から ROM Writer 等で利用されているファイル形式です。中身は、普通のテキスト
ファイルで、1行が1レコード。レコードは S から始まり、レコード種別、バイト長、アドレス、
データ、チェックサムの順で並んでいます。
ま、詳しく知りたい人は「モトローラS形式」等で検索してみてください (^_^;
■割り込み
H8 の割り込みは、割り込みベクタ方式を採用しています。
割り込みベクタテーブルと呼ばれる「サブルーチンアドレステーブル」が決まった場所にあり、割り込
み信号が入力されると、その割り込みに対応したサブルーチンアドレスをテーブルから取り出して、そこ
をコールするという仕組みです。
H8 の割り込みベクタテーブルは、H'000000 〜 H'0000FF にあります。4byte が1アドレスで、64種類の
割り込みに対応しています。といっても、64種類のうちいくつかは Reserve ですし、配線してない IRQ
などは無関係なので、実際にはその半分も使いませんが。
で、この割り込みベクタテーブルのアドレスとメモリマップを見比べてもらえばわかりますが、フラッシュ
ロムの位置です。
H8はフラッシュロムを無効にすることもできますが、ReadOnlyとは言え、せっかくのメモリを使わないのは
もったいないです。
そこで、H8内蔵RAMの中に、別途割り込みベクタテーブルを用意して、割り込み処理ルーチンの中でRAM上の
テーブルを参照してコールするラッパーを噛ませて対処することにしました。
これによる利点は、割り込み処理ルーチンを気軽にすり替えられることにありますが、実はもう一つ利点が
生まれます。
割り込み処理ルーチンは、rts 命令ではなく rte 命令で復帰せねばなりませんが、rte はラッパーから抜ける
時に実施するため、ラッパーから呼ばれる側は普通の rts戻りのサブルーチンで済むことになります。
これによって、Cで作成した普通の引数無し関数を割り込み処理ルーチンとして利用できるようになります。
図の int. wrapper へ飛ぶための割り込みベクタテーブルは ROM の H'000000〜H'000100 に記録しておきます。
そして、int. wrapper は、ソフト的に用意した内蔵RAM上の擬似的な割り込みベクタテーブルを参照して、
アプリケーション定義の割り込み処理ルーチンを jsr します。
アプリケーション定義の割り込み処理ルーチンは、jsr でサブルーチンコールされただけなので、普通に
rts で int. wrapper へ戻ってきます。
int. wrapper は、内部的に rte して、割り込み発生時の位置へ戻ります。
擬似的な割り込みベクタテーブルは、起動時に「エラー表示ルーチン」のアドレスで埋め尽くします。
エラー表示ルーチンは、エラーである旨といくらかの情報を液晶へ表示します。
こうすると、割り込み処理ルーチンを未設定のまま、誤って割り込みを有効にしてしまった場合に原因を
つかみやすくなります。
■分割アセンブル
AKI-H8 に付属のアセンブラは、分割アセンブルにも対応しているので、ソースを分割して見やすく記述
することにしました。
分割すると、1つのソースの行数が 100〜500行程度に収まり、ソース間のやりとりも明確に分離していれば
アセンブラといえども、それほど難解にならずにコーディングできますし、簡単に再利用できるので、
後々にも便利です。
ちなみに、私は「TAB幅」を半角4文字で書くのが好きなので、私のソースを見るときは、エディッタを
そのような設定にしてご覧ください。
[前へ][▲上へ][次へ]