川辺と申します。
>>>>> "Naoto" == Naoto Shimazaki <igy@xxxxxxxx> writes:
Naoto> それから、interruptible_sleep_on() は割り込みを許可してから
Naoto> 呼ぶため、割り込み許可からプロセスのスリープまでのわずかな
Naoto> 時間に割り込みがあると割り込みを取りこぼしてしまいます。
おっと、そうですね。
前のメールで私が書いたのも問題ありだな。
Naoto> するには interruptible_sleep_on() の中身をばらした
Naoto> ような処理をいちいち書かないといけなくなります。
つまり、
static wait_queue_head_t __wait_queue;
待つ側は
DECLARE_WAITQUEUE(wait, current);
spin_lock_irq(&__wait_queue.lock);
while( 待ちが必要 ) {
DECLARE_WAITQUEUE(wait, current);
__add_wait_queue_tail(&__wait_queue, &wait);
__set_current_state(TASK_INTERRUPTIBLE);
spin_unlock_irq(&q->lock);
schedule();
spin_lock_irq(&__wait_queue.lock);
__remove_wait_queue(&__wait_queue, &wait);
}
spin_unlock_irq(&__wait_queue.lock);
で、起こす側は
事象通知(何処かに記録)
wakeup_interruptible(&__wait_queue);
しなきゃいけないんでしたよね。
でも、これだったら、
completion(struct completion *)
wait_for_completion(struct completion *)
を使ってしまった方が楽な気がしますね。
Naoto> // ここは Linux の実装のとってもダサイところ。
そうですねぇ。
でも、旧来のsleep()/wakeup()|wakeproc()のモデルがいいかどうかも微妙だと思いますが。
シンプルなのは確かですけど。
もっとメッセージパッシング風のイベント通知機構を用意した方がいいと思い
ますか?
(って言っても、せいぜい1個数値とかアドレスを渡す程度が現実的でしょうけど)
--------
Kawabe,Yoshihiro <ripula@xxxxxxxxxxxxxxx>
Who is calling me from where?
Knock on my shell and my mind? from Pearl song.
Follow-Ups:
- [linux-users:102129] Re: 組込Linuxドライバの作成方法Naoto Shimazaki
- [linux-users:102092] Re: 組込Linuxドライバの作成方法Yoshihiro Kawabe
- [linux-users:102105] Re: 組込Linuxドライバの作成方法Yuichi Enokida
- [linux-users:102119] Re: 組込Linuxドライバの作成方法Naoto Shimazaki
- Prev by Subject: [linux-users:102124] Re: 組込Linuxドライバの作成方法
- Next by Subject: [linux-users:102126] メールが読めない
- Previous by thread: [linux-users:102128] Re: 組込Linuxドライバの作成方法
- Next by thread: [linux-users:102129] Re: 組込Linuxドライバの作成方法
- Indexes:[Main][Thread]