TRAPのテスト 編(み) yamaguchi@cqpub.co.jp ● このプログラムは  Interface 2006年6月号SH-2基板を使ってTRAPA命令を実行し,正しい例外ハン ドラを実行していることを確認するテスト・プログラムです.  何かの役に立つわけではありません. ● 使い方  FDTでtrap.motを書き込みます.ジャンパを外した後にリセットして起動しま す.LEDが点滅すればOKです. ● コンパイル方法  開発環境としてInterface 2006年7月号特集第4章掲載のGCCが必要です.イン ストールは該当記事を参照してください.また,/usr/local/sh-tools/binにパ スを通してください(p.80に方法がある).パスを通さない場合はMakefileを修正 してください.  makeするとダウンロード用バイナリ・ファイルtrap.motが生成されます.  ソース・ファイルの文字コードはEUCになっているので,編集をする場合は注 意してください. ● プログラムについて  GCCでプログラムを書いてみるテストと例外ハンドラを自分で書いてみるテス トを兼ねて作ってみました. ▼TRAPA例外の流れ  TRAPAを発行して例外を発生させます.プログラム中でTRAPA #0x20を実行する と,startup.sの_trapa_0x20へ分岐してきます.  「TRAPA #20を実行したときにジャンプするアドレス」はアドレス0x00000080 に設定します(SH 7144Fのマニュアルの5.1.3例外処理ベクタテーブルの表5.3を 参照のこと).ここではstartup.sの_trapa_0x20へ飛ばしたいので,   .org  0x00000080   .long _trapa_0x20 /* TRAPA #0x20 */ のように書いています.  _trapa_0x20ではレジスタをスタックに保存した後,trap.cのtrapa_0x20_func ()へ分岐します.ここではLEDを反転させるコード,   *io_port_E = *io_port_E ^ (1 << 15); を実行します. ▼C言語でTRAPA命令を記述する方法  C言語で直接TRAPA命令を記述することはできないので(HEWではライブラリ関数 でできたと思ったがGCCではできない),   asm ("TRAPA #0x20");/* 実行するたびにLEDの状態が反転する */ としてC言語ソース中にTRAPA命令を埋め込んでいます.gcc -S trap.cとしてア センブラのソースを出力させてみると,   .L12:     TRAPA #0x20     bra .L9 のように,無事にTRAPA命令が埋め込まれていることが確認できます. ▼その他 ・Interface 2006年7月号掲載の山際伸一氏作成のpractice2を参考に(というか ベースに)しました.ありがとうございます. ・practice2は割り込みベクタ・テーブル上にプログラムを置いていたので(まあ ,該当する割り込みが掛からなければ問題ないのですが),.org 0x00000400とし て0x00000400からプログラムを置くようにしました ・make時に/usr/local/sh-tools/bin/sh-elf-gcc〜と長々と表示されるのが気に なったので,パス名部分を取ってしまいました. ・make cleanでバックアップ・ファイルも削除するようにしました. ● 保証事項  本ソフトウェアは無保証とさせていただきます.