Linux 内核模块阻塞整个 Linux

标签 linux module kernel

我为 Led 闪烁编写了第一个简单的 Linux 模块。如果我使用命令 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

关于Linux 内核模块阻塞整个 Linux,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31801033/

相关文章:

json - .json 文件的 Linux 正则表达式

linux - Windows下无法运行Laravel Homestead(grep报错)

"private"函数的 C 单元测试模拟

azure - Terraform NSG 使用 for_each 从多个模块输出规则

linux-kernel - printk - 显示在消息日志中但不显示在任何内核日志级别的终端中

专注于来电的 Android 电话应用程序

linux - NFS 源代码

linux - 使 rsync 永久运行

python - Python目录名可以是关键字吗?例如。 'import' ?

linux - 如何理解内核中 "page_align"的宏?