約 604,265 件
https://w.atwiki.jp/5757/pages/70.html
用語集 相手の連続的攻撃を、その合間に自分の技を出してとめる行為。発生の早い技や無敵技、投げなどが適している。 聖ソルの場合、割り込みに適しているのはSVだが、無敵時間が長くてもLv1の場合、発生が12Fとかなり遅い。通常投げと織り交ぜよう。 用語集
https://w.atwiki.jp/rokumimi/pages/74.html
■1-8『割り込み行動』 一つ前の行動タイミングで待機状態を宣言またはロールしていた個体は割り込み行動ができます。 割り込み行動は他の個体の行動に対して使用でき、優先的に処理されます。 結果として割り込み先の行動がキャンセルされることがあります。 割り込み行動は一つの行動に対して一回しか宣言できません。 割り込み行動に対して割り込み行動は行えません。
https://w.atwiki.jp/kumikomi-yitjc/pages/165.html
イベントループやポーリング等を使って、イベントの検出や処理(これをハンドリングと言う)することは出来るが、プログラミングしていてイマイチ感がないだろうか? もっとスマートな実装方法として、割り込みを使う方法を紹介する。 割り込みを使うと、イベントの検出はハードウエアがやってくれるので、イベントループは不要となる。 割り込みとは、何らかのイベント(スイッチ押したとか、シリアルからデータが届いたとか)が発生すると、これまで行っていた処理を中断して、イベントに対応した処理を呼び出すという一連の流れを言う。 割り込みにはハードウエアの助けが必須なので、ユーザプログラムが求めるイベントの全てに対応できるわけではないが、スイッチ操作やシリアル通信は割り込みのサポート対象になっている。 割り込みの詳細については、「割り込みとは何者ぞ」などを参照のこと。 シリアル通信で、割り込みを有効にするには、シリアル通信ユニット(USART)の初期化ルーチンを、以下の様にする。 // USARTの初期化 void usart_init() { // 通信速度の設定 (38400bps) UBRR1 = 25; // 受信ユニット、送信ユニットを起動、受信・送信バッファエンプティ割り込み有効 UCSR1B = _BV(RXEN1) | _BV(TXEN1)| _BV(RXCIE1) | _BV(UDRIE1); // ① // データ長=8bit、ストップビット=1ビット UCSR1C = (0 USBS1) | 0b00000110; // すべての割り込みを有効 sei(); // ② } ①_BV(RXCIE1) PCからデータを受け取った時に割り込み発生。 _BV(UDRIE1) 送信時に、UDR1レジスタが空になった時に割り込み発生。(つまり次のデータが書き込める状態)②sei() ①の様に、割り込みには沢山の種類がある。①の設定は、個別の割り込みについての許可・禁止を設定している。 sei()関数は、①で設定した割り込み全体を有効にする。 反対に、すべての割り込みを禁止する場合は、cli()関数を呼ぶこと。 実際に割り込みが発生すると、事前に登録した関数(これを割り込みハンドラと呼ぶ)が呼び出される。これらの関数は、以下の様に記述する。 // データ送信時に、UDR1が空になることで発生する割り込みによって呼び出される関数ISR(USART1_UDRE_vect) { UDR1 = TxBuf; // UDR1レジスタに送信データを書き込み } // データ受信時に発生する割り込みで呼び出される関数ISR(USART1_RX_vect) { RxBuf = UDR1; // UDR1レジスタから受信データを読み込み } 【注意】 割り込みは、割り込みハンドラ実行中にも発生する。(これを多重割り込みという)何らかの処理を実行中に、他の割り込みが発生すると、不具合が生じる場合がある。この不具合が発生する処理の区間をクリティカルゾーンと言う。 クリティカルゾーン内では、割り込みの発生を禁止する必要があるが、必要最小限の範囲にすることが重要である。
https://w.atwiki.jp/gensougisaku/pages/145.html
割り込みの発声と流れ 不発効果を発揮する対象がなくなる 効果を発揮する前に妨害される具体例 割り込みの発声と流れ 『幻想戯作-Land of Amorphous-』ゲーム内では、割り込みという自分の行動を相手の行動中に割り込ませることができます。 その際、相手の行動に割り込む意思を示すために、「キープ!(その他状態を維持して!)」と発声しましょう。 また、この割り込みに対して、更に割り込みを行うことができます。 キープ宣言後、必要ならばコストを支払い、その後効果を発動させます。 相手がそれに対して、更に割り込むか、また自分が更にその効果に割り込むかを続け、 誰も割り込む人がいなくなれば、割り込んで言った順に処理していきます。 不発 ゲーム中に割り込みが発生し、カードの効果が発揮されなくなる不発が発生することがあります。 不発は大きく分けて、「効果を発揮する対象がなくなる」ものと「効果を発揮する前に妨害される」の2パターンがあります。 原則として、 「効果を発揮する対象」がなくなる不発の場合は、そのカードを破棄し、支払ったコストは戻りません。 逆に、「効果を発揮する前に妨害される」場合は、そもそもその行動が成立しないので、支払ったコストが戻ってきます。 効果を発揮する対象がなくなる 1.ユーザAがユーザBの持つ≪都会好きの岩妖精≫に対して、≪鉄拳制裁≫を使用する。 2.ユーザBが「キープ」を宣言、割り込みで≪都会好きの岩妖精≫のスキルを発動 3.ユーザBの手札に戻る 4.ユーザA/B共に他に割り込みがないのか確認する 5.ない場合、割り込みした順番で処理される 6.ユーザBの≪都会好きの岩妖精≫は手札に、ユーザAの≪鉄拳制裁≫は対象が不明となり、不発となる。 この場合は、エイドカードはすでに使用したものとなり、 支払ったコストは戻ってきません。 アタッチメントカードを装着しようとした時、割り込みでその装着対象が倒されたときも、 同様に「効果を発揮する対象がなくなる」の不発となります。 効果を発揮する前に妨害される具体例 1.ユーザAが①CCを行い、≪踊る火鼠≫のスキルを使用する。 2.ユーザBが「キープ」を宣言、割り込みで≪雨曝しの雪女≫のスキルを発動 3.①CCを支払い、ユーザAの≪踊る火鼠≫をCC状態にする。 4.ユーザA/B共に他に割り込みがないのか確認する 5.ない場合、割り込みした順番で処理される 6.ユーザBが持つ≪雨曝しの雪女≫の効果により、ユーザAが持つ≪踊る火鼠≫がCC状態になり、スキル発動不可の状態で不発となる この場合、割り込みにより、スキルが発動しない状態になっているので、そもそも、スキルを使用できない。 そのため、手順1でユーザAが支払った1シンが手元に戻ってくる。 また、相手の割り込みにより、カードが破壊されたときも同様に「効果を発揮する前に妨害される」に入ります。 割り込みはゲームを面白くする要素ですが、ゲームを複雑にする要素でもあります。 相手の行動を妨害したり、自分のカードを強化したりさまざまなことができるので、 この割り込みは理解しましょう。
https://w.atwiki.jp/nicoten/pages/163.html
ニコニコ割り込み にこにこわりこみ 【運営・システム】【ニコス】 ニコニコ割り込みとは、ニコニコ動画のサイト内で動画画面が開かれている場合に、強制的に(動画視聴中ならば割り込む形で)動画・音声などを挿入するニコスクリプト機能。通称ニコ割。 動画視聴中の場合なは動画を一時中断させる場合とさせない場合がある。現在のところ運営側は時報・ニコ割ゲーム・イベント告知などで用いている。 また、08年からユーザーが自分のうpした動画にニコ割を挿入する「ユーザーニコ割」機能が装備されている。 時報に関しては一時中断が非常に不評。中断しない形にすればいいのになぁ。それでも広告には十分だと思うのだが… 関連項目 ユーザーニコ割 タグで動画検索 「ニコニコ割り込み」でタグ検索 動画 (http //www.nicovideo.jp/watch/sm1308283) http //www.nicovideo.jp/watch/sm1308283 な行の単語一覧にもどる トップページにもどる - -
https://w.atwiki.jp/cc65/pages/22.html
while文の中でVBlank待ちをしなくても、.asmで宣言した処理(NMIProc)が毎回実行されます。 #include kihon.h // メイン処理 void NesMain() { const char bgpalette[] = { 0x0f, 0x21, 0x11, 0x20, 0x0f, 0x21, 0x11, 0x20, 0x0f, 0x21, 0x11, 0x20, 0x0f, 0x21, 0x11, 0x20 }; const char sppalette[] = { 0x0f, 0x0a, 0x37, 0x20, 0x0f, 0x0a, 0x25, 0x20, 0x0f, 0x0a, 0x11, 0x20, 0x0f, 0x0a, 0x2a, 0x20 }; InitPPU(); SetPalette((char *)bgpalette ,0); SetPalette((char *)sppalette, 1); //NMI割り込みの設定(flag1の7bitを1に) SetPPU(0x80,0x1e); while (1); } //NMI割り込み void NMIProc(void) { static unsigned char x = 50; x++; SetSprite(1,x,100,1,0); }
https://w.atwiki.jp/kumikomi-yitjc/pages/38.html
H8/3052Fには、様々なハードウエアが組み込まれている。この中で、割り込みを発生する周辺装置(デバイスという)は、以下のように複数ある。 CPUは、これらの周辺デバイスが発生する割り込みを識別して、それぞれに合った処理(割り込みハンドラ)を行う必要がある。このために、それぞれの割り込みに対して、処理する割り込みハンドラを対応付けする必要がある。これを行うのが、割り込みベクタと呼ばれる表で、メモリの特定のアドレスに、割り込みベクタを配置している。(セクションのCVECTBLで、0xFE110から始まる256Byteの領域で、monitor.hの VectorTable配列として定義している。) この場合、ベクタ番号は配列の添字に相当する。 ベクタ番号 アドレス 種類 説明 0 FFE110 リセット 電源投入/リセット入力時 1 FFE114 予約 2 FFE118 予約 3 FFE11C 予約 4 FFE120 予約 5 FFE124 予約 6 FFE128 予約 7 FFE12C NMI マスク不能割り込み(緊急時に利用) 8 FFE130 TRAP0 トラップ命令により発生 9 FFE134 TRAP1 〃 10 FFE138 TRAP2 〃 11 FFE13C TRAP3 〃 12 FFE140 IRQ0 外部割り込み 13 FFE144 IRQ1 〃 14 FFE148 IRQ2 〃 15 FFE14C IRQ3 〃 16 FFE150 IRQ4 〃 17 FFE154 IRQ5 〃 18 FFE158 予約 19 FFE15C 予約 20 FFE160 WOVI ウォッチドッグ(番犬)タイマ。システムの誤動作検出に使用 21 FFE164 CMI リフレッシュコントローラ(DRAM接続時に使用) 22 FFE168 予約 23 FFE16C 予約 24 FFE170 IMIA0 ITUチャネル0 (コンペアマッチ/インプットキャプチャA0) 25 FFE174 IMIB0 ITUチャネル0 (コンペアマッチ/インプットキャプチャB0) 26 FFE178 OVI0 ITUチャネル0 (オーバフロー0) 27 FFE17C 予約 28 FFE180 IMIA1 ITUチャネル1 (コンペアマッチ/インプットキャプチャA1) 29 FFE184 IMIB1 ITUチャネル1 (コンペアマッチ/インプットキャプチャB1) 30 FFE188 OVI1 ITUチャネル1 (オーバフロー1) 31 FFE18C 予約 32 FFE190 IMIA2 ITUチャネル2 (コンペアマッチ/インプットキャプチャA2) 33 FFE194 IMIB2 ITUチャネル2 (コンペアマッチ/インプットキャプチャB2) 34 FFE198 OVI2 ITUチャネル2 (オーバフロー2) 35 FFE19C 予約 36 FFE1A0 IMIA3 ITUチャネル3 (コンペアマッチ/インプットキャプチャA3) 37 FFE1A4 IMIB3 ITUチャネル3 (コンペアマッチ/インプットキャプチャB3) 38 FFE1A8 OVI3 ITUチャネル3 (オーバフロー3) 39 FFE1AC 予約 40 FFE1B0 IMIA4 ITUチャネル4 (コンペアマッチ/インプットキャプチャA4) 41 FFE1B4 IMIB4 ITUチャネル4 (コンペアマッチ/インプットキャプチャB4) 42 FFE1B8 OVI4 ITUチャネル4 (オーバフロー4) 43 FFE1BC 予約 44 FFE1C0 DEND0A DMAC 45 FFE1C4 DEND0B 〃 46 FFE1C8 DEND1A 〃 47 FFE1CC DEND1B 〃 48 FFE1D0 予約 49 FFE1D4 予約 50 FFE1D8 予約 51 FFE1DC 予約 52 FFE1E0 ERI0 SCI0 受信エラー0 53 FFE1E4 RXI0 SCI0 受信データ・フル0 54 FFE1E8 TXI0 SCI0 送信データエンプティ0 55 FFE1EC TEI0 SCI0 送信終了0 56 FFE1F0 ERI1 SCI1 受信エラー1 57 FFE1F4 RXI1 SCI1 受信データ・フル1 58 FFE1F8 TXI1 SCI1 送信データエンプティ1 59 FFE1FC TEI1 SCI1 送信終了1 60 FFE200 ADI AD変換終了 H8/3052Fの割り込みベクタ ■実際のプログラミング (1)割り込みハンドラの定義 割り込みハンドラというと、特別な関数のように聞こえるかもしれないが、書き方は通常の関数と同じ。ただ、関数の宣言の前に #pragma interrupt(割り込みハンドラの関数名) を記述しておくこと。 (2)割り込みハンドラをベクタテーブルに登録 monitor.hに定義されているベクタテーブルに、割り込みハンドラの関数名を記述する。 (3)割り込みマスクと優先順位に関する設定を行う。 システム・コントロール・レジスタ(SYSCR)のI ビットを1にし、設定されている全割り込みを禁止にする。(設定中に割り込みが発生して、おかしな事にならないようにするため) SYSCRのI ビットを制御するには、 set_imask_ccr(1); // SYSCRのI ビットを1に設定し、全割り込みを不許可にする。 もしくは、 set_imask_ccr(0); // SYSCRのI ビットを0に設定し、全割り込みを許可する。 とする。【注意】 set_imask_ccr関数を呼び出すには、monitor.hの先頭付近に #include machine.h を入れておくこと。... でないと、コンパイルエラーが発生する。 システム・コントロール・レジスタ(SYSCR)のUEビットを、必要に応じて設定する。UEビットの詳細はこちら。 割り込み優先順位の設定。必要に応じて、インタラプト・プライオリティ・レジスタ(IPRA、IPRB)を設定する。 外部割り込み(IRQ)を使う場合は、IRQイネーブルレジスタ(IER)を設定する。その他のハードウエアが発生する割り込みについては、各ハードウエアの設定を行うレジスタで対応する。 以下のように示すように、IERの各ビットが、IRQの信号線に対応している。(IRQxEが、IRQx信号線に対応) bit 7 6 5 4 3 2 1 0 IRQ名 IRQ5E IRQ4E IRQ3E IRQ2E IRQ1E IRQ0E 初期値 0 0 0 0 0 0 0 0 IRQxEの値を1にすれば、該当するIRQx信号線による割り込みが有効になる。 外部割り込み(IRQ)を使う場合は、割り込みの発生用件にレベルトリガかエッジトリガかを選択する。 システム・コントロール・レジスタ(SYSCR)のI ビットを0にし、設定されている全割り込みを許可する。これ以降、何らかの割り込みイベントの発生によって、ベクタテーブルに割り当てられた割り込みハンドラが呼び出される。 以下は、外部割り込み信号線(IRQ0)にイベント(信号の立下り:エッジトリガ)が発生した時に、割り込みハンドラirq0_handlerを呼び出すプログラムの例。 main関数と割り込みハンドラの記述、およびベクタテーブルへの割り込みハンドラの登録例を示したもの。 (割り込みに関連する記述を赤字で示した。) ※ 外部割り込み信号線と、マイコンボード上の端子との関係は、回路図を参照のこと。 #include monitor.h #define PB_DDR (*(volatile unsigned char *)0xFFFFD4) #define PB_DR (*(volatile unsigned char *)0xFFFFD6) #define PA_DDR (*(volatile unsigned char *)0xFFFFD1) #define PA_DR (*(volatile unsigned char *)0xFFFFD3) #define ISCR (*(volatile unsigned char *)0xFFFFF4) #define IER (*(volatile unsigned char *)0xFFFFF5) #define ISR (*(volatile unsigned char *)0xFFFFF6)#pragma interrupt(irq0_handler) // 以下に続く関数が、割り込みハンドラで // ある事を示す。void irq0_handler() // 割り込みハンドラの定義{ printf( \n ); } int main() { long int w; set_imask_ccr(1); // 全ての割り込みを禁止 IER |= 0x1; // IRQ0を有効にする。(CNX551の3ピン) ISCR |= 0x1; // IRQ0をエッジトリガにする。 set_imask_ccr(0); // 全ての割り込みを許可 while(1) { // 無限ループ for(w=0; w 999999; w++); printf( . ); } } 割り込みハンドラとmain関数の記述例 #define printf ((int (*)(const char *,...))0x00002b52) #define scanf ((int (*)(const char *,...))0x00002ba4) #pragma section VECTBL void PowerON_Reset(); void irq0_handler(); // 割り込みハンドラのプロトタイプ宣言 // (これが無いとコンパイルエラーになる) typedef void (*fp)(void); const fp VectorTable[] = // ベクタテーブルの定義 { (fp)PowerON_Reset, // vector 0 Reset (fp)0L, // vector 1 Reserved (fp)0L, // vector 2 Reserved (fp)0L, // vector 3 Reserved (fp)0L, // vector 4 Reserved (fp)0L, // vector 5 Reserved (fp)0L, // vector 6 Reserved (fp)0L, // vector 7 NMI (fp)0L, // vector 8 TRAP (fp)0L, // vector 9 TRAP (fp)0L, // vector 10 TRAP (fp)0L, // vector 11 TRAP (fp)irq0_handler,// vector 12 IRQ0 IRQ0割り込みを処理する割り込みハンドラを登録 (fp)0L, // vector 13 IRQ1 (fp)0L, // vector 14 IRQ2 (fp)0L, // vector 15 IRQ3 (fp)0L, // vector 16 IRQ4 (fp)0L, // vector 17 IRQ5 (fp)0L, // vector 18 [reserved] (fp)0L, // vector 19 [reserved] (fp)0L, // vector 20 Watch Dog Timer (fp)0L, // vector 21 Refresh (fp)0L, // vector 22 [reserved] (fp)0L, // vector 23 [reserved] (fp)0L, // vector 24 ITU0 IMIA0 (fp)0L, // vector 25 ITU0 IMIB0 (fp)0L, // vector 26 ITU0 OVI0 (fp)0L, // vector 27 [reserved] (fp)0L, // vector 28 ITU1 IMIA1 (fp)0L, // vector 29 ITU1 IMIB1 (fp)0L, // vector 30 ITU1 OVI1 (fp)0L, // vector 31 [reserved] (fp)0L, // vector 32 ITU2 IMIA2 (fp)0L, // vector 33 ITU2 IMIB2 (fp)0L, // vector 34 ITU2 OVI2 (fp)0L, // vector 35 [reserved] (fp)0L, // vector 36 ITU3 IMIA3 (fp)0L, // vector 37 ITU3 IMIB3 (fp)0L, // vector 38 ITU3 OVI3 (fp)0L, // vector 39 [reserved] (fp)0L, // vector 40 ITU4 IMIA4 (fp)0L, // vector 41 ITU4 IMIB4 (fp)0L, // vector 42 ITU4 OVI4 (fp)0L, // vector 43 [reserved] (fp)0L, // vector 44 DMAC DEND0A (fp)0L, // vector 45 DMAC DEND0B (fp)0L, // vector 46 DMAC DEND1A (fp)0L, // vector 47 DMAC DEND1B (fp)0L, // vector 48 [reserved] (fp)0L, // vector 49 [reserved] (fp)0L, // vector 50 [reserved] (fp)0L, // vector 51 [reserved] (fp)0L, // vector 52 SCI0 ERI0 (fp)0L, // vector 53 SCI0 RXI0 (fp)0L, // vector 54 SCI0 TXI0 (fp)0L, // vector 55 SCI0 TEI0 (fp)0L, // vector 56 SCI1 ERI1 (fp)0L, // vector 57 SCI1 RXI1 (fp)0L, // vector 58 SCI1 TXI1 (fp)0L, // vector 59 SCI1 TEI1 (fp)0L // vector 60 ADI }; #pragma section /* セクション名を省略すると、プログラム領域はP、定数領域はC、 初期化データ領域はR,D、未初期化データ領域はBとなる。 */ int main(void); __entry void PowerON_Reset(void) { main(); //スタートルーチンを呼び出し printf( program ended. push reset ); sleep(); } monitor.hの内容とベクタテーブルの定義 多重割り込み H8/3052Fの割り込み処理では、割り込みハンドラ内部では、デフォルトで他の割り込みは禁止されている。(set_imask_ccr(1)の状態)従って、割り込みハンドラの処理中に、その他の割り込みイベントが発生しても、割り込みハンドラが新たに起動されることは無い。(つまり、多重割り込み禁止の状態) 現実のプログラミングでは、ある割り込みハンドラ(例えばIRQ0)実行時に、他の割り込み処理(例えばIRQ1)を受け付けたい場合も存在する。(つまり、割り込み処理実行中に、他の割り込み処理を受け付ける事。同じ割り込みでも良い)こういうのを多重割り込みと呼ぶ。 多重割り込みを受け付けるには、割り込みハンドラ内で、 set_imask_ccr(0) を実行すればよい。 多重割り込みとリエントラント
https://w.atwiki.jp/akatonbowiki/pages/11783.html
このページはこちらに移転しました 割り込みバナナ 作詞/おちんこまんこ 台所に凍ったバナナが一本つっ立ってた 俺は真上から頭突きをしてみた! そして俺の頭にはバナナが刺さっていた 不思議なのは凍ったままだったことだ それからというものの俺は頭上のバナナを大切に生きてきた ある日俺は台所で激しく大転倒した どうやらバナナの皮を踏んだらしい と、そこで目が覚めた。
https://w.atwiki.jp/tonosama_cs/pages/15.html
実行中のプロセスと非同期的に発生。(プロセスとは無関係に発生) クロック割り込み クロックは一定時間ごと(PCでは毎秒100回)に割り込みを行う。これをティックと呼ぶ。 ティックごとに、システムは現在時刻を更新し、ユーザプロセスとシステムのタイマを計算する。クロックデバイスプロセスが起動されると、hardclock()が実行される。hardclock()が1ティック以上動作すれば、次のクロック割り込みを取りこぼすため、極めて高い優先度が設定される。 hardclock()には極めて高い優先度が設定されるため、ほぼ全ての他の処理は停止する。 より重要度の低い時刻関連のソフトウェア処理は、ソフトウェア割り込みハンドラであるsoftclock()により実行する。
https://w.atwiki.jp/kumikomi-yitjc/pages/40.html
何事も、やれば良いってものではない。ものには順番というものがある。 ...というわけで、割り込みにも順序というものがある。これまでも説明したように、H8/3052Fには、割り込みイベントを発生する複数のハードウエアがある。それぞれのハートウエアが「同時に割り込みイベントを発生する」などということも、世の中には有りえるのだが、CPUは同時には1つの処理しか実行できない。 この様な場合はどうするか..... 「面倒なので、無視する」 と言うのも一案である。 (冗談に聞こえるかもしれないが、本当である。その程度の緊急性しかない処理なら、放っておくというのは、正しい設計と言える。) しかし、世の中、そう簡単には行かない。「それぞれ」に「それぞれ」の事情があって、「それぞれ」は、その事情を満たしてほしいと願うものだ。(念仏の様であるが) では、どうするか。 同時に発生した割り込みは、発生したイベント毎に順位付け すれば良さそうである。ただし、順位付けが固定化すると、問題が生じる(場合がある)。例えば、 有名人のかすり傷と、瀕死のパンピーが119番した時に、有名人が優先されたのでは、たまったものではない... ※パンピー:一般people = 一般の人 のである。 この場合の優先順位(プライオリティ)は、有名/無名の差ではなく、症状の程度で左右されるべきである。従って、常にパンピーが優先されるわけでも無い。状況によって変化するということである。 この様な問題に対応するため、H8シリーズのCPUには、場合によって、割り込みの優先順位を切り替える機構が備わっている。 具体的には、 インタラプト・プライオリティ・レジスタ(IPRA、IPRB) を設定する。 事で、実現できる。 具体的には、 IPRAのビットを1に設定すると、そのビットに対応する割り込みイベントが優先されるようになる。 [IPRAのビットの定義] 割り込みイベントは沢山あるのでIPRAだけでは表現できないので、足りない分はIPRBを使っている。 [IPRBのビットの定義] 実際のプログラミングでは、以下のようになる。 #include monitor.h #define PB_DDR (*(volatile unsigned char *)0xFFFFD4) #define PB_DR (*(volatile unsigned char *)0xFFFFD6) #define PA_DDR (*(volatile unsigned char *)0xFFFFD1) #define PA_DR (*(volatile unsigned char *)0xFFFFD3) #define ISCR (*(volatile unsigned char *)0xFFFFF4) #define IER (*(volatile unsigned char *)0xFFFFF5) #define ISR (*(volatile unsigned char *)0xFFFFF6) #define IPRA (*(volatile unsigned char *)0xFFFFF8) #define IPRB (*(volatile unsigned char *)0xFFFFF9) #pragma interrupt(irq0_handler) // 以下に続く関数が、割り込みハンドラで // ある事を示す。 void irq0_handler() // 割り込みハンドラの定義 { static int cnt = 0; printf( irq0=%d\n , cnt++); } #pragma interrupt(irq1_handler) // 以下に続く関数が、割り込みハンドラで // ある事を示す。 void irq1_handler() // 割り込みハンドラの定義 { static int cnt = 0; printf( irq1=%d\n , cnt++); } int main() { long int w; PB_DDR = 0xFF; set_imask_ccr(1); // 全ての割り込みを不許可 IER |= 0x3; // IRQ0,1を有効にする。(CNX551の3,4ピン) ISCR = 0x3; // IRQ0,1をエッジトリガにする。 set_imask_ccr(0); // 全ての割り込みを許可 IPRA |= 0x80; // IRQ0 優先 while(1) { // 無限ループ printf( . ); } } 割り込みのマスク(有効化/無効化) また、H8を含む、ほとんど全てのCPUには、割り込みの発生自体を抑止する(これを割り込みマスクと呼ぶ)仕掛けも備わっている。例えば、 有名人がかすり傷を負った。(有名人) 119番に電話して救急車を呼ぼうとした。(有名人) 症状を聞いたら、かすり傷なので、「我慢しろ」と返事した。(消防署) この様な事例があった事を、ノートに記録した。(消防署) この例では、1,2は割り込みイベントの発生であるが、3で割り込みがマスクされ、割り込みハンドラ(救急車の出動)は抑止された。 しかし、事実そのものは、何らかの形で記録しておくことも必要なので、この様な処理を行った。(4の処理) 割り込みのマスクについては、複数の割り込みを一括してマスク(もしくはマスク解除)したい場合は、 CCRのIおよびUIビットを設定する。ただし、UIビットの動作条件は、CCRのUEビットの設定で変化する。 ※ set_imask_ccr()関数により行う。 であり、個別の割り込みマスクを制御したい場合は、各ハードウエアごとのレジスタを設定する。外部割り込み(IRQx)の例では、 IERの当該ビットを設定 である。 また、「4の記録する」という動作についても、、各ハードウエアごとに状態がレジスタに保存される。外部割り込み(IRQx)の例では、 ISRの当該ビットに、割り込み発生の有無が記録される。 ことになる。 ISRの各ビットの定義は、以下のようになっている。 bit 7 6 5 4 3 2 1 0 割り込みイベントが発生したIRQ - - IRQ5F IRQ4F IRQ3F IRQ2F IRQ1F IRQ0F 初期値 0 0 0 0 0 0 各ビットは、IRQ信号線による、割り込みイベントの発生によって1にセットされる。また、割り込みハンドラの呼び出しによって0にクリアされる。 IERの設定によって、割り込みハンドラがマスクされている状態で、割り込みイベントが発生した場合は、該当するビットは1にセットされたままで、プログラムによってクリアする必要がある場合もある。(でないと、割り込みマスクを解除した瞬間に、保留されていた割り込みイベントに該当する割り込みハンドラが起動されるため。) 具体的には、以下のようにする。 ISR = ~0x1; // IRQ0の割り込みイベントをクリア とする。 マスク不可能な割り込み(NMI) 話が前後するが、世の中には緊急事態と言う事もあって、どんな事があっても処理しなければならないということもある。 マイコンの世界では、この様な割り込みを、 NMI (Non Mascable Interrupt) ~ マスク不可能な割り込み と呼んでいる。 なお、言うまでも無いが、割り込みをマスクする = 割り込み禁止 であり、 割り込みマスクの解除=割り込み許可 である。 割り込み周辺回路のブロック図