Interface SH-2

2007年3月 4日 (日)

2. ユーザーベクタの扱い

ユーザーベクタはRAM上の領域に置かれ、モニタ側ではUSERセクションとして参照されています。ユーザープログラム側は、VEGAさんの文書にあるled点滅サンプルプログラムを用いて説明します。CVECTセクションとされています。CVECTセクションがRAM上のユーザーベクタアドレスに配置されており、Loadコマンドで書き込まれる際にユーザーベクタも直接書き込まれます。

当初の目的のようにモニタとユーザープログラムを一緒にROMに書き込む場合、ユーザーベクタもROMに記憶しておかなければならないため、この方法が取れません。

そこでユーザープログラム内での手続きにより明示的にユーザーベクタ領域に書き込むことにします。

led点滅サンプルプログラムのvect.cを見ると、void (*const VECT[])(void)という初期値つき変数があり、#pragma section VECTというコンパイラ指令によってCVECTというセクションに配置されるようです。(変数名の方のVECTはセクション名とは関係ありません。)これを書き換え可能な変数にし、必要に応じて関数のアドレスを登録するように変更します。

変更1: vect.c
extern void (* VECT[157])(void);
void int_regist(int id, void (* const v)(void)) {
  VECT[id] = v;
}

#pragma section VECT
void (* VECT[157])(void);
//初期値などを設定しているもともとのVECT宣言部分は削除
変更2: led-1.sub

START  CVECT/FFFFE160などとなっているCVECTをBVECTに。書き換え可能変数(初期値無し)なのでBVECTセクションに配置されるようです。

ユーザープログラムでは次のようにして割り込みハンドラを設定します。

int_regist(96/*TGIA1*/, (void *)ih_TGIA1);

モニタプログラム側には手を加えず、RAMにロードするユーザープログラム側にのみここまでの変更を加えて動作することをひとまず確認しました。

| | コメント (0) | トラックバック (0)

日立SH2モニターにユーザープログラム追加(1.まえがき)

二足歩行ロボット Wild Dogで使用しているCPUはInterface付録のSH-2ボードです。

VEGAさんの文書を参考に増設SRAM上でプログラム開発を進めています。そろそろPCなしで動かせるようにしたいので(言い換えればコールドスタンバイです)方法を検討しました。大まかに分けて次のような方法が考えられます。

  1. SRAM電源をコンデンサでバックアップする
  2. 不揮発性記憶(EEPROMなど)を追加する
  3. SH-2のFLASH ROMに書き込む

1.は昔機械研で秋月H8/3048にRAMを増設していた頃に使っていた方法です。InterfaceのSH-2基板を調べてみたところ、SRAMへの電源だけ分離してダイオードを入れるにはSRAMの足を浮かせる等の加工が必要になり、難しそうです。

2.は機械研のH8用モニタプログラムでサポートされている方法です。メディアによっては多少ロード時間が掛かりますが、マイコン内蔵FLASH ROMの書き込み回数を気にしなくてすむ優れた方法だと思います。

3.はごく普通の方法です。今回はこれを採用します。欲張って、モニタプログラムにユーザプログラムを追加したいと思っています。 モード切替でROMのユーザプログラムを電源ON後すぐ起動できるようにしておき、なおかつモニタプログラムで開発もできるようにします。

作業は現在進行中です。調べて新たに分かったこと等をまとめていきます。推測の域を出ない記述も多くなると思われますので予めご了承ください。

| | コメント (0) | トラックバック (0)