SSブログ

Smalight OSを使おう 6タスク目 割り込みの使用 [Smalight OS]

※入手したマニュアル見ながら書いていますが、ちょっと解釈に自信が無い。あまり信用しない様に。

この記事は、某SNSで書いているものを転載しています。

R8Cの割り込みは、優先度別の多重割り込みを可能としていますので、この割り込みを活用すれば、実際の所OSなんぞ使用しなくとも、綺麗にシステムを構築できるかもしれませんし、場合によってはそちらの方がレスポンスの早いシステムとなる可能性が有ります。

しかしそれで話が終わってしまってはあれなので、smalight os上での割り込みの使用に付いて書いてみたいと思います。
なおルネサス北セミのサンプルマニュアルを落とされた場合、このマニュアルはH8300Hシリーズ用なので、ハードウエア上の割り込みレベルは2までしかなく、R8Cと話が一部一致しないかもしれません。

さて、smalight os上で取り扱われる割り込みの種類は大別して2種類あります。
一つはOS管理下(ディスパッチを行う)の割り込みで、もう一つはOS管理外の割り込みとなります。
更にOS管理外の割り込みには、NMI等のマスク不可能な割り込みと、マスク可能だが、OSの機能を使用しなかったり、OSのオーバーヘッドが気になって使えない場合の割り込みがあります。

config.cの中には、OSの割り込みマスクレベルを設定する項目が有り、OSの管理下の割り込みの場合は、ここで設定したレベル以内で使用する事となります。

/*------ Kernel Mask -----------------------------------------*/
#define KNL_MSK_LEVEL   6 /* IPL:b6-b4 */


と言いますのは、OSがスケジューリングを行う時、一時的に割り込みを禁止しますが、全てのレベルの割り込みを禁止している訳ではなく、マスクレベル以下の割り込みを禁止しますので、その様な使い方が必要となります。

_intTimerRA:
  INTPUSH _INT_LEVEL1_stack ; 現行コンテキストの保存と、割り込みスタックへの切り替え
  JSR.A   _TimerRA_Int ; 割り込みハンドラの呼び出し
  INTPOP ; 新しいコンテキストへの切り替え
void TimerRA_Int(B mode)
{
  適当な処理;
  disp(mode); /*本来、modeの中身が0かそうでないかを確認する事が推奨されている*/
}

では、OS管理外の割り込みではどうするかと言う話ですが、マスク不可能なNMIの場合は、ディスパッチ無し割り込みの手順で利用して下さい。

_intNMI:
  PUSHM   R0,R1,R2,R3,A0,A1,SB,FB ; レジスタの保存
  STC     SP,R1
  LDC     #_NMI_stack,SP ; 割り込みスタックへの切り替え
  PUSHM   R1
  JSR.A   _intNMIFunc ; NMI処理の呼び出し
  POPM    R1
  LDC     R1,SP
  POPM    R0,R1,R2,R3,A0,A1,SB,FB ; レジスタの回復
  REIT
void intNMIFunc( void )
{
  適当な処理;
}

問題はマスク可能な割り込みの場合です。この割り込みの設定で重要なのは、必ずOSの割り込みマスクレベルより大きく設定する必要があると言う事です。

_intUART0_Rcv:
  PUSHM   R0,R1,R2,R3,A0,A1,SB,FB ; レジスタの保存
  STC     SP,R1
  LDC     #_INT_LEVEL7_stack,SP ; 割り込みスタックへの切り替え
  PUSHM   R1
  FSET    I ; 必要ならば多重割り込みの許可
  JSR.A   _UART0_Rcv_Int ; 割り込みハンドラの呼び出し
  POPM    R1
  LDC     R1,SP
  POPM    R0,R1,R2,R3,A0,A1,SB,FB ; レジスタの回復
  REIT

もしOSの割り込みマスクレベルより小さいレベルに設定したら、その割り込み中によりレベルの高いOS管理下の割り込みが発生する可能性がありますが、OS管理下の割り込みをサービスする時、OSは自分がどの状態で割り込みに入っているのか判らなくなります。
そうした場合、本来ならば割り込みの一番最後にディスパッチを発行する所、OS管理下の割り込みが終了した時点でディスパッチを発行してしまい、OS管理外の割り込みに戻って来ない可能性が有ります。

もし割り込み優先レベルを低く、しかしOSの機能を使う予定が無い時は、OS管理下の割り込み処理手順で入り、最後にディスパッチのサービスコールのみ入れて置きます。

  disp(mode);

ではOSの割り込みマスクレベルと同一の場合はどうなるか?ですが、この場合は特に上記の様な問題は発生しませんが、OS管理下の割り込みが先に行われた場合、その割り込みが完了するのを待つ事となり、元々レスポンスを求めてOS管理外の割り込みに設定したわりに待たされると言う結果になるので、やはりOSの割り込みマスクレベルより大きい方が、本来的な使い方と思います。

組み込みシステムをC言語で開発する時のバイブル

C言語でH8マイコンを使いこなす

C言語でH8マイコンを使いこなす

  • 作者: 鹿取 祐二
  • 出版社/メーカー: オーム社
  • 発売日: 2003/10
  • メディア: 単行本


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

nice! 0

コメント 0

コメントを書く

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

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

トラックバック 0

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