« 日立SH2モニターにユーザープログラム追加(1.まえがき) | トップページ | Wild Dog 歩行など動画追加 »

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にロードするユーザープログラム側にのみここまでの変更を加えて動作することをひとまず確認しました。

|

« 日立SH2モニターにユーザープログラム追加(1.まえがき) | トップページ | Wild Dog 歩行など動画追加 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/123969/14130937

この記事へのトラックバック一覧です: 2. ユーザーベクタの扱い:

« 日立SH2モニターにユーザープログラム追加(1.まえがき) | トップページ | Wild Dog 歩行など動画追加 »