04.04.2015, 20:21
|
#1
|
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823
|
Таймер в OpenWrt
Кто нибудь использвал таймеры в OpenWrt, язык программирования Си?
Вот все что мне удалось нарыть:
Цитата:
Таймеры ядра
Последним классом рассматриваемых задач относительно времени будут таймерные функции. Понятие таймера существенно шире и сложнее в реализации, чем просто выжидание некоторого интервала времени, как мы рассматривали это ранее. Таймер (экземпляров которых может одновременно существовать достаточно много) должен асинхронно возбудить некоторое предписанное ему действие в указанный момент времени в будущем.
Ядро предоставляет драйверам API таймера: ряд функций для декларации, регистрации и удаления таймеров ядра:
Цитата:
#include <linux/timer.h>
struct timer_list {
struct list_head entry;
unsigned long expires;
void (*function)( unsigned long );
unsigned long data;
...
};
void init_timer( struct timer_list *timer );
struct timer_list TIMER_INITIALIZER( _function, _expires, _data );
void add_timer( struct timer_list *timer );
void mod_timer( struct timer_list *timer, unsigned long expires );
int del_timer( struct timer_list *timer );
|
expires - значение jiffies, наступления которого таймер ожидает для срабатывания (абсолютное время) ;
при срабатывании функция function() вызывается с data в качестве аргумента;
чаще всего data — это преобразованный указатель на структуру;
Функция таймера в ядре выполняется в контексте прерывания (Не в контексте процесса! А конкретнее: в контексте обработчика прерывания системного таймера.), что накладывает на неё дополнительные ограничения:
Не разрешён доступ к пользовательскому пространству. Из-за отсутствия контекста процесса, нет пути к пользовательскому пространству, связанному с любым определённым процессом.
Указатель current не имеет смысла и не может быть использован, так как соответствующий код не имеет связи с процессом, который был прерван.
Не может быть выполнен переход в блокированное состояние и переключение контекста. Код в контексте прерывания не может вызвать schedule() или какую-то из форм wait_event(), и не может вызвать любые другие функции, которые могли бы перевести его в пассивное состояние, семафоры и подобные примитивы синхронизации также не должны быть использованы, поскольку они могут переключать выполнение в пассивное состояние.
Код ядра может понять, работает ли он в контексте прерывания, используя макрос: in_interrupt().
Примечание: утверждается, что а). в системе 512 списков таймеров, каждый из которых с фиксированным expires, б). они, в свою очередь, разделены на 5 групп по диапазонам expires, в). с течением времени (по мере приближения expires) списки перемещаются из группы в группу... Но это уже реализационные нюансы.
|
|
|
|