-1

我需要在USB内核模块中添加一个很短的延迟,以避免在小型嵌入式Linux设备启动时出现极其罕见的内核恐慌。有问题的代码如下。如果我在代码中加入了一个新元素,那么该设备将成功运行整夜,直到它以前失败。我想添加一个小延迟,但usleep_range和msleep会导致内核回溯“Scheduling While 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(毫秒) - 等待给定的毫秒数。