You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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恢复运行。针对该场景,有以下三个技术问题:

  1. 即使condition被设为false,内存操作仍会执行吗?(恢复Task B时会重新检查condition吗?)
  2. 若内存操作继续执行,会从哪个索引开始?(i=4还是i=5?)
  3. Task B执行完毕后,mem数组的内容会是什么?(是否符合预期的0 0 0 0 1 1 1 1 1 1?)

问题解答

  1. 内存操作会继续执行:Task B被抢占前已经进入if(condition)代码块内部,上下文切换仅保存当前执行状态(程序计数器、寄存器、变量值等),不会回退到if条件判断步骤。因此即使Task A将condition改为false,Task B恢复后会从被打断的位置继续执行,不会重新检查condition。

  2. 会从i=5开始执行循环体:for循环的执行流程为:判断条件→执行循环体→i自增→再次判断条件。当Task B在i=4的循环体执行过程中被抢占,恢复后会先完成当前i=4的内存操作,随后执行i++将i变为5,接着判断i<10成立,进入i=5的循环体执行。所以后续内存操作从i=5开始。

  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 00:12:47