Периодическая задача в модуле ядра Linux - PullRequest
10 голосов
/ 29 ноября 2011

В настоящее время я занимаюсь разработкой модуля ядра GPIO для friendlyarm Linux 2.6.32.2 (mini2440).Я из области электроники и новичок в Linux.

Модуль ядра, загруженный при запуске, и файл соответствующего устройства находится в /dev как gpiofreq.

При первой записик файлу устройства, вывод GPIO постоянно переключается на частоте 50 кГц.Во второй раз писать это перестать переключаться.В третий раз он запускается снова и т. Д.

Я написал отдельный модуль ядра для генерации freq.но процессор зависает после записи файла устройства в первый раз.Отображается подсказка терминала, но я не могу выполнить какую-либо команду после этого.

Вот фрагмент кода:

//calling function which generates continuous freq at gpio

static int send_freq(void *arg)
{
    set_current_state(TASK_INTERRUPTIBLE);
    for(;;)
    {
        gpio_set_value(192,1);
        udelay(10);
        gpio_set_value(192,0);
        udelay(10);
    }
    return 0;
}

Вот код записи устройства, который запускается или останавливается с любыми данными.записывается в файл устройства.

if(toggle==0)
{
       printk("Starting Freq.\n");
       task=kthread_run(&send_freq,(void *)freq,"START");
       toggle=1;
}
else
{
       printk("Operation Terminated.\n");
       i = kthread_stop(task);
       toggle=0;
}

1 Ответ

9 голосов
/ 29 ноября 2011

Вы делаете бесконечный цикл в потоке ядра, нет места для чего-либо еще случиться, кроме IRQ и, возможно, другого потока ядра.

То, что вы можете сделать, это либо

  • запрограммируйте таймер на вашем оборудовании и переключайте ваш вывод в прерывании

  • заменить udelay на usleep_range

Я предлагаю действовать постепенно, начиная с диапазона кГц с помощью usleep_range, и в конечном итоге перейти к настройке таймера + ISR

в любом случае у вас, вероятно, будет много джиттера, и такое переключение gpio может быть хорошей идеей для DSP или PIC, но это пустая трата ресурсов в ARM + Linux, если только вы не получаете аппаратную помощь gpio двигатель с поддержкой ШИМ.

...