请教个调度上锁与恢复的问题
比如在某个任务中的某段代码不能被打断执行而占用时间估计也有几ms,使用了vTaskSuspendAll()调度上锁函数和vTaskResumeAll()解锁函数。在还没有调用vTaskResumeAll()前发生了某个中断,某个中断函数中调用了portYIELD_FROM_ISR(xHigherPriorityTaskWoken)该函数(该函数判断是否有更高优先级任务处于等待状态,如果是要切换),请问这个时候还能保证正常切换到最高优先级吗?可以 我理解的如果调度器已经上锁了,中段处理函数里那个任务切换是无法切换的,待中断函数推出后,之前的调度器解锁之后,相应执行优先级最高的任务。 andeyqi 发表于 2018-5-5 23:07
我理解的如果调度器已经上锁了,中段处理函数里那个任务切换是无法切换的,待中断函数推出后,之前的调度器 ...
woyeshi zhe 我也是这么理解 你这个问题要看一下freeRTOS的代码实现.vTaskSuspendAll 被调用了,那么当前的任务就相当是最高优先级了,因为此时不能进行任务调度,直至vTaskResumeAll 被调用.但在调用vTaskResumeAll 之前,中断发生了,会触发被阻塞的高优先级任务唤醒,中断服务程序是不能被阻塞的.所以问题来了,被中断唤醒的任务是否被调度执行,就要看代码了.因为vTaskSuspendAll、 vTaskResumeAll 是为了保护临界资源,如果被唤醒的任务也要相同的资源,就会导致问题,最好看一下portYIELD_FROM_ISR 的实现.我的理解是那个中断理的任务调度是不会被执行的.试了,有结果,告诉一下? portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;
的确不允许调度,有时间在测试 一下
页:
[1]