你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

请教个调度上锁与恢复的问题

[复制链接]
厦门浪子 提问时间:2018-4-25 18:10 /
比如在某个任务中的某段代码不能被打断执行而占用时间估计也有几ms,使用了vTaskSuspendAll()调度上锁函数和vTaskResumeAll()解锁函数。在还没有调用vTaskResumeAll()前发生了某个中断,某个中断函数中调用了portYIELD_FROM_ISR(xHigherPriorityTaskWoken)该函数(该函数判断是否有更高优先级任务处于等待状态,如果是要切换),请问这个时候还能保证正常切换到最高优先级吗?

收藏 评论5 发布时间:2018-4-25 18:10

举报

5个回答
五哥1 回答时间:2018-5-2 10:48:43
可以
andey 回答时间:2018-5-5 23:07:08
提示: 作者被禁止或删除 内容自动屏蔽
厦门浪子 回答时间:2018-5-7 09:51:01
andeyqi 发表于 2018-5-5 23:07
我理解的如果调度器已经上锁了,中段处理函数里那个任务切换是无法切换的,待中断函数推出后,之前的调度器 ...

woyeshi zhe 我也是这么理解
butterflyspring 回答时间:2018-5-7 11:00:16
你这个问题要看一下freeRTOS的代码实现.vTaskSuspendAll 被调用了,那么当前的任务就相当是最高优先级了,因为此时不能进行任务调度,直至vTaskResumeAll 被调用.但在调用vTaskResumeAll 之前,中断发生了,会触发被阻塞的高优先级任务唤醒,中断服务程序是不能被阻塞的.所以问题来了,被中断唤醒的任务是否被调度执行,就要看代码了.因为vTaskSuspendAll、 vTaskResumeAll 是为了保护临界资源,如果被唤醒的任务也要相同的资源,就会导致问题,最好看一下portYIELD_FROM_ISR 的实现.我的理解是那个中断理的任务调度是不会被执行的.试了,有结果,告诉一下?

评分

参与人数 1蝴蝶豆 +5 收起 理由
zero99 + 5

查看全部评分

butterflyspring 回答时间:2018-5-7 11:07:17
portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;
的确不允许调度,有时间在测试 一下

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版