为什么要优化FromISR的Api

  • 初学的时候更多的是直接使用 xQueueSendToBackFromISR(g_xQueue, pidata, NULL); 没有理解为什么会需要 xHigherPriorityTaskWoken 参数(是否有更高优先级的任务被唤醒了),下面是原理讲解:
  • FreeRTOS有两套Api,一套针对常规任务,一套针对ISR中断
    1. 假设将常规任务的Api能用在中断中,情况会是什么样的?下面这样合理吗显然不合理,明明应该是中断彻底处理完才会需要去调度切换任务,本来中断就非常需要快。
      在这里插入图片描述
    2. 上面这样不行的话,那应该是怎么样的?
      在这里插入图片描述
    3. 答案会是A,因为B的优先级比A高,写队列操作后将其唤醒了,但是却没有切换过去,等中断运行完,真正该切换任务的时候又轮到A了
    4. 那这样的话是不是不符合逻辑,明明B的优先级是比A高,这里唤醒了却因为中断没有切换过去,所以这正是优化的点, xHigherPriorityTaskWoken 参数就是为了告诉编程的你此刻写的中断函数运行的时候,有过更高优先级的B被唤醒了,这个变量就可以让你进行额外操作,具体如下。

怎么优化

  • 优化前的操作
	// 原本的操作
	xQueueSendToBackFromISR(g_xQueue, pidata, NULL); 
  • 优化后的操作
	// 声明一个变量记录是否有更高优先级的任务被唤醒了
	BaseType_t xHigherPriorityTaskWoken = pdFALSE;
	
	xQueueSendToBackFromISR(g_xQueue, pidata, &xHigherPriorityTaskWoken); 
	
	// 如果有的话,调用下面这个函数去切换回优先级更高的任务B
	portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
  • 最终效果如下:
    在这里插入图片描述
Logo

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

更多推荐