Linux 内核模块阻塞整个 Linux

Linux kernel module blocking entire Linux

我编写了我的第一个简单 Linux LED 闪烁模块。如果我使用命令 ssleep(1) 在 Led ON 和 Led Off 之间暂停,那么一切正常,但如果我使用 udelay(40),则整个 Linux 和 SSH、Webserver 等应用程序都被冻结。你能帮我看看为什么会这样吗?如何解决?

#include <linux/init.h>
#include <linux/module.h>
#include <linux/delay.h>
#include <linux/gpio.h>
#include <mach/gpio.h>

MODULE_LICENSE("GPL");

static int led_on_init(void)
{

    gpio_direction_output(AT91_PIN_PA24, 0);
    int i = 1;
    while (i == 1)
    {
        gpio_set_value(AT91_PIN_PA24, 1);
        /*udelay(40);*/
        ssleep(1);
        gpio_set_value(AT91_PIN_PA24, 0);
        ssleep(1);
       /*udelay(40);*/
    }
}
    static void led_on_exit(void)
    {
        gpio_set_value(AT91_PIN_PA24, 0);
    }


module_init(led_on_init);
module_exit(led_on_exit);

udelay 是忙等待函数,而 sleep 会将当前任务安排出去(到 运行 其他任务)并在时间到时返回。

因此,如果您的内核未配置为可抢占内核,则 运行 宁 udelay 的 cpu 将没有机会被调度。如果你的机器只有1个cpu,整台机器都会被阻塞

在您的情况下,建议使用 sleep 而不是 udelay