RTOS上下文切换场景下任务执行与共享内存操作技术问询
高低优先级任务上下文切换问题
场景描述
有两个任务:Task A(高优先级)和Task B(低优先级),condition与mem为全局共享变量。
Task B(低优先级)执行代码:
***Task B (Low priority) *** if (condition) { ..... for (i = 0; i< 10; i++){ // 此时Task B运行到i=4 mem[i] = mem[i] +1; } ..... }
当Task B执行到i=4的内存操作时,高优先级Task A就绪,触发上下文切换。Task A执行代码:
*** TASK A (High priority) ...... enter_critical(); condition = false; mem[i] = 0; exit_critical(); ......
Task A执行完成后,Task B恢复运行。针对该场景,有以下三个技术问题:
- 即使
condition被设为false,内存操作仍会执行吗?(恢复Task B时会重新检查condition吗?) - 若内存操作继续执行,会从哪个索引开始?(i=4还是i=5?)
- Task B执行完毕后,
mem数组的内容会是什么?(是否符合预期的0 0 0 0 1 1 1 1 1 1?)
问题解答
内存操作会继续执行:Task B被抢占前已经进入
if(condition)代码块内部,上下文切换仅保存当前执行状态(程序计数器、寄存器、变量值等),不会回退到if条件判断步骤。因此即使Task A将condition改为false,Task B恢复后会从被打断的位置继续执行,不会重新检查condition。会从i=5开始执行循环体:for循环的执行流程为:判断条件→执行循环体→i自增→再次判断条件。当Task B在i=4的循环体执行过程中被抢占,恢复后会先完成当前i=4的内存操作,随后执行
i++将i变为5,接着判断i<10成立,进入i=5的循环体执行。所以后续内存操作从i=5开始。mem数组内容取决于变量i的作用域:
- 若
i是Task B的局部变量:Task A中的mem[i]属于未定义行为(i未初始化)。结合你给出的预期结果,推测Task A实际是将整个mem数组置为0。这种情况下,Task B恢复后完成i=4的mem[4]+1(值变为1),接着执行i=5到9的操作(每个mem[i]变为1),最终mem数组为[0, 0, 0, 0, 1, 1, 1, 1, 1, 1]。 - 若
i是全局变量:Task A仅会将mem[4]置为0。Task B恢复后完成i=4的mem[4]+1(值变为1),i自增到5后继续处理到9,而mem[0]到mem[3]已被Task B处理过(值为1),最终mem数组为[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]。
- 若
内容的提问来源于stack exchange,提问作者Elyes
相关产品推荐
相关产品推荐

