Периодическая задача в модуле ядра Linux

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

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

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

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

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

//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;
}
10
задан Mateusz Piotrowski 3 September 2017 в 17:14
поделиться