Я думаю, что это один из тех вопросов типа "vi vs. emacs", но я все равно буду задавать, так как хотел бы услышать мнения людей.
Часто во встроенной системе микроконтроллер имеетпериферийное устройство аппаратного таймера, которое обеспечивает базу синхронизации для подсистемы программного таймера.Эта подсистема позволяет разработчику создавать произвольное (ограниченное системными ресурсами) количество таймеров, которые можно использовать для генерации и управления событиями в системе.Способ, которым программные таймеры обычно управляются, состоит в том, что аппаратный таймер настроен на генерацию с фиксированным интервалом (или иногда только тогда, когда истекает следующий активный таймер).В обработчике прерываний вызывается функция обратного вызова для выполнения действий, специфичных для этого таймера.Как всегда, эти подпрограммы обратного вызова должны быть очень короткими, поскольку они выполняются в контексте прерывания.
Допустим, я создаю таймер, который срабатывает каждые 1 мс, а его подпрограмме обратного вызова требуется 100 мсек для выполнения, и это единственноеИнтерес происходит в системе.Когда подсистема таймера должна планировать следующую обработку этого программного таймера?Должно ли это быть 1 мс от момента возникновения прерывания или 1 мс от момента завершения обратного вызова?
Чтобы сделать вещи более интересными, скажем, что разработчик оборудования приходит и говорит, что в определенных режимах работы требуется скорость ЦПдолжно быть уменьшено до 20% от максимального для экономии энергии.Теперь процедура обратного вызова занимает 500 мкс вместо 100 мкс, но интервал таймера по-прежнему составляет 1 мс.Предположим, что эта увеличенная задержка в обратном вызове не оказывает негативного влияния на систему в этом режиме ожидания.Опять же, когда подсистема таймера должна планировать следующую обработку этого программного времени?T + 1 мс или T + 500 мкс + 1 мс?
Или, возможно, в обоих случаях следует разделить разницу и запланировать ее на T + (execute_time / 2) + 1 мс?