SSブログ

H8マイコンで割り込みしよう2 デバックモニタ上で割り込みの実現をしてみる [RX&SH&H8]

Img_1425.jpg前回はHEWのウイザードに従って作成したプロジェクトに、自動的に生成された割り込み関数を使って割り込みを実現しましたが、今回は自力で割り込み処理に関する記述を追加して、それをデバックモニタで利用します。

H8/3694FのRAM上にユーザープログラムをダウンロードしてデバックを行うので、デバックできるプログラムサイズは相当に小さくなってしまい、実用的なプログラムのデバックは困難です。「ならやってみる意味無いじゃん」と思われるかもしれませんが、以外と面白い話も有りますので、宜しければ読んでみてください。

まずその前にデバックモニタで割り込みを実現する概念についての解説を行います。


hew_image_50.pngデバックモニターが稼動している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上にユーザープログラムやユーザーベクターを”書く”事は一応出来ない事としている。

そこでデバックモニターでは仮想ベクターと言う概念を使う事でユーザー割り込みの実現をしています。



hew_image_51.png割り込み発生時には、まずデバックモニタ上の割り込み処理が応答します。この割り込みの中では自分自身の割り込みベクター番号が判っているので、その番号に該当するユーザーベクター領域の該当アドレスから実際に行うべき関数の先頭アドレスを読み取り、そのアドレスの先にジャンプします。

例えば割り込み番号が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で始める組み込み開発

ITRONプログラミング入門―H8マイコンとHOSで始める組み込み開発

  • 作者: 濱原 和明
  • 出版社/メーカー: オーム社
  • 発売日: 2005/04/25
  • メディア: 単行本



nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。