Вопрос

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

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

При первом написании в файл устройства PIN -код 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;
}
Это было полезно?

Решение

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

Что вы могли бы сделать, так это либо

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

  • Замените Udelay на uselep_range

Я предлагаю делать что -то постепенно и начинать с диапазона KHZ с USLEEP_RANGE, и в конечном итоге переехать в CUST OM TIMER + ISR

В любом случае, у вас, вероятно, будет много дрожания, и выполнение такого переключения GPIO может быть хорошей идеей на DSP или PIC, но является пустой тратой ресурсов на Arm + Linux, если только вы не помогаете с PWM, способным GPIO двигатель.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top