我正在使用ARM Cortex-M4微控制器开发FreeRTOS应用程序。
对于精确计时,我想使用基于中断的计时器。中断具有适当的优先级,因此它应该能够调用FreeRTOS API。 ISR会定期调用,并应按照给定的代码唤醒任务:
/* This function is executed by the task I'd like to resume */
void hello_task() {
while (1) {
vTaskSuspend(task);
printf("Tick\n");
}
}
/* The ISR is called by an interrupt about 200 times per second */
void Timer_IRQHandler() {
CLEAR_INTERRUPT_FLAG();
xTaskResumeFromISR(task);
}
ISR正确执行但之后任务没有恢复。 有没有人对这种行为有解释?
谢谢!
答案 0 :(得分:1)
阅读documentation for xTaskResumeFromISR()。它告诉你不要做你正在做的事情。
直接到任务通知提供了执行所描述内容的最佳(最轻量级和高效率)方法。以下页面上有一个有用的示例:http://www.freertos.org/RTOS_Task_Notification_As_Counting_Semaphore.html