如何延迟Linux内核模块的关键部分

时间:2017-07-18 11:23:36

标签: linux linux-kernel kernel linux-device-driver embedded-linux

我需要在USB内核模块中添加一个短暂的延迟,以避免在小型嵌入式Linux设备的启动时出现极为罕见的内核恐慌。有问题的代码如下。如果我在代码中添加了一个prink,那么设备会在以前失败之前成功运行。我想添加一个小延迟,但usleep_range和msleep导致内核回溯"调度原子"。如何在不睡觉的情况下在此部分代码中添加延迟?这是一个while循环吗?

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();
}

1 个答案:

答案 0 :(得分:3)

标题linux/delay.h提供延迟不睡眠的功能。这些函数可用于中断(原子)上下文:

  • ndelay(ns) - 等待给定的纳秒数,
  • udelay(us) - 等待给定的微秒数,
  • mdelay(ms) - 等待给定的毫秒数。
相关问题