【问题标题】:How to Delay in Linux Kernel Module Critical Section如何延迟 Linux 内核模块临界区
【发布时间】:2017-12-23 05:45:53
【问题描述】:

我需要在 USB 内核模块中添加一个短暂的延迟,以避免在小型嵌入式 Linux 设备启动时出现极为罕见的内核恐慌。有问题的代码如下。如果我在代码中添加了一个恶作剧,该设备会在以前失败的地方成功运行一整夜。我想添加一个小的延迟,但 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();
}

【问题讨论】:

  • 您需要找到代码中存在的竞态条件的根本原因。

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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2011-09-17
    • 1970-01-01
    • 2016-11-27
    • 2012-04-11
    • 2013-12-17
    • 2011-09-20
    • 2012-02-22
    • 2012-09-27
    • 1970-01-01
    相关资源
    最近更新 更多