[Subject Prev][Subject Next][Thread Prev][Thread Next][Subject Index][Thread Index]

[linux-users:102119] Re: 組込Linuxドライバの作成方法


At Fri, 5 Mar 2004 09:13:19 +0900,
Yuichi Enokida wrote:
> ところで、この手のデバイス制御を行う場合、デバイスの割込
> 解除はどのタイミングで行うべきでしょうか?
> 
> 現在、下記のような制御を考えているのですが、実際、ioctl()の
> 個所でデバイスの割込み解除を行うとプロセスが寝る前に割り込み
> が発生してしまい、ユーザープロセスで割込みを見ることができ
> ない構造になっています。

[図は略]

デバイスの割り込みをプロセスに応答させる実装はお勧めしません。
応答は割り込みハンドラで完結しましょう。

例えば、データ到着の割り込みを受けたら、割り込みハンドラで
データをデバイスから取り出し、キューに入れます。そして、
寝ているプロセスを wakeup してハンドラからは復帰。

システムコールの実装部分(つまりプロセスコンテキスト) では
割り込みを待つのでなく「キューが空であるかぎり寝る」という
動きにします。

それから、interruptible_sleep_on() は割り込みを許可してから
呼ぶため、割り込み許可からプロセスのスリープまでのわずかな
時間に割り込みがあると割り込みを取りこぼしてしまいます。

割り込み禁止状態のままでプロセスをスリープさせ、
それから割り込みを許可すれば良いのですが、それを
するには interruptible_sleep_on() の中身をばらした
ような処理をいちいち書かないといけなくなります。
幸い一連の手順をマクロにしたものが用意されているので、
それを使うようにしましょう。

// ここは Linux の実装のとってもダサイところ。

--
Naoto Shimazaki

この情報があなたの探していたものかどうか選択してください。
yes/まさにこれだ!   no/違うなぁ   part/一部見つかった   try/これで試してみる

あなたが探していた情報はどのようなことか、ご自由に記入下さい。特に「まさにこれだ!」と言う場合は記入をお願いします。
例:「複数のマシンからCATV経由でipmasqueradeを利用してWebを参照したい場合の設定について」
Follow-Ups: References: