Я использую микроконтроллер с ядром C51. У меня есть довольно временная и большая подпрограмма, которую нужно называть каждые 500 мс. RTOS не используется.Точно время вызова функции
То, как я делаю это прямо сейчас, заключается в том, что у меня есть существующее прерывание по таймеру 10 мс. Я устанавливаю флаг после каждых 50 прерываний, которые проверены на то, что они истинны в основном программном цикле. Если флаг является истинным, вызывается подпрограмма. Проблема в том, что к тому моменту, когда цикл программы подходит для обслуживания флага, он уже превышает 500 мс, иногда даже> 515 мс в случае определенных путей кода. Принятое время неточно предсказуемо.
Очевидно, что подпрограмма не может быть вызвана из-за прерывания таймера из-за того большого времени, которое требуется для выполнения. Подпрограмма занимает от 50 мс до 89 мс в зависимости от различных условий.
Есть ли способ гарантировать, что подпрограмма вызывается ровно 500 мсек каждый раз?
У этого подхода есть проблема с упаковкой: если вы выходите из if-statement с тиками == 65500 и next_time == 14 (65550-65536) Я выполняю ваш код 500ms каждый раз через цикл, пока галочки не обернутся вокруг. Также вы должны увеличить next_time ПЕРЕД вызовом do_500ms(). – paxdiablo 2008-10-21 03:49:35
И поскольку вы добавляете 50 к next_time каждый раз, когда вы делаете_500 мс, он может быть в сотни или тысячи к тому времени, когда галочки обертывают, вокруг которых будет огромная задержка до вызова do_500ms() в следующий раз. – paxdiablo 2008-10-21 03:51:49
Я использовал это уже со следующей модификацией, может быть, Майк Ф. может включить это: я сбросил тики на 0 непосредственно перед обслуживанием подпрограммы 500 мс. и исправлено next_time до 50. – 2008-10-23 09:19:33