Задача такая. В драйвере 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 ядра 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 секунду и пересылает данные в модуль
или считавыет данные из модуля.
Никогда так не делайте.вам нужен таймер. юзать его примерно так:
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 (в зависимости от контекста)
>вам нужен таймер. юзать его примерно так:Спасибо! Помогло.
Код почти такой, как и в schedule_timeout(). Разница в том, что не нужно вызывать schedule() в связке с wake_up_process(). Весьма существенная разница. :-)
Вопрос закрыт.
> Вобше по логике драйвер должен быть атомарен,
> тоесть сделал копирование и все(так как имеет самый высокий приоретет выполнения).У меня операция атомарная. Используется именно драйвер, так как нужен доступ к адресному пространству ядра. Нужно просто изменить содержимое ячейки. И ради этого сочинять "классический" тандем драйвер-приложение некузяво. :-)
Вариант с таймером самый оптимальный в этом случае. Просто раньше никогда таймерами не пользовался, поэтому и взял schedule_timeout() как наиболее простой (и как оказалось неверный).
Спасибо за участие!