URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 5625
[ Назад ]

Исходное сообщение
"Периодическое действие в linux драйвере"

Отправлено Alibaba , 10-Авг-06 12:39 
Задача такая. В драйвере linux ядра 2.4.18 раз в секудну нужно нечто сделать. Для этого есть функция:

static void f1()
{
  for(;;)
  {
    /* --- Something doing --- */
    ...
    /* --- Delay --- */
    set_current_state(TASK_INTERRUPTIBLE);
    schedule_timeout(DELAY_PERIOD * HZ);
  }
}

Всё работает, как нужно. Но при этом не обслуживаются другие подобные вызовы schedule_timeout() в любых [других] модулях и не обслуживается tasklet-очередь во всей системе. :-(

Понятно, что система ждёт, когда f1() "уйдёт" из timeout-очереди. Но в моём случае - никогда.

Как не тормозить очереди?


Содержание

Сообщения в этом обсуждении
"Периодическое действие в linux драйвере"
Отправлено f00l , 11-Авг-06 07:45 
>Задача такая. В драйвере linux ядра 2.4.18 раз в секудну нужно нечто
>сделать. Для этого есть функция:
>
>static void f1()
>{
>  for(;;)
>  {
>    /* --- Something doing --- */
>    ...
>    /* --- Delay --- */
>    set_current_state(TASK_INTERRUPTIBLE);
>    schedule_timeout(DELAY_PERIOD * HZ);
>  }
>}
>
>Всё работает, как нужно. Но при этом не обслуживаются другие подобные вызовы
>schedule_timeout() в любых [других] модулях и не обслуживается tasklet-очередь во всей
>системе. :-(
>
>Понятно, что система ждёт, когда f1() "уйдёт" из timeout-очереди. Но в моём
>случае - никогда.
>
>Как не тормозить очереди?


Вобше по логике драйвер должен быть атомарен,
тоесть сделал копирование и все(так как имеет самый высокий приоретет выполнения).

драйвер должен быть разделен на две части модуль ядра и приложение.

модуль ядра производит копирование данных.
приложение ждет 1 секунду и пересылает данные в модуль
или считавыет данные из модуля.


"Периодическое действие в linux драйвере"
Отправлено int_0d , 11-Авг-06 12:25 
Никогда так не делайте.

вам нужен таймер. юзать его примерно так:

struct timer_list timer;

timer.function = my_timer_function;
timer.data = my_timer_data;
timer.expires = jiffies + 100; //сработает через 100 jiffies
add_timer(&timer);

....
void my_timer_function(unsigned long data)
{
  struct my_fucked_data* fdata = (my_fucked_data *)data;
  struct timer_list* my_timer = fdata->timer;
....
....
  mod_timer(my_timer, 100);
}


удалять таймер при помощи del_timer_sync или  del_timer (в зависимости от контекста)


"Периодическое действие в linux драйвере"
Отправлено Alibaba , 14-Авг-06 06:55 
>вам нужен таймер. юзать его примерно так:

Спасибо! Помогло.

Код почти такой, как и в schedule_timeout(). Разница в том, что не нужно вызывать schedule() в связке с wake_up_process(). Весьма существенная разница. :-)

Вопрос закрыт.


"Периодическое действие в linux драйвере"
Отправлено Alibaba , 14-Авг-06 07:03 
> Вобше по логике драйвер должен быть атомарен,
> тоесть сделал копирование и все(так как имеет самый высокий приоретет выполнения).

У меня операция атомарная. Используется именно драйвер, так как нужен доступ к адресному пространству ядра. Нужно просто изменить содержимое ячейки. И ради этого сочинять "классический" тандем драйвер-приложение некузяво. :-)

Вариант с таймером самый оптимальный в этом случае. Просто раньше никогда таймерами не пользовался, поэтому и взял schedule_timeout() как наиболее простой (и как оказалось неверный).

Спасибо за участие!