Linux内核模块阻塞整个Linux

时间:2015-08-04 05:02:38

标签: linux module kernel

我写了第一个用于Led闪存的简单Linux模块。如果我在Led ON和Led Off之间暂停使用命令ssleep(1)那么一切都没问题,但是如果我使用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);

1 个答案:

答案 0 :(得分:0)

udelay是一个忙碌的等待函数,而sleep将安排当前任务(运行其他任务)并在时间结束时返回。

因此,如果您的内核未配置为可抢占的内核,则运行udelay的cpu将无法安排。如果您的机器只有1个CPU,整个机器将被阻止。

在您的情况下,建议使用sleep代替udelay