IMASK ( Interrrupt Mask )レジスタは、219xプロセッサコアに入ってくる16レベルの割り込み要求を一つ一つ許可/禁止するレジスタです。
図1にビット配置を示します。初期値は0です。
図1 レジスタの構造
以下に各ビットの概略を説明します。詳細については必ずHRを参照してください。
EMU割り込みはエミュレーターが使用しますのでアプリケーションプログラマは使いません。このビットにかかわらず割り込みは発生します。割り込みハンドラは不要です。なお、割り込みベクトルの配置を見ると、このビットはエミュレーションではなくリセットに対応すると考えられます。しかしIMASKにせよIRPTLにせよこのビットをアプリケーションから操作することには意味がありません。したがってまったく無視して結構です。
PWDN割り込みはPLLCTLに対してCPUコアへのクロック供給を停止するような設定を行ったときに発生します。PLLCTLにSTOPALLのような設定を行うと、クロック回路コアに対して割り込みをかけます。この割り込みの中でIDLE命令を実行することでコアへのクロック供給が停止し、低消費電力モードに移行します。HR 3-30にはこの割り込みはマスク不能と書いていますが、HR A-30にはGIEによってマスク可能と書いてあります。
KERNELに関しては不明です。HR C-2の表はSTACK割り込みと順位がひっくり返っているので注意してください。
STACK割り込みはスタックがあふれたときに発生します。ICNTLのPCSTKEビットと関係しています。
UDI割り込みは内蔵ペリフェラルからの割り込み信号線です。
C/C++言語用に以下のインターフェースが用意されています。宣言はsysreg.hで行われています。
// #include <sysreg.h> sysreg_write(sysreg_IMASK, 値) // 値をIMASKに代入します 変数 = sysreg_read(sysreg_IMASK) // IMASKの値を取得します sysreg_bit_clr(sysreg_IMASK, MASK) // MASKの"1"と対応するIMASKのビットを1にします。 sysreg_bit_set(sysreg_IMASK, MASK) // MASKの"1"と対応するIMASKのビットを0にします。 sysreg_bit_tgl(sysreg_IMASK, MASK) // MASKの"1"と対応するIMASKのビットを反転します。
ビットマスクはdef219x.hで定義されています。以下にその部分を引用します。
// Bit Positions #define INT_EMU_P 0 // Bit 0: Offset: 00: Emulator interrupt #define INT_PWDN_P 1 // Bit 1: Offset: 04: Powerdown interrupt #define INT_KRNL_P 2 // Bit 2: Offset: 08: Kernel interrupt #define INT_STKI_P 3 // Bit 3: Offset: 0c: Stack interrupt #define INT_INT4_P 4 // Bit 4: Offset: 10: Off-Core #define INT_INT5_P 5 // Bit 5: Offset: 14: Off-Core #define INT_INT6_P 6 // Bit 6: Offset: 18: Off-Core #define INT_INT7_P 7 // Bit 7: Offset: 1c: Off-Core #define INT_INT8_P 8 // Bit 8: Offset: 20: Off-Core #define INT_INT9_P 9 // Bit 9: Offset: 24: Off-Core #define INT_INT10_P 10 // Bit 10: Offset: 28: Off-Core #define INT_INT11_P 11 // Bit 11: Offset: 2c: Off-Core #define INT_INT12_P 12 // Bit 12: Offset: 30: Off-Core #define INT_INT13_P 13 // Bit 13: Offset: 34: Off-Core #define INT_INT14_P 14 // Bit 14: Offset: 38: Off-Core #define INT_INT15_P 15 // Bit 15: Offset: 3c: Off-Core // Bit Masks #define INT_EMU MK_BMSK_(INT_EMU_P ) // Offset: 00: Emulator interrupt #define INT_PWDN MK_BMSK_(INT_PWDN_P ) // Offset: 04: Powerdown interrupt #define INT_KRNL MK_BMSK_(INT_KRNL_P ) // Offset: 08: Kernel interrupt #define INT_STKI MK_BMSK_(INT_STKI_P ) // Offset: 0c: Stack interrupt #define INT_INT4 MK_BMSK_(INT_INT4_P ) // Offset: 10: Off-Core #define INT_INT5 MK_BMSK_(INT_INT5_P ) // Offset: 14: Off-Core #define INT_INT6 MK_BMSK_(INT_INT6_P ) // Offset: 18: Off-Core #define INT_INT7 MK_BMSK_(INT_INT7_P ) // Offset: 1c: Off-Core #define INT_INT8 MK_BMSK_(INT_INT8_P ) // Offset: 20: Off-Core #define INT_INT9 MK_BMSK_(INT_INT9_P ) // Offset: 24: Off-Core #define INT_INT10 MK_BMSK_(INT_INT10_P) // Offset: 28: Off-Core #define INT_INT11 MK_BMSK_(INT_INT11_P) // Offset: 2c: Off-Core #define INT_INT12 MK_BMSK_(INT_INT12_P) // Offset: 30: Off-Core #define INT_INT13 MK_BMSK_(INT_INT13_P) // Offset: 34: Off-Core #define INT_INT14 MK_BMSK_(INT_INT14_P) // Offset: 38: Off-Core #define INT_INT15 MK_BMSK_(INT_INT15_P) // Offset: 3c: Off-Core
IMASKのレイテンシは以下のとおりです。
命令 | IMASK=value; | POP STS; | |
---|---|---|---|
レイテンシ | 2 | 1 |
レイテンシが1のとき、直後の命令からその値を使うことができます。レイテンシが2以上のとき、直後の命令でその値を参照しようとすると、古い値を参照します。なお、この表のレイテンシの数え方はHRとは異なっています。
このレジスタにはインターロック機構はついていません。
項目 | マニュアルのページ等 |
---|---|
ビット割り当て | HR A-17 |
レイテンシ | HR A-5 |
割り込みのマスク | HR 3-30 |