(toppers-users 284) Re: i_lock_cpu() について教えてください

Takayuki WAKABAYASHI takayuki @ ertl.ics.tut.ac.jp
2001年 10月 4日 (木) 00:07:04 JST


豊橋技術科学大学の若林です.

Horie, Seiichi さんは書きました:
 > i_lock_cpu()
 > {
 >  UH intmask;
 > 
 >  intmask = current_intmask();
 >  disint();
 >  int_intmask = intmask;
 > }
 > 
 > この部分ですが、確かに一時変数に入れておけば途中で割り込まれて
 > そこで int_intmask が変更されても「この」コンテキストが実行を終了する
 > ときにはcurrent_intmaskできっちり上書きできます。しかし、上書きされた
 > int_intmaskはきえているわけですから、排他制御になっていない気がしま
 > す。解釈が間違っているのでしょうか。

int_intmaskは,i_unlock_cpuをする際,割込みマスクレベルをロック前の値に
戻すために元々の割込みマスクレベルを覚えておくための変数です.

そのため,この変数の生存期間はCPUロック状態である間となり,具体的には
i_lock_cpuのdisint()からi_unlock_cpuのset_intmask(int_intmask)までとなります.
この間はCPUは割込み禁止状態であるため,他のハンドラなどに邪魔されることなく
連続して走りつづけることになります.そのため,特殊な排他制御をしなくとも,
変数は割込みハンドラ間で排他的に利用されます.
 #言い換えると,disint()によって排他制御がされている

また,disint()する直前でint_intmaskが書き換えられているということは,
  ・今実行している割り込みよりも優先度の高い割り込みがかかって飛んでいった
  ・その優先度の高い割込みハンドラ内でi_lock_cpuをかけた
ということが言えます.
そうなると,当然このハンドラに戻ってきたということは,優先度の高い割込みの
処理は終わっているはずなので,int_intmaskはすでに使用されていないはずです.
 #lockしておいてunlockしなかった場合はこの限りではありませんが...
 #でも割込みの出口処理でSRが上書きされるので,マスクレベルは正常のはずです.

このような感じなのですが, 説明になっているでしょうか?

+----------------------------------------------+
| Takayuki WAKABAYASHI (わかばやし たかゆき)   |
|  mailto: takayuki @ ertl.ics.tut.ac.jp         |
+----------------------------------------------+
| 豊橋技術科学大学 工学研究科 電子情報工学専攻 |
|   組込みリアルタイムシステム研究室           |
+----------------------------------------------+