The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Периодическое действие в linux драйвере"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Периодическое действие в linux драйвере"  
Сообщение от Alibaba (??) on 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-очереди. Но в моём случае - никогда.

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

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]


1. "Периодическое действие в linux драйвере"  
Сообщение от f00l email(??) on 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 секунду и пересылает данные в модуль
или считавыет данные из модуля.

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

2. "Периодическое действие в linux драйвере"  
Сообщение от int_0d email on 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 (в зависимости от контекста)

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

3. "Периодическое действие в linux драйвере"  
Сообщение от Alibaba (??) on 14-Авг-06, 06:55 
>вам нужен таймер. юзать его примерно так:

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

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

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

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

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

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

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

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

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру