ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
17 июля
297316 Топик полностью
fk0, легенда (06.01.2012 23:34, просмотров: 158) ответил mazur на Поправил. Мэтры, прошу не ругаться и не проходить мимо. Затрону еще раз тему таймеров. Прошу рассказать алгоритмы, кто как реализует таймеры. Задержки, временные интервалы и т.д. Я не зря спрашиваю. Стопорнулся на одном моменте. Итак, один
Для "медленных" событий (обрабатываются в big loop) -- по методу rezident'а (см. ниже). Для быстрых (могут возникать быстрей, чем оборачивается цикл) -- прерывание от таймера. Либо под задачу просто выделяется отдельный аппаратный таймер. ДАЛЬШЕ МОЖНО НЕ ЧИТАТЬ, ибо жуткий матан. Либо есть очередь программных таймеров и один аппаратный таймер, в который программируется время срабатывания наиболее раннего программного таймера. При получении прерывания вызвается обработчик. Очередь сортируется по времени (лучше в binary heap). Время везде абсолютное, а не относительное. Переполняется, понятно дело, раз в N секунд (минут). Это чтоб погрешность не накапливалась для периодически срабатываемых событий (задержка от момента срабатывания таймера до его установки на следующий интервал). В более продвинутом варианте непосредственно обработчик ничего не делает (ибо занимает много времени), за исключением совсем уж realtime задач, а только генерирует событие для планировщика, который начинает понимать, что после возврата из прерывания от таймера и завершения обработки предыдущего события можно начинать обрабатывать данное (исключает необходимость синхронизации параллельных процессов).
[ZX]