JSPプログラムをASPへ置き換える(割込み編)
TOPPERSはドライバもアプリケーションの一つなので前のエントリーでもよかったけど、別立てに。
ASPからはTOPPERS割込み標準モデルに準拠したのが大きいわけでこれによるドライバ周りの修正が必要になる。
TOPPERS割込み標準モデルに関する情報は
- TOPPERSサイトの早期リリース扱い*1になっているTOPPES標準割込み処理モデル。
- 技術ドキュメントに上がっているTOPPERS新世代カーネル統合仕様書。
- ネクセスブログで石田先生が書かれている内容が参考になる。*2石田先生のブログは必読でしょう。
でここでは、JSPの割込みをASPにする場合にどうしたかを簡単に書いてみる。
ASPでは新たに割込み要求ラインの設定(CFG_INT)という静的APIが増えた。これは割込みの属性(エッジ/レベル)や割込み優先度を設定するものだ。JSPではATT_INIなどで自分たちが書いていた割込み要求ラインの処理をAPIにお任せするというわけだ。なのでATT_INIで書いていた該当コードを外して、CFG_INTで記述すればよい。
まずは一度ターゲット依存部のCFG_INT処理を見てみる。自分で記述した処理とは違う方法で実装されている可能性があるので。ちなみにARMの実装はasp\arch\arm_gcc\at91sam7s\chip_config.cのx_config_int()にあった。
また割込み優先度が規定されたのでモデルとは異なる値を記述していた場合にはその修正も必要になる。
ATMELのPIOの割込みを使うために以下のような関数を用意してATT_INIで呼び出していた。
int_pioa_init(VP_INT ilvl) { sil_wrw_lem((VP)(TADR_AIC_BASE+TOFF_AIC_IDCR), (1<<INTNO_PIOA_PID)); sil_wrw_lem((VP)(TADR_AIC_BASE+TOFF_AIC_SMR+INTNO_PIOA_PID*4), AIC_SRCTYPE_INT_LEVEL_SENSITIVE); sil_wrw_lem((VP)(TADR_AIC_BASE+TOFF_AIC_ICCR), (1<<INTNO_PIOA_PID)); sil_wrw_lem((VP)(TADR_AIC_BASE+TOFF_AIC_IECR), (1<<INTNO_PIOA_PID)); }
なのでここではCFG_INTを以下のように記述することでごっそり入れ替えることができる。
CFG_INT(INTNO_PIO, { TA_ENAINT|INTATR_PIO, INTPRI_PIO });
INHNO_PIOとINTNO_PIOの値はターゲット毎に決められているのでchip_user.txtなどの情報を元に
#define INHNO_PIO INTNO_PIOA_PID /* 割込みハンドラ番号 */ #define INTNO_PIO INTNO_PIOA_PID /* 割込み番号 */ #define INTPRI_PIO -1 /* 割込み優先度 */ #define INTATR_PIO TA_LOWLEVEL /* 割込み属性 */
などと定義しておく。