Гарантирует ли FreeRTOS, что первый тик таймера будет ровно 1 мс? - PullRequest
1 голос
/ 06 января 2020

Я внедряю программные сторожевые таймеры, чтобы гарантировать, что задача с частотой 1 кГц выполняется в установленный срок (т. Е. 1 мс). Но мне интересно, есть ли ровно 1 мс между началом 1 кГц и тиком 1.

Насколько я понимаю, это то, что происходит, когда FreeRTOS запускается

vPortSetupTimerInterrupt(); // Tick 0 starts
...
prvPortStartFirstTick(); // Context switch

// After the context switch, the 1kHz task starts

Между тиками 0 и отметка 1, задача 1 кГц не получает целых 1 мс для выполнения полезной работы, потому что некоторое время было потрачено на вызовы от vPortSetupTimerInterrupt() до prvPortStartFirstTick(). Это правильно? И если так, это повод для беспокойства? Или время дополнительной задержки настолько мало, что оно пренебрежимо мало?

Я работаю на ARM Cortex M4 (серия STM32F302).

1 Ответ

1 голос
/ 06 января 2020

Вы правы в том, что выполнение из vPortSetupTimerInterrupt () в prvPortStartFirstTick () (не уверенное, что это за функция, а не предоставленная FreeRTOS) действительно занимает некоторое время - как и выполнение любой инструкции. Если это проблема или нет, зависит от вашего приложения - но если это проблема, то вы, вероятно, не будете каждый получать точно 1 мс до первого тика. Подумайте о том, чтобы сделать это наоборот - скажем, первая задача запускается до запуска таймера - тогда первая задача должна быть той, которая запускает время - так что вы снова будете проводить некоторое время в этой задаче, делая что-то другое чем вы хотите, чтобы задача выполнялась.

...