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

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


川辺と申します。

>>>>> "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.

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

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