ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
17 июля
297288 Топик полностью
mazur (06.01.2012 22:45 - 07.01.2012 08:55, просмотров: 280) ответил mazur на На примере таймерной службы. В прерывании таймера, настроенного, скажем на 1 мс, выставлялся флаг. Этот флаг можно было сбрасывать или в таймерной службе или в конце карусели.
Поправил. Мэтры, прошу не ругаться и не проходить мимо. Затрону еще раз тему таймеров. Прошу рассказать алгоритмы, кто как реализует таймеры. Задержки, временные интервалы и т.д. Я не зря спрашиваю. Стопорнулся на одном моменте. Итак, один аппаратный таймер, настроен на прерывание по совпадению. Переменная-счетчик в SRAM, каждые 1 мс эта переменная инкрементируется. Как я раньше делал: в прерывании выставлялся флаг. В цикле, карусели, первой запускается таймерная служба (По сути - очереди из программных таймеров, по три байта. Один байт флаги таймеров, два байта - переменные-счетчики) опрашивался этот флаг. Если сброшен, выход. Если установлен, то сброс флага и перебор программных таймеров. Если таймер заблокирован, переход на следующий таймер. Если не заблокирован, декремент значения. Как нуль, выставляется флаг таймера. Пример прикрепил. Этот способ использования таймеров был неплохим, много где использовал. Все работает безотказно. Но есть, как минимум, один минус. В автоматах, имеющих состояние "Пауза", такие таймеры сложно задействовать. Разруливать, искать, какие таймеры блокировать, геморройно. Сейчас же ситуация такая. Карусели нет. Очереди нет. Таймерная служба не канает. Хочется сделать независимые таймеры. Чтобы, если у автоматов состояние "Пауза", таймеры стоят. Сделал пробный вариант. Вроде работает. В автоматах, имеющих состояние "Пауза" точно будет стоять столько, сколько нужно. Алгоритм такой: Аппаратный таймер настроен на 1 мс. При обработчике прерывания инкрементируется переменная-счетчик в SRAM. При установке таймера Set_Timer, копируется значение этого счетчика и задается время, в мс, в SRAM. При следующем проходе задачи Check_Timer сверяет текущее значение с предыдущим. Если изменилось, декрементируется заданное значение времени. Если не нуль, то выход, если нуль, даем понять, что время вышло. Этот алгоритм позволил мне избавиться от флага, выставляемого каждые 1 мс, и необходимости где-то как-то его сбрасывать. Теперь слушаю критику и ваши способы. :)