(toppers-users 3259) Re: 割込みベクタからハンドラ起動までの時間の変化

高橋和浩@nifty takahashi_kazuhiro @ nifty.com
2010年 10月 8日 (金) 15:28:02 JST


こんにちは、アライブビジョンソフトウエアの高橋です。

> > さらに、カーネル管理外が利用できるカーネルかどうかにもよります。
> > M32C-JSPは不可能でしたが、M32C-ASPは可能になる実装になっているようです。
> 
> 当方、この辺りの知識が乏しいのですが、設定を変更すれば対応できるのでしょうか?
> もし、わかればお教えいただければ幸いです。

実施方法は2つのことを行う必要があります。
1.カーネルの定義を変えてカーネルマスクレベルを下げる。
porting.txtに記載があり
---------------------------
5.2 割込み優先度の範囲

(5-2-1) TMIN_INTPRI				割込み優先度の最小値(最高値)
(5-2-2) TMAX_INTPRI				割込み優先度の最大値(最低値)
-------------------------------------------------------------
ですが、M32Cの固有部分は、その定義を参照していないようです。
自力で対応が必要かと思いますが、他のマイコンの実装に習って定義すれば
よいと思います。prc_config.hあたりだと思います。

まず、カーネル管理外(割込み)をサポートするようにするために
カーネルマスクレベルをマイコンの持つ最大マスクレベルより下げて定義する必要があります。
R32Cは0-7の8レベルですがデフォルトがマイコンの最大値となっているためにデフォルトの
状態ではカーネル管理外割込みが利用できなくなっています。これを下げてやる必要があります。
もちろんそれに伴って他の割込みもそれ以下のレベルにする必要があります。カーネル管理外割込みは、
これよりも優先度の高い割込みを利用することで、例えばカーネルマスクレベルが5のときに6か7になるような
割込みに設定することになります。
これによるカーネルがクリティカルセクション実行時でも割込みが遅延なく実行される
ことになります。

2.割込みハンドラから、ディスパッチャーまでの割込み禁止の改定
現状の問題点
OSが使っている場合でも使っていない場合でも割込みが遅延しないようにする
ためには、割込み禁止時間を短くする必要があります。
TOPPERS/ASPのサービスコールのクリティカルセクションの対応は、JSPでの割込み禁止に
よる保護から、割込み可能だけれどもマスクレベルを上げることにより対応されています。
(t_lock_cpu()の中身が変更されています)
サービスコール前後でのカーネル管理外割込みでの遅延は発生しなくはなっています。
ただし、割込みサービスルーチンでの対応については、フラグレジスタの割込みビットによって
禁止されています。特に割込みサービスルーチンから戻ってきて、遅延ディスパッチする場合、
つまりret_intへ移行する場合にその間カーネル管理外割込みも禁止されています。
つまり、割込みサービスルーチンから戻ってきた次のflcr i命令の直後に、遅延したくない
カーネル管理外割込みが発生しても、相当の時間割込みが待たされることになります。

対策:
現状のフローをカンタンに書くと

1.割込み入り口
2.多重割込み制御
3,割込み禁止解除 割込みサービスルーチンコール 割込み禁止
4.多重割込みなら割込みリターン
5.多重割込み以外でディスパッチャ必要なら ディスパッチャ ret_intへいく
6.上記以外なら割込みリターン

ですが これを

1.割込み入り口
2.カーネルマスクレベルにして割込み許可、現在の(その時の)マスクレベルをセーブする。
3.多重割込み制御
4,セーブしたマスクレベルにする 割込みサービスルーチンコール 
5.カーネルマスクレベルにする
6.多重割込みなら割込みリターン
7.多重割込み以外でディスパッチャ必要なら ディスパッチャ ret_intへいく
8.上記以外なら割込みリターン

にすれば可能と思います。
ret_intも呼び出される条件が変わることへの対応が必要になります。
割込みサービスルーチンの起動部分にt_lock_cpu相当のマクロを定義すれば
よいと思います。

それからR32Cの割込み応答時間ですが、ハードウエアマニュアルに実行中命令に
よるばらつきが記載されています。TOPPERSではたぶん使っていない LDCTXやSTCTX実行中の
場合に前段で30サイクルかかるとしか記載されていませんのでどの命令がどれだけ遅延するか
は正確には不明だと思います。R32Cのクロックいくつか分かりませんが、
100MHzなら単純に100サイクルで1μsかと思いますので、その程度のばらつきは
割込みで対応する場合にはでるものと考えています。

以上、ざっくりかもしれませんが、コメントさせていただきました。


---
アライブビジョンソフトウエア株式会社
高橋和浩
673-0005兵庫県明石市小久保2-2-7幹線ビル4F
Email:takahashi_kazuhiro @ nifty.com
http://homepage3.nifty.com/ALVS/
TEL:078-922-2177