At Fri, 5 Mar 2004 09:13:19 +0900, Yuichi Enokida wrote: > ところで、この手のデバイス制御を行う場合、デバイスの割込 > 解除はどのタイミングで行うべきでしょうか? > > 現在、下記のような制御を考えているのですが、実際、ioctl()の > 個所でデバイスの割込み解除を行うとプロセスが寝る前に割り込み > が発生してしまい、ユーザープロセスで割込みを見ることができ > ない構造になっています。 [図は略] デバイスの割り込みをプロセスに応答させる実装はお勧めしません。 応答は割り込みハンドラで完結しましょう。 例えば、データ到着の割り込みを受けたら、割り込みハンドラで データをデバイスから取り出し、キューに入れます。そして、 寝ているプロセスを wakeup してハンドラからは復帰。 システムコールの実装部分(つまりプロセスコンテキスト) では 割り込みを待つのでなく「キューが空であるかぎり寝る」という 動きにします。 それから、interruptible_sleep_on() は割り込みを許可してから 呼ぶため、割り込み許可からプロセスのスリープまでのわずかな 時間に割り込みがあると割り込みを取りこぼしてしまいます。 割り込み禁止状態のままでプロセスをスリープさせ、 それから割り込みを許可すれば良いのですが、それを するには interruptible_sleep_on() の中身をばらした ような処理をいちいち書かないといけなくなります。 幸い一連の手順をマクロにしたものが用意されているので、 それを使うようにしましょう。 // ここは Linux の実装のとってもダサイところ。 -- Naoto Shimazaki
Follow-Ups:
- [linux-users:102124] Re: 組込Linuxドライバの作成方法Yuichi Enokida
- [linux-users:102125] Re: 組込Linuxドライバの作成方法Yoshihiro Kawabe
- [linux-users:102092] Re: 組込Linuxドライバの作成方法Yoshihiro Kawabe
- [linux-users:102105] Re: 組込Linuxドライバの作成方法Yuichi Enokida
- Prev by Subject: [linux-users:102118] Re: 組込Linuxドライバの作成方法
- Next by Subject: [linux-users:102120] Re: Bind9.2.1でDNS
- Previous by thread: [linux-users:102118] Re: 組込Linuxドライバの作成方法
- Next by thread: [linux-users:102124] Re: 組込Linuxドライバの作成方法
- Indexes:[Main][Thread]