2015-08-04 2 views
0

Я написал первый простой Linux-модуль для Led-мигания. Если я использую для паузы между Led ON и Led Off командой ssleep (1), то все в порядке, но если я использую udelay (40), тогда весь Linux и приложения, такие как SSH, Webserver и т. Д., Будут заморожены. Не могли бы вы помочь мне, почему это происходит и как это исправить?Linux-модуль ядра, блокирующий весь Linux

#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); 

ответ

0

udelay функция заняты, в то время как ожидания sleep будет планировать текущую задачу из (для выполнения других задач) и вернуться, когда время истекло.

Так что, если ваше ядро ​​не настроено как превентивное, то процессор, который работает udelay, не будет иметь шанса быть запланированным. Если на вашем компьютере всего 1 процессор, вся машина будет заблокирована.

В ваших обстоятельствах рекомендуется использовать sleep вместо udelay.

+0

спасибо. Мне разрешено вытесняемое ядро. Теперь он работает. –