У меня есть онлайн-курс по системам реального времени, где FreeRTOS используется для демонстрации различных функциональных возможностей RTOS. Проблема, с которой я сталкиваюсь сейчас, заключается в следующем:
Я понял функциональность функции увеличения приоритета, но не мог понять, как измерить время выполнения задачи. В частности, проблема требует от нас использования функции vApplicationTickHook (void). Любая подсказка будет оценена. Я также разместил сообщение на форуме, но ответа не получил, поэтому разместил здесь.
Прежде всего позвольте мне предварять свой ответ комментарием о том, что требования этого вопроса причудливы, а не то, с чем я когда-либо сталкивался на практике. Это может быть полезно в качестве упражнения для знакомства с FreeRTOS. Но это не то, что я бы сделал в реальном проекте. Вместо этого я бы разработал задачи более разумно.
vApplicationTickHook()
запускается периодически, один раз каждый тик. Он запускается из контекста таймера ISR, поэтому он выгружает даже высокоприоритетную задачу A. Поскольку он запускается периодически, мы можем использовать его для опроса необходимой нам информации. FreeRTOS включает в себя много Task Utilities, один из них, вероятно, предоставляет некоторую соответствующую информацию.
Первое, что я нашел, что выглядит полезным vTaskGetInfo()
возвращает указатель на TaskStatus_t
структура, которая содержит ulRunTimeCounter
, общее время выполнения, выделенное для задачи до сих пор. Итак, из vApplicationTickHook()
ты можешь позвонить vTaskGetInfo()
опросить общее время выполнения задачи B. Вспомните предыдущее время выполнения Задачи B в локальной статической переменной и когда его время выполнения не увеличилось для N мс, тогда вы будете знать, что пришло время повысить приоритет задачи B.
Других решений пока нет …