IMASK

IMASK ( Interrrupt Mask )レジスタは、219xプロセッサコアに入ってくる16レベルの割り込み要求を一つ一つ許可/禁止するレジスタです。

レジスタの構造

図1にビット配置を示します。初期値は0です。

IMASKの構造

図1 レジスタの構造

以下に各ビットの概略を説明します。詳細については必ずHRを参照してください。

EMU : Emulation-NMI
  • 1,0にかかわらず割り込みはかかります
PWDN : Power Down - GIE Maskable(?)
  • パワーダウン割り込み
KERNEL : Emulator Kernel
  • 詳細不明
STACK : Stack Overflow
  • 1のとき、スタックのあふれやアンダーフローに応じて割り込みがかかります
  • 0のとき、この割り込みは禁止されます
UDI : User Define Interrupt
  • 1のとき、各ビットに関連する割り込みが許可されます
  • 0のとき、割り込み無効です

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割り込みは内蔵ペリフェラルからの割り込み信号線です。

API

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
2191空挺団 | プログラム | EZ-KIT | こぼれ話 | アーキテクチャー | 命令 | レジスタ | DSP掲示板 | FAQ |