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

2019-07-14 15:01发布

比如在某个任务中的某段代码不能被打断执行而占用时间估计也有几ms,使用了vTaskSuspendAll()调度上锁函数和vTaskResumeAll()解锁函数。在还没有调用vTaskResumeAll()前发生了某个中断,某个中断函数中调用了portYIELD_FROM_ISR(xHigherPriorityTaskWoken)该函数(该函数判断是否有更高优先级任务处于等待状态,如果是要切换),请问这个时候还能保证正常切换到最高优先级吗?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
毛毛lallala
1楼-- · 2019-07-14 18:23
 精彩回答 2  元偷偷看……
freexhd
2楼-- · 2019-07-14 22:28
毛毛lallala 发表于 2018-12-24 17:05
我理解的如果调度器已经上锁了,中段处理函数里那个任务切换是无法切换的,待中断函数推出后,之前的调度器解锁之后,相应执行优先级最高的任务。

woyeshi zhe 我也是这么理解
cknz
3楼-- · 2019-07-14 22:41
你这个问题要看一下freeRTOS的代码实现.vTaskSuspendAll 被调用了,那么当前的任务就相当是最高优先级了,因为此时不能进行任务调度,直至vTaskResumeAll 被调用.但在调用vTaskResumeAll 之前,中断发生了,会触发被阻塞的高优先级任务唤醒,中断服务程序是不能被阻塞的.所以问题来了,被中断唤醒的任务是否被调度执行,就要看代码了.因为vTaskSuspendAll、 vTaskResumeAll 是为了保护临界资源,如果被唤醒的任务也要相同的资源,就会导致问题,最好看一下portYIELD_FROM_ISR 的实现.我的理解是那个中断理的任务调度是不会被执行的.试了,有结果,告诉一下?
cknz
4楼-- · 2019-07-15 02:27
portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;
的确不允许调度,有时间在测试 一下

一周热门 更多>