[嵌入式][FreeRTOS]在FreeRTOS中如何优化中断相关的一系列FromISR的Api
·
为什么要优化FromISR的Api
- 初学的时候更多的是直接使用
xQueueSendToBackFromISR(g_xQueue, pidata, NULL);没有理解为什么会需要xHigherPriorityTaskWoken参数(是否有更高优先级的任务被唤醒了),下面是原理讲解: - FreeRTOS有两套Api,一套针对常规任务,一套针对ISR中断
- 假设将常规任务的Api能用在中断中,情况会是什么样的?下面这样合理吗显然不合理,明明应该是中断彻底处理完才会需要去调度切换任务,本来中断就非常需要快。

- 上面这样不行的话,那应该是怎么样的?

- 答案会是A,因为B的优先级比A高,写队列操作后将其唤醒了,但是却没有切换过去,等中断运行完,真正该切换任务的时候又轮到A了
- 那这样的话是不是不符合逻辑,明明B的优先级是比A高,这里唤醒了却因为中断没有切换过去,所以这正是优化的点,
xHigherPriorityTaskWoken参数就是为了告诉编程的你此刻写的中断函数运行的时候,有过更高优先级的B被唤醒了,这个变量就可以让你进行额外操作,具体如下。
- 假设将常规任务的Api能用在中断中,情况会是什么样的?下面这样合理吗显然不合理,明明应该是中断彻底处理完才会需要去调度切换任务,本来中断就非常需要快。
怎么优化
- 优化前的操作
// 原本的操作
xQueueSendToBackFromISR(g_xQueue, pidata, NULL);
- 优化后的操作
// 声明一个变量记录是否有更高优先级的任务被唤醒了
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
xQueueSendToBackFromISR(g_xQueue, pidata, &xHigherPriorityTaskWoken);
// 如果有的话,调用下面这个函数去切换回优先级更高的任务B
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
- 最终效果如下:

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)