snakeemail 发表于 2021-2-24 21:05:21

中断里,函数xEventGroupSetBitsFromISR返回值是pdPASS,要切换上下文?

本帖最后由 snakeemail 于 2021-2-24 21:09 编辑

下面是freertos第18章的例子。
函数xEventGroupSetBitsFromISR返回值是pdPASS,就要调用portYIELD_FROM_ISR(xHigherPriorityTaskWoken)。
问题:为什么要调用portYIELD_FROM_ISR?
我的理解是,函数xEventGroupSetBitsFromISR返回值是pdPASS,那么可以告诉内核,立即切换上下问,这样可以更快的让阻塞的任务得到响应。
如果返回值不成功,那内核根本就不知道,有事件被设置,所以啥都不用管,退出去了。
我的理解对吗?


eric2013 发表于 2021-2-24 22:00:13

可以,这个就是中断级任务切换。

snakeemail 发表于 2021-2-27 09:17:45

同样的问题,也出现在队列的函数xQueueSendFromISR中。

问题背景:函数xQueueSendFromISR会检查一下队列,如果有优先级更高的任务,就将pxHigherPriorityTaskWoken置为真,如果pxHigherPriorityTaskWoken为真,在中断中做上下文切换,退出中断后会切到高优先级的任务。

问:函数xQueueSendFromISR为什么非要检查一下任务优先级?

我的想法,内核认为,既然用户调用了函数xQueueSendFromISR,那么肯定有另外一个任务task_Recieve,可能正在阻塞(很可能是高优先级任务),等待队列发过来数据。
因为中断的消息是紧急消息,需要立即处理,所以函数xQueueSendFromISR得到高优先级任务标志pxHigherPriorityTaskWoken,在中断中切上下文,退出中断后,程序就跑到高优先级任务task_Recieve了。


BaseType_t xQueueSendFromISR(QueueHandle_t xQueue,    const void *pvItemToQueue,BaseType_t *pxHigherPriorityTaskWoken );

eric2013 发表于 2021-2-27 09:32:02

snakeemail 发表于 2021-2-27 09:17
同样的问题,也出现在队列的函数xQueueSendFromISR中。

问题背景:函数xQueueSendFromISR会检查一下队列 ...

对,这就是中断级任务切换的作用,让就绪的最高优先任务得到及时执行。

snakeemail 发表于 2021-2-27 10:39:20

谢谢。
困扰我的是,我总是认为,任务的切换,是内核自己去切,不要用户代码去干预。有了这个预设的想法,我总是觉得,中断里面切上下文很古怪。
对了,信号量的API在中断里面也有中断上下文切换。:D
页: [1]
查看完整版本: 中断里,函数xEventGroupSetBitsFromISR返回值是pdPASS,要切换上下文?