H8マイコンで割り込みしよう2 デバックモニタ上で割り込みの実現をしてみる [RX&SH&H8]
前回はHEWのウイザードに従って作成したプロジェクトに、自動的に生成された割り込み関数を使って割り込みを実現しましたが、今回は自力で割り込み処理に関する記述を追加して、それをデバックモニタで利用します。
H8/3694FのRAM上にユーザープログラムをダウンロードしてデバックを行うので、デバックできるプログラムサイズは相当に小さくなってしまい、実用的なプログラムのデバックは困難です。「ならやってみる意味無いじゃん」と思われるかもしれませんが、以外と面白い話も有りますので、宜しければ読んでみてください。
まずその前にデバックモニタで割り込みを実現する概念についての解説を行います。
デバックモニターが稼動しているH8/3694F上に割り込み付きユーザープログラムをダウンロードしたイメージは図の様になります。
これはMAP出力及びデバックモニタの”?”コマンドの出力から描き起こしました。
MAP出力の一部
デバックモニタの”?”コマンド出力の一部
文字の背景色が青のところはFLASH ROM上に置かれ、ピンクのところはRAM上に置かれます。黄色はIOレジスタで、今回の話には関係しません。
さて、H8/300Hマイコンの割り込みベクターの開始アドレスは必ず0番地から開始する必要があります。しかしこのアドレスから始まる領域はFLASH ROM空間でもあり、ユーザープログラムの全てをRAM上に転送する事を前提としているデバックモニタではそのままでは割り込みが使用出来ない事となります。※FLASH ROM上にユーザープログラムやユーザーベクターを”書く”事は一応出来ない事としている。
そこでデバックモニターでは仮想ベクターと言う概念を使う事でユーザー割り込みの実現をしています。
割り込み発生時には、まずデバックモニタ上の割り込み処理が応答します。この割り込みの中では自分自身の割り込みベクター番号が判っているので、その番号に該当するユーザーベクター領域の該当アドレスから実際に行うべき関数の先頭アドレスを読み取り、そのアドレスの先にジャンプします。
例えば割り込み番号が19のタイマーAのオーバーフロー割り込みが発生したとします。
タイマーAのオーバーフロー割り込みの絶対アドレスは0x0026なので、デバックモニタの割り込み処理の中ではUser Vector領域のアドレス+0x0026番地(0xF880+0x0026=0xF8A6)を加算したところから関数の先頭アドレスを取得します。
通常の割り込み処理に比較すれば一手間多い訳ですが、それ以外のところではユーザーがあまり意識しないで割り込みを利用できます。
ユーザーが気にしなければならない点は、ユーザーベクターが必ずデバックモニタのUser Vector領域に一致すると言う点です。
その為にはユーザーがリンカーに対してユーザーベクターを所望のアドレスから配置するように設定してやる必要があります。
次回はその辺りの解説をするつもりです。
H8/3694FのRAM上にユーザープログラムをダウンロードしてデバックを行うので、デバックできるプログラムサイズは相当に小さくなってしまい、実用的なプログラムのデバックは困難です。「ならやってみる意味無いじゃん」と思われるかもしれませんが、以外と面白い話も有りますので、宜しければ読んでみてください。
まずその前にデバックモニタで割り込みを実現する概念についての解説を行います。
デバックモニターが稼動しているH8/3694F上に割り込み付きユーザープログラムをダウンロードしたイメージは図の様になります。
これはMAP出力及びデバックモニタの”?”コマンドの出力から描き起こしました。
MAP出力の一部
*** Mapping List *** SECTION START END SIZE ALIGN CVECT 0000f880 0000f8b3 34 2 P 0000f8b4 0000f949 96 2 D 0000f94a 0000f94a 0 2 C$BSEC 0000f94a 0000f94d 4 2 C$DSEC 0000f94e 0000f953 6 2 R 0000f954 0000f954 0 2 B 0000f954 0000f954 0 2 BSTK 0000f954 0000fa53 100 2
デバックモニタの”?”コマンド出力の一部
? Monitor Vector 0000 - 003F Monitor ROM 0100 - 6B09 Monitor RAM F780 - F87F User Vector F880 - F8BF
文字の背景色が青のところはFLASH ROM上に置かれ、ピンクのところはRAM上に置かれます。黄色はIOレジスタで、今回の話には関係しません。
さて、H8/300Hマイコンの割り込みベクターの開始アドレスは必ず0番地から開始する必要があります。しかしこのアドレスから始まる領域はFLASH ROM空間でもあり、ユーザープログラムの全てをRAM上に転送する事を前提としているデバックモニタではそのままでは割り込みが使用出来ない事となります。※FLASH ROM上にユーザープログラムやユーザーベクターを”書く”事は一応出来ない事としている。
そこでデバックモニターでは仮想ベクターと言う概念を使う事でユーザー割り込みの実現をしています。
割り込み発生時には、まずデバックモニタ上の割り込み処理が応答します。この割り込みの中では自分自身の割り込みベクター番号が判っているので、その番号に該当するユーザーベクター領域の該当アドレスから実際に行うべき関数の先頭アドレスを読み取り、そのアドレスの先にジャンプします。
例えば割り込み番号が19のタイマーAのオーバーフロー割り込みが発生したとします。
タイマーAのオーバーフロー割り込みの絶対アドレスは0x0026なので、デバックモニタの割り込み処理の中ではUser Vector領域のアドレス+0x0026番地(0xF880+0x0026=0xF8A6)を加算したところから関数の先頭アドレスを取得します。
FILE=C:\WorkSpace\sample\mon_int_sample\Debug\vector.obj 0000f8d0 0000f8fb 2c _abort 0000f8d0 2 func ,g * _TRAP0 0000f8d2 2 func ,g * _TRAP1 0000f8d4 2 func ,g * _TRAP2 0000f8d6 2 func ,g * _TRAP3 0000f8d8 2 func ,g * _ADRBRK 0000f8da 2 func ,g * _CPUSLEEP 0000f8dc 2 func ,g * _IRQ0 0000f8de 2 func ,g * _IRQ1 0000f8e0 2 func ,g * _IRQ2 0000f8e2 2 func ,g * _IRQ3 0000f8e4 2 func ,g * _WKP 0000f8e6 2 func ,g * _TAOVI 0000f8e8 a func ,g * _TIMERW 0000f8f2 2 func ,g * _TIMERV 0000f8f4 2 func ,g * _SCI_3 0000f8f6 2 func ,g * _IIC_2 0000f8f8 2 func ,g * _ADI 0000f8fa 2 func ,g *
通常の割り込み処理に比較すれば一手間多い訳ですが、それ以外のところではユーザーがあまり意識しないで割り込みを利用できます。
ユーザーが気にしなければならない点は、ユーザーベクターが必ずデバックモニタのUser Vector領域に一致すると言う点です。
その為にはユーザーがリンカーに対してユーザーベクターを所望のアドレスから配置するように設定してやる必要があります。
次回はその辺りの解説をするつもりです。
ITRONプログラミング入門―H8マイコンとHOSで始める組み込み開発
- 作者: 濱原 和明
- 出版社/メーカー: オーム社
- 発売日: 2005/04/25
- メディア: 単行本
2009-06-16 00:32
nice!(0)
コメント(0)
トラックバック(0)
コメント 0