【问题标题】:Linux kernel module blocking entire LinuxLinux内核模块阻塞整个Linux
【发布时间】:2015-10-26 08:54:36
【问题描述】:

我为 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);

【问题讨论】:

    标签: linux module kernel


    【解决方案1】:

    udelay 是一个忙等待功能,而sleep 将调度当前任务(以运行其他任务)并在时间到时返回。

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

    根据您的情况,建议使用sleep 而不是udelay

    【讨论】:

    • 谢谢。我被允许抢占内核。现在它工作了。
    猜你喜欢
    • 2012-04-11
    • 2013-12-17
    • 2011-05-03
    • 2016-03-25
    • 2015-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多