硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3950|回复: 4
收起左侧

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

[复制链接]

41

主题

215

回帖

338

积分

高级会员

积分
338
发表于 2021-2-24 21:05:21 | 显示全部楼层 |阅读模式
本帖最后由 snakeemail 于 2021-2-24 21:09 编辑

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

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106726
QQ
发表于 2021-2-24 22:00:13 | 显示全部楼层
可以,这个就是中断级任务切换。
回复

使用道具 举报

41

主题

215

回帖

338

积分

高级会员

积分
338
 楼主| 发表于 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 );
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106726
QQ
发表于 2021-2-27 09:32:02 | 显示全部楼层
snakeemail 发表于 2021-2-27 09:17
同样的问题,也出现在队列的函数xQueueSendFromISR中。

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

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

使用道具 举报

41

主题

215

回帖

338

积分

高级会员

积分
338
 楼主| 发表于 2021-2-27 10:39:20 | 显示全部楼层
谢谢。
困扰我的是,我总是认为,任务的切换,是内核自己去切,不要用户代码去干预。有了这个预设的想法,我总是觉得,中断里面切上下文很古怪。
对了,信号量的API在中断里面也有中断上下文切换。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-1 17:08 , Processed in 0.291067 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表