Как использовать функцию vApplicationTickHook () для измерения времени выполнения задачи в freeRTOS?

У меня есть онлайн-курс по системам реального времени, где FreeRTOS используется для демонстрации различных функциональных возможностей RTOS. Проблема, с которой я сталкиваюсь сейчас, заключается в следующем:

  • В основной функции созданы две задачи (A и B) и запущен планировщик реального времени.
  • Задача B имеет более низкий приоритет, чем задача A. Задача B должна назначаться по расписанию каждые n мс, но, поскольку приоритет задачи A выше, чем у задачи B, B не назначается по расписанию каждые n мс.
  • Итак, нам нужно написать новую функцию, которая берет дескрипторы задач A и B и измеряет время выполнения задачи B.
  • Если время выполнения B больше чем n мс, это увеличивает приоритет.

Я понял функциональность функции увеличения приоритета, но не мог понять, как измерить время выполнения задачи. В частности, проблема требует от нас использования функции vApplicationTickHook (void). Любая подсказка будет оценена. Я также разместил сообщение на форуме, но ответа не получил, поэтому разместил здесь.

-1

Решение

Прежде всего позвольте мне предварять свой ответ комментарием о том, что требования этого вопроса причудливы, а не то, с чем я когда-либо сталкивался на практике. Это может быть полезно в качестве упражнения для знакомства с FreeRTOS. Но это не то, что я бы сделал в реальном проекте. Вместо этого я бы разработал задачи более разумно.

vApplicationTickHook() запускается периодически, один раз каждый тик. Он запускается из контекста таймера ISR, поэтому он выгружает даже высокоприоритетную задачу A. Поскольку он запускается периодически, мы можем использовать его для опроса необходимой нам информации. FreeRTOS включает в себя много Task Utilities, один из них, вероятно, предоставляет некоторую соответствующую информацию.

Первое, что я нашел, что выглядит полезным vTaskGetInfo() возвращает указатель на TaskStatus_t структура, которая содержит ulRunTimeCounter, общее время выполнения, выделенное для задачи до сих пор. Итак, из vApplicationTickHook() ты можешь позвонить vTaskGetInfo() опросить общее время выполнения задачи B. Вспомните предыдущее время выполнения Задачи B в локальной статической переменной и когда его время выполнения не увеличилось для N мс, тогда вы будете знать, что пришло время повысить приоритет задачи B.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]