Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Множество виртуальных таймров, на одном системном.

590
17 ноября 2009 года
Gigahard
223 / / 03.04.2006
Вопрос, как с помощью системного таймера реализовать несколько программных таймеров, стартующих и останавливающихся в различное время?

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

Казалось бы вроде как все просто, но насколько подобная схема будет тормозить систему? Ведь получается, что выход из прерывания не произойдет, пока не будут обработаны все "подписанты" из реестра текущих событий. А ведь там уже могут быть навешаны уже достаточно объемные функции...

Какие есть альтернативы?
1.9K
17 ноября 2009 года
andriano
474 / / 10.01.2008
Не нужно "производить переход в обработчик", нужно "включить в очередь".
252
17 ноября 2009 года
koderAlex
1.4K / / 07.09.2005
слово "сигнал" слышал ? )
операционная система получает от драйвера теймера сигнал "прошло столько-то времени" , после чего обновляет значения логических таймеров и , если условия выполнены , посылает сигнал "время таймера прошло" приложениям .
это так "на пальцах" объясняю . :)
590
17 ноября 2009 года
Gigahard
223 / / 03.04.2006
А очередь соответственно должна быть основным средством выполнения потока программы?

И видимо очередь с приоритетом?

Т.е. нужно сделать некий диспетчер содержащий эту самую очередь и в бесконечном цикле проверять его на наличие событий?
590
17 ноября 2009 года
Gigahard
223 / / 03.04.2006
Операционки нет. Нет даже BIOSа.

P.S. Чем Ваше "объяснение на пальцах" отличается от моего первого варианта, за исключением разве что типа и источника сигнала?
1.9K
17 ноября 2009 года
andriano
474 / / 10.01.2008
Цитата: Gigahard
Операционки нет. Нет даже BIOSа.

Из первого сообщения это никак не следует.
Телепатов здесь нет.
А коль скоро не оговорено обратное, следует считать, что дело происходит под многозадачной ОС.

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

590
17 ноября 2009 года
Gigahard
223 / / 03.04.2006
Извиняюсь. Да. Недоглядел. Единственное оправдание, что тема создана в разделе "низкоуровневое программирование". :)
252
17 ноября 2009 года
koderAlex
1.4K / / 07.09.2005
в простейшем случае обработчик прерывания знает только указатель на список указателей таймеров . при срабатывании прерывания обработчик проходит по списку и декрементирует значения таймеров и закрывает прерывание . всё . обработку значений таймеров пусть ведёт фоновая программа(ы) . никаких тормозов .
260
17 ноября 2009 года
Ramon
1.1K / / 16.08.2003
Цитата: koderAlex
в простейшем случае обработчик прерывания знает только указатель на список указателей таймеров . при срабатывании прерывания обработчик проходит по списку и декрементирует значения таймеров и закрывает прерывание . всё . обработку значений таймеров пусть ведёт фоновая программа(ы) . никаких тормозов .



Есть только маленький нюанс, время проведенное в обработчике линейно зависит от количества таймеров в списке, что в конечном счете, при соотв. количестве этих самых таймеров заставляет все встать колом.:D

1.9K
17 ноября 2009 года
andriano
474 / / 10.01.2008
Ну, можно, скажем, запретить делать более 65536 таймеров.
Разумные ограничения всегда должны быть.
87
17 ноября 2009 года
Kogrom
2.7K / / 02.02.2008
Цитата: Gigahard
Казалось бы вроде как все просто, но насколько подобная схема будет тормозить систему? Ведь получается, что выход из прерывания не произойдет, пока не будут обработаны все "подписанты" из реестра текущих событий. А ведь там уже могут быть навешаны уже достаточно объемные функции...

Какие есть альтернативы?



Можно использовать что-то вроде сторожевого таймера. Только он не будет сбрасывать контроллер (процессор или что там у вас), а заблокирует таймеры (или вообще прекратит выполнение насовсем), передав управление основной системе.

Понятно, что приоритет прерывания у такого "как бы сторожевого таймера" должен быть выше. Понятно, что в контроллере должно быть больше одного аппаратного таймера (что обычно и бывает) и хотя бы 2 приоритета прерываний.

260
18 ноября 2009 года
Ramon
1.1K / / 16.08.2003
Цитата: Kogrom
Можно использовать что-то вроде сторожевого таймера. Только он не будет сбрасывать контроллер (процессор или что там у вас), а заблокирует таймеры (или вообще прекратит выполнение насовсем), передав управление основной системе.

Понятно, что приоритет прерывания у такого "как бы сторожевого таймера" должен быть выше. Понятно, что в контроллере должно быть больше одного аппаратного таймера (что обычно и бывает) и хотя бы 2 приоритета прерываний.



Чем стояние колом отличается от стояния колом вместе с недо-вачдогом? Каково истинное предназначение вачдога?

252
18 ноября 2009 года
koderAlex
1.4K / / 07.09.2005
Цитата: Ramon
Есть только маленький нюанс, время проведенное в обработчике линейно зависит от количества таймеров в списке, что в конечном счете, при соотв. количестве этих самых таймеров заставляет все встать колом.:D



ну так я сразу сказал "в простейшем случае обработчик .." )

349
18 ноября 2009 года
Phantom-84
656 / / 27.10.2005
Цитата:
Есть только маленький нюанс, время проведенное в обработчике линейно зависит от количества таймеров в списке, что в конечном счете, при соотв. количестве этих самых таймеров заставляет все встать колом.

+1

Действительно, основная проблема заключается в том, чтобы не декрементировать постоянно каждый счетчик. Можно упорядочить список по значению timeout и хранить разницу в тиках до ближайшего события timeout. В этом случае за раз будут обрабатываться только те (относительные) счетчики (а фактически один счетчик и структура, объединяющая несколько таймеров в одну группу), которые соответствуют одному моменту наступления события timeout. Надеюсь, я понятно объяснил.

349
18 ноября 2009 года
Phantom-84
656 / / 27.10.2005
Уточню, что речь идет о программных таймерах, которые переустанавливаются вручную. Для повышения точности регулярных таймеров наверняка есть другие методы, возможно, чем-то схожие с тем, что я описал.
87
18 ноября 2009 года
Kogrom
2.7K / / 02.02.2008
Цитата: Ramon
Каково истинное предназначение вачдога?



Его предназначение - перезапускать зависшую систему. Он работает так: если за определенный период не будет сброшен флаг сторожевого таймера, то таймер перезапускает всю систему.

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

При этом наиболее приоритетная операция будет выполняться при любой сложности, при любом количестве низкоприоритетных логических таймеров.

Иначе, если у всех подпрограмм приоритет одинаков, то надо брать железо помощнее.

1.9K
18 ноября 2009 года
andriano
474 / / 10.01.2008
Цитата: Phantom-84
Действительно, основная проблема заключается в том, чтобы не декрементировать постоянно каждый счетчик...

Ну, я так понимаю, речь уже перешла с самого принципа (вызывать обработчики в прерывании таймера или отложить обработку до завершения прерывания) на способы оптимизации второго варианта.
С одной стороны, задачу нужно решать последовательно, но с другой, конечно, на этапе принятия решения о выборе нужно представлять себе направление дальнейшего пути.
В данном же случае, мне кажется, все равно обсуждение оптимизации преждевременно, т.к. если уж появляется вероятность того, что система "встанет колом" от одного только инкрементирования счетчиков, то чего можно ожидать, если по каждому еще и вызывать обработчик. Притом до завершения аппаратного прерывания.

349
18 ноября 2009 года
Phantom-84
656 / / 27.10.2005
Тут принцип только один - использовать отложенную обработку. Вопрос только в том, чтобы внутри системного обработчика не декрементировать счетчики всех таймеров, а декрементировать только один, т.е. чтобы время работы системного обработчика не зависело от количества таймеров и изменялось лишь незначительно в весьма узких рамках. Короче, это из той же оперы, что и вывод ждущих потоков из runqueue, чтобы не искать готовый к выполнению поток среди ждущих внутри системного обработчика.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог