ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

【TriCore-OS】TerminateTask

2026/8/28 17:47:49 拓冰建站 浏览量
【TriCore-OS】TerminateTask 1. TerminateTask流程图2. TerminateTask调用层3. TerminateTask状态切换4. TerminateTask调用栈任务 A 运行中(RUNNING)│ │TerminateTask()│ ┌─────────────────────────────────────────────────┐ │ │ Os_Task_TerminateTask │ │ │ ├─ ① 调用上下文检查必须在 Task 中 │ │ │ ├─ ② 中断禁用检查 │ │ │ ├─Os_Arch_IntDisable()│ │ │ ├─ ③ Resource 占用检查 │ │ │ │ └─ 若占用:ForceReleaseAllE_OS_RESOURCE │ │ │ ├─ ④ Spinlock 占用检查 │ │ │ │ └─ 若占用:ForceReleaseAllE_OS_SPINLOCK│ │ │ ├─ ⑤ activationsCnt可再次激活 │ │ │ ├─ ⑥ Os_Monitor_TaskTerminateFlagTRUE │ │ │ ├─ ⑦Os_Task_TaskReset(A)│ │ │ │ ├─ Os_Stack_Measure栈溢出检查 │ │ │ │ ├─PostTaskHook(A)│ │ │ │ ├─ stateREADY/SUSPENDED │ │ │ │ │(根据 activationsCnt vs maxActivations)│ │ │ │ ├─ eventDyn.Triggered0│ │ │ │ ├─ eventDyn.Waiting0│ │ │ │ ├─ currentPriocfgPrio │ │ │ │ └─ Os_Tp_ResetCurrentBudget时序保护 │ │ │ ├─ ⑧Os_Schedler_DeleteTask(A)│ │ │ │ ├─TaskQue_Pop(queues[A.prio])│ │ │ │ ├─BitMap_Clear(A.prio)若队列空 │ │ │ │ └─ 若 runPrio!cfgPrio:│ │ │ │ └─TaskQue_Pop(queues[A.runPrio])│ │ │ ├─ ⑨Os_Schedler_Schedle()│ │ │ │ ├─BitMap_CountLeadZeros()→ nextPrio │ │ │ │ ├─TaskQue_Get(queues[nextPrio])→ nextTask│ │ │ │ └─ currentTasknextTask │ │ │ ├─ ⑩Os_Task_SetNextTaskData(next)│ │ │ │ ├─ Os_Mp_Switch内存保护切换 │ │ │ │ ├─ next.stateRUNNING │ │ │ │ ├─OS_CORE_SETCURRTASK(next)│ │ │ │ ├─OS_CORE_SETAPPID(next.appId)│ │ │ │ └─PreTaskHook(next)│ │ │ └─ ⑪Os_Arch_ResetContext_Switch(A.ctx,B.ctx)│ │ │ ├─Os_Arch_ResetContext(A)│ │ │ │ ├─ 读当前 PCXI │ │ │ │ ├─ 回收 CSA 链到 FCX 空闲链表 │ │ │ │ ├─Os_Arch_CreatInitContext(A)│ │ │ │ └─Os_Arch_CreatRunContext(A)│ │ │ ├─MTCR(PCXI,B.runCSA)│ │ │ ├─ RSLCX恢复 B 的 Lower │ │ │ └─ RFE恢复 B 的 Upper跳转 │ │ └─────────────────────────────────────────────────┘ │ ▼ 任务 B 开始运行(从上次被抢占处恢复)5. TerminateTask代码逻辑5.1 TerminateTaskTerminateTask(void){#if(OS_MEMORY_PROTECTIONSTD_ON)Os_SysCallParamType sysCallParam;Os_SysCall(Os_Syscall_TerminateTask_ID,sysCallParam);// 走 SysCall trapretsysCallParam.Os_TerminateTask.retVal;#elseretOs_Task_TerminateTask();// 直接调用#endif}5.2 Os_Task_TerminateTaskOs_Task_TerminateTask(void){OS_ORTI_API_MONITOR_ENTRY(OSServiceId_TerminateTask);coreIdOs_Core_GetLogicId();/* 第 1 阶段上下文检查只有 2 道 */if(OS_CORE_PROCESSTYPEMATCH(coreId,OS_TERMINATETASK_ACCESS))retE_OS_CALLEVEL;// ① 必须在 Task 中调用elseif(OS_CORE_MASK_INTERRUPT(coreId))retE_OS_DISABLEDINT;// ② 中断禁用else{/* 第 2 阶段禁中断临界区 */Os_Arch_IntDisable(intState);taskCfgOS_TASK_GETCFG(OS_CORE_GETCURRENTTASKID(coreId));/* 第 3 阶段资源/自旋锁检查 */if(OS_TASK_MASK_RESOURCE(taskCfg)){Os_Resource_ForceReleaseAll(...);// ③ 强制释放所有 ResourceretE_OS_RESOURCE;}elseif(OS_TASK_MASK_SPINLOCK(taskCfg)){Os_Spinlock_ForceReleaseAll(...);// ④ 强制释放所有 SpinlockretE_OS_SPINLOCK;}else{/* 第 4 阶段终止任务核心 */taskCfg-taskDyn-activationsCnt;// ⑤ 激活计数1可再次激活Os_Monitor_TaskTerminateFlag[coreId]TRUE;// ⑥ 监控标志Os_Task_TaskReset(taskCfg);// ⑦ 状态机重置retOs_Schedler_DeleteTask(scheduler,taskCfg-taskDyn);// ⑧ 从就绪队列移除}/* 第 5 阶段任务切换 */if(E_OS_OKret){// ORTI hook 触发Os_Orit_TaskState_Trigger(coreId,taskId,OS_ORTI_TASK_TERMINATED_TRIGGER);// 选 nextTask 并切换nextDynOs_Schedler_Schedle(scheduler);// ⑨ 选下一个任务nextTaskCfgOS_TASK_GETCFG(nextDyn-taskId);Os_Task_SetNextTaskData(nextTaskCfg);// ⑩ 更新 nextTask 状态Os_Arch_ResetContext_Switch(taskCfg-contextCfg,nextTaskCfg-taskDyn-context);// ⑪ 重置式 CSA 切换}Os_Arch_IntEnable(intState);}returnOs_Hook_CallErrorHook(OSServiceId_TerminateTask,ret);}5.2.1 Os_Task_TaskResetOs_Task_TaskReset(taskCfg){/* 栈溢出检查 */Os_Stack_Measure(taskCfg-contextCfg-stackEndAddr);/* 监控结束时间处理 */Os_Monitor_EndTimeDeal();/* Post-Task Hook */OS_CORE_SETPROTYPE(coreId,OS_POSTTASKHOOK_TYPE_MASK);OS_POSTTASKHOOK(taskCfg);// ① 退出 HookOS_CORE_SETPROTYPE(coreId,OS_TASK_TYPE_MASK);/* 状态机根据激活计数决定下一状态 */if(activationsCnt!maxActivations)stateREADY;// ②a 还有激活次数 → READYelsestateSUSPENDED;// ②b 无激活次数 → SUSPENDED/* 清除事件掩码 */eventDyn.Triggered0;// ③ 清触发掩码eventDyn.Waiting0;// ④ 清等待掩码/* 恢复优先级 */currentPriocfgPrio;// ⑤ 恢复到配置优先级/* 时序保护重置预算 */Os_Tp_ResetCurrentBudget(taskCfg-tpCfg,coreId);// ⑥}5.2.2 Os_Schedler_DeleteTaskOs_Schedler_DeleteTask(scheduler,taskDyn){taskPriotaskCfg-cfgPrio;taskRunPriotaskDyn-runPrio;// 可能因 GetResource 改变// 从配置优先级队列弹出Os_TaskQue_Pop(taskQueues[taskPrio]);if(队列空)Os_BitMap_Clear(bitMap,taskPrio);// 若运行优先级不同如持锁提升过也要从该优先级队列弹出if(taskRunPrio!taskPrio){Os_TaskQue_Pop(taskQueues[taskRunPrio]);if(队列空)Os_BitMap_Clear(bitMap,taskRunPrio);}}5.2.3 Os_Arch_ResetContext_SwitchOs_Arch_ResetContext_Switch(cfg,next){/* 1. 重置当前任务的 CSA 链回收 */Os_Arch_ResetContext(cfg-contextDyn,cfg);/* 2. 切到 next 的 CSA 链 */OS_ARCH_MTCR(PCXI,next-runCSA);OS_ARCH_ISYNC();/* 3. 清 CDC调用深度计数 */OS_ARCH_MTCR(PSW,MFCR(PSW)~CDC_7F);OS_ARCH_ISYNC();/* 4. 恢复 next 的 Lower Context */OS_ARCH_RSLCX();/* 5. 恢复 next 的 Upper Context 跳转 */OS_ARCH_DSBAR();OS_ARCH_RFE();}5.2.3.1 Os_Arch_ResetContextOs_Arch_ResetContext(current,cfg){tempPxciValueMFCR(PCXI);// 读当前 PCXIcsaAddrGET_CSAADDRESS(tempPxciValue);// 当前 CSA 地址initCsaAddrGET_CSAADDRESS(current-initCSA);// 初始 CSA 地址if(csaAddrinitCsaAddr){// 情况 A只剩一个 CSA就是 initCSA// 直接重建 runCSAOs_Arch_CreatRunContext(current,cfg);}else{// 情况 B有多个 CSA运行中累积的if(tempPxciValue!OS_CONTEXT_INIT){fxciValueMFCR(FCX);// 读空闲链表头*(volatileuint32*)(initCsaAddr)fxciValue;// 把 initCSA 链入空闲链表MTCR(FCX,tempPxciValue);// FCX 指向被回收的 CSAISYNC();}Os_Arch_CreatInitContext(current,cfg);// 重建 initCSAOs_Arch_CreatRunContext(current,cfg);// 重建 runCSA}MTCR(PCXI,tempPxciValue);// 恢复 PCXIISYNC();}