-1

小さな組み込みLinuxデバイスの起動時に非常にまれなカーネルパニックが発生するのを避けるため、USBカーネルモジュールに短い遅延を追加する必要があります。問題のあるコードは以下のとおりです。私がコードに傷をつけた場合、デバイスは一晩中正常に動作していました。私は小さな遅延を追加したいが、usleep_rangeとmsleepはカーネルトレースバック "Atomic中のスケジューリング"を引き起こす。スリープ状態でこのコードセクションに遅延を追加するにはどうすればよいですか? whileループはそれを行う方法ですか?Linuxカーネルモジュールでの遅延方法クリティカルセクション

usb_hub_for_each_child(udev, chix, childdev) { 
    printk(KERN_ERR "r8a66597: Start USB Discover\n"); 
    //usleep_range(10000, 11000); 
    //preempt_disable(); 
    //msleep(1); 
    collect_usb_address_map(childdev, map); 
    //usleep_range(10000, 11000); 
    printk(KERN_ERR "r8a66597: Stop USB Discover\n"); 
    //msleep(1); 
    //preempt_enable(); 
} 
+0

コード内の競合状態の根本的な原因を見つける必要があります。 – 0andriy

答えて

3

ヘッダlinux/delay.hスリープなし遅延のための機能を提供します。これらの機能は、割り込み(原子)のコンテキストで使用することができます

  • ndelay(NS) -
  • 、ナノ秒の与えられた数のを待つudelay(たち) -
  • 、マイクロ秒の一定数を待つmdelay( ms) - 与えられたミリ秒数を待ちます。
関連する問題