【TriCore-OS】ISR 文章目录1. 中断1.1 Cat1 与 Cat2 对比1.2 入口宏的汇编实现1.3 中断屏蔽级别机制1.4 OS 如何介入 Cat2 ISR1.4.1 介入时机总览1.4.2 Os_Isr_Entry 详解1.4.3 Os_Isr_Exit 详解2. 定时器中断OS_HRT2.1 OS_HRT是什么2.2 OS_HRT流程图2.3 OS_HRT的触发流程2.4 OS_HRT中断服务函数代码1. 中断1.1 Cat1 与 Cat2 对比特性Cat1 ISRCat2 ISROS介入完全不介入OS完全管理(Entry/Exit/调度)可屏蔽性不可被 OS 屏蔽高于 Cat2 屏蔽级别可被 OS 通过 ICR 屏蔽级别屏蔽向量入口宏Os_Arch_Cat1Entry(func, core, level)Os_Arch_Cat2Entry(cfg, core, level)入口动作直接 ji func 跳转无上下文保存调用svlcx → Os_Arch_SaveContext → Os_Isr_Entry能否调用 OS 服务不能可调用受限 OS 服务如 SetEvent、GetResource上下文切换不切换用被中断任务的栈OS 切换到 ISR 专用栈资源管理无OS 跟踪 ISR 持有的 Resource/Spinlock调度触发不触发退出时可能触发任务调度ProcType 标记OS_ISR_CAT1_TYPE_MASK (0x100)OS_ISR_CAT2_TYPE_MASK (0x080)典型用途极高频/极低延迟硬件中断普通外设中断、OS_HRT、软中断返回方式直接 ji 跳转func 自行 rferslcx rfe1.2 入口宏的汇编实现Cat2入口OS介入Os_Arch_Cat2Entry(cfg,core,x):.align5svlcx;保存 Lower Context 到 CSA call Os_Arch_SaveContext;保存被中断上下文指针到 Core Buffer mov.aa a5,a2;传参被中断上下文 movh.a a4,hi:cfg;传参ISR 配置地址 lea a4,[a4]lo:cfg call Os_Isr_Entry;★ OS 介入入口 rslcx;恢复 Lower Context rfe;从中断返回Cat1入口OS不介入Os_Arch_Cat1Entry(func,core,x):.align5svlcx;仅保存 Lower Context movh.a a14,hi:func;计算回调地址 lea a14,[a14]lo:func ji a14;★ 直接跳转到用户回调不经过 OSCat1 的 ji 是无条件跳转用户 ISR 函数自己负责 rslcx rfe 返回。1.3 中断屏蔽级别机制Os_Isr_DisableAllInterrupts / Os_Isr_SuspendOSInterrupts 的区别在/* DisableAllInterrupts: 屏蔽到 Cat1 级别几乎屏蔽所有中断 */Os_Arch_SetIntMaskLevel(OS_CAT1_MASKLEVE);// 26/* SuspendOSInterrupts: 屏蔽到 Cat2 级别只屏蔽 Cat2Cat1 仍可抢占 */Os_Arch_SetIntMaskLevel(OS_CAT2_MASKLEVE);// 261.4 OS 如何介入 Cat2 ISR1.4.1 介入时机总览OS 对 Cat2 的介入分为 入口Entry 和 出口Exit 两个钩子包围用户 ISR 回调硬件触发中断 │ ▼[Cat2 向量表入口]── svlcxOs_Arch_SaveContext │ ▼[Os_Isr_Entry]★ OS 介入点1│-禁中断、禁调度 │-栈溢出检查 │-设置 ProcTypeCAT2 │-记录当前 ISR 到 Core 状态 │-压栈被中断上下文 │-切换到 ISR 专用栈 ▼[用户 ISR 回调](如 OS_HRT、Os_MultiCoreServer_Handler)│ 可调用 OS 服务SetEvent/GetResource 等 ▼[返回 Os_Isr_Entry 后半段]│-清中断 pending │-栈溢出复检 │-弹出被中断上下文 │-若还有嵌套 ISR恢复上层 ISR 上下文 │-若是最外层 ISR │ ├─ 使能调度 │ ├─ 检查是否需要调度 → 调度器选择下一个任务 │ └─ 恢复被中断任务或切换到新任务 ▼[Os_Isr_Exit]★ OS 介入点2用户主动调用时 │-强制释放未释放的 Resource │-强制释放未释放的 Spinlock │-清除残留的中断禁用状态 │-调用 Os_Arch_ResetContext_Switch 切换上下文 ▼ rslcxrfe 返回1.4.2 Os_Isr_Entry 详解前置处理进入 ISR 上下文coreIdOs_Core_GetLogicId();Os_Arch_IntDisableAll();// 1. 关中断OS_CORE_DISABLESCH(coreId);// 2. 禁止调度防止 ISR 期间触发调度// 3. 栈溢出检查针对被中断的任务栈taskCfgOS_TASK_GETCFG(OS_CORE_GETCURRENTTASKID(coreId));Os_Stack_Measure(taskCfg-contextCfg-stackEndAddr);// 4. Timing Protection 帧间隔检查if(OS_CORE_CHECKTPISENABLE(coreId)!isrCfg-ifTpIsr){Os_Tp_CheckFrameInterval(isrCfg-tpCfg);// 保存被中断 Task/ISR 的执行预算Os_Tp_SaveCurrenBudget(currentTpCfg,coreId);Os_Tp_StartNextBudget(isrCfg-tpCfg,coreId);}// 5. 标记当前核处于 Cat2 ISR 上下文OS_CORE_SETPROTYPE(coreId,OS_ISR_CAT2_TYPE_MASK);OS_CORE_SETCURRISR(coreId,isrCfg-isrDyn);Os_Core_IsrBuffPush(coreId,currentContext);// 6. 压栈被中断上下文调用用户 ISR 回调区分系统 App / 普通 Appif(OS_IFSYSAPP(coreId,isrCfg-ownerAppId)){// 系统 App直接调用不切栈不切 MPU性能优化Os_Arch_Stack_Switch(tmpContext,isrCfg-isrDyn-context);Os_Isr_CallCallbackDirect(isrCfg,coreId);// 内部会 Os_Arch_IntEnableAll()Os_Arch_Stack_Restore(tmpContext);}else{// 普通 App切换 MPU 保护范围App/ISR/Stack 三重Os_Mp_Switch(TRUE,isrCfg-appMpCfg);Os_Mp_Switch(FALSE,isrCfg-isrMpCfg);Os_Arch_MpStackSwitch(...);// 通过 Os_Arch_Context_Switch_ISR 切换上下文含信任域切换Os_Arch_Context_Switch_ISR(tmpContext,isrCfg-isrDyn-context);}Os_Isr_CallCallbackDirect 内部系统 App 路径)Os_Arch_IntEnableAll();// 开中断允许高优先级抢占isrcallback();// ★ 执行用户 ISR 回调如 OS_HRT// 退出回调后的安全检查防御性编程if(OS_ISR_MASK_RESOURCE(isrCfg))// 若有未释放 ResourceOs_Resource_ForceReleaseAll(...);if(OS_ISR_MASK_SPINLOCK(isrCfg))// 若有未释放 SpinlockOs_Spinlock_ForceReleaseAll(...);if(OS_CORE_MASK_INTERRUPT(coreId)OS_ISR_ISTPISR(isrId))// 若中断被禁Os_Core_CleanInterrupts(coreId);Os_Arch_IntDisableAll();后置处理退出 ISR 上下文Os_Arch_ClearPendingIRQ(isrCfg-source);// 清中断 pendingOs_Stack_Measure(isrCfg-contextCfg-stackEndAddr);// ISR 栈溢出复检nextContextOs_Core_IsrBuffPop(coreId);// 弹出被中断上下文if(OS_ZERO_VALUE!OS_CORE_GETINTCNTS(coreId)){// 嵌套 ISR 场景恢复上层 ISR 的保护域和上下文intedIsrCfgOS_ISR_GETCFG(((Os_IsrDynType*)nextContext)-isrId);Os_Isr_RestoreNextIsrProtection(intedIsrCfg,coreId);OS_CORE_SETCURRISR(coreId,intedIsrCfg-isrDyn);}else{// 最外层 ISR恢复到任务上下文intedTaskCfgOS_TASK_GETCFG(((Os_TaskDynType*)nextContext)-taskId);OS_CORE_ALLOWSCH(coreId);// 使能调度if(Os_Schedler_NeedSchedle(...))// ★ 检查是否需要调度{nextTaskOs_Schedler_Schedle(...);// 执行调度Os_Task_TaskSwitch_ForIsr(intedTaskCfg,nextTaskCfg);// 切换到新任务Os_Arch_SetNextContext(nextTask-context);}else{Os_Isr_RestoreInterruptedTask(intedTaskCfg,coreId);// 恢复被中断任务}}1.4.3 Os_Isr_Exit 详解Os_Isr_Exit 是用户 ISR 主动调用以提前退出 ISR 的接口正常返回路径不经过它。它执行强制清理FUNC(void,OS_CODE)Os_Isr_Exit(void){CoreIdType coreIdOs_Core_GetLogicId();Os_Arch_ContextDynType*nextContextOs_Core_IsrGetIsrBuff(coreId);isrIdOS_CORE_GETCURRENTISRID(coreId);isrCfgOS_ISR_GETCFG(isrId);// 1. 强制释放 ResourceLIFOif(OS_ISR_MASK_RESOURCE(isrCfg)){Os_Resource_ForceReleaseAll(OS_ISR_GETRESLISTHEAD(isrCfg-isrDyn));Os_Hook_CallErrorHook(OSServiceId_Os_Isr_Exit,E_OS_RESOURCE);// 报错}// 2. 强制释放 Spinlockif(OS_ISR_MASK_SPINLOCK(isrCfg)){Os_Spinlock_ForceReleaseAll(OS_ISR_GETSPINLISTHEAD(isrCfg-isrDyn));Os_Hook_CallErrorHook(OSServiceId_Os_Isr_Exit,E_OS_SPINLOCK);}// 3. 清除残留的中断禁用状态if(OS_CORE_MASK_INTERRUPT(coreId)){Os_Core_CleanInterrupts(coreId);Os_Hook_CallErrorHook(OSServiceId_Os_Isr_Exit,E_OS_DISABLEDINT);}Os_Arch_IntDisableAll();Os_Arch_ResetContext_Switch(isrCfg-contextCfg,nextContext);// 切换上下文}2. 定时器中断OS_HRT2.1 OS_HRT是什么OS_HRTHigh-Resolution Timer是 AUTOSAR OS 中基于硬件 STMSystem Timer Module的高精度计数器中断服务例程对应 OS_ISR(OS_HRT) 函数。它本质上是一个 Cat2 类别的 ISR由 STM 比较匹配触发负责处理 Counter 的 Expiration Point 队列。2.2 OS_HRT流程图2.3 OS_HRT的触发流程STM 硬件(TIM0CMP0)│ ▼ 产生中断 → 跳到 Os_Arch_Cat2Entry 生成的向量表入口 │(svlcx 保存上下文 → call Os_Arch_SaveContext → call Os_Isr_Entry)▼Os_Isr_Entry(Cat2 通用入口设置 ProcTypeCAT2、当前 ISR ID 等)│ ▼ 调用 ISR 回调即 OS_HRT 函数体通过 isrCfg-contextCfg-entryAddr │ ▼ OS_HRT 处理 Expiration Point 队列 │ ▼Os_Isr_Exit(恢复上下文/触发调度)│ ▼ rslcxrfe 返回被中断现场2.4 OS_HRT中断服务函数代码OS_ISR(OS_HRT) { CoreIdType coreId; ISRType isrId; CounterType cntId; Os_CntExpListNodeCfgType* expListNode; const Os_CounterBaseCfgType* counterBaseCfg; Os_Arch_IntState intState; Os_StatusType ret; uint8 setNextPointFlag OS_COUNTER_SET_POINT; coreId Os_Core_GetLogicId(); // 1. 获取当前核 ID isrId OS_CORE_GETCURRENTISRID(coreId); // 2. 获取当前 ISR ID由 Cat2 入口设置 if( OS_ISR_ISTIMER(isrId) ) // 3. 确认是定时器 ISR { cntId OS_ISR_GETCNTID(isrId); counterBaseCfg OS_COUNTER_GETCFG(cntId); // 4. 清除 STM 中断标志SRC STM ISCR 双清 Os_Arch_Mach_HrtClearInterrupt(((const Os_CounterHrtCfgType*)counterBaseCfg)-HwConfig); Os_Arch_IntDisable(intState); // 5. 临界区开始 // 6. 从优先级队列弹出到期的 Expiration Point ret Os_Counter_ExpListPop(counterBaseCfg, expListNode); if( E_OS_BUFFEMPTY ! ret ) { // 7. 执行到期动作Alarm 回调 / SetEvent 等 (void)Os_Counter_WorkFunc(expListNode, setNextPointFlag); } // 8. 如果 WorkFunc 没有自行设置下一个比较点则从队列取下一个 if( OS_COUNTER_NOTSET_POINT setNextPointFlag ) { Os_Counter_SetNextPoint(counterBaseCfg); } Os_Arch_IntEnable(intState); // 9. 临界区结束 } }

相关新闻

最新新闻

个人语音助手Agent从零实现:语音识别与Agent Loop全攻略

个人语音助手Agent从零实现:语音识别与Agent Loop全攻略

现在很多开发者都在关注 Agent 开发,但真正动手做一个能落地、能跑通的个人语音助手 Agent 并不容易。网上资料大多停留在概念阶段,要么只讲 Prompt,要么只贴一段语音识别代码,很难形成一套完整的闭环方案。本文基于个人项目 Cute…

2026/8/28 6:44:43
YOLO机油泄露检测数据集:工业微小液态缺陷识别实战指南

YOLO机油泄露检测数据集:工业微小液态缺陷识别实战指南

简介:目标检测是计算机视觉基础任务,其核心在于定位与分类的联合优化;在工业场景中,微小缺陷检测面临低对比度、模糊边缘和强背景干扰等独特挑战。YOLO作为轻量高效的目标检测框架,凭借其单阶段架构和端到端训练优势&a…

2026/8/28 6:44:43
新编程语言是否值得用?一套从安装到验证的筛选框架

新编程语言是否值得用?一套从安装到验证的筛选框架

第一次看到“Show HN: Wyzer Programming Language”这个标题时,我的第一反应不是“又多了一个新编程语言”,而是“它到底想解决什么问题”。在 Hacker News 上以 Show HN 方式发布语言项目,说明作者愿意把语法、实现和设计取舍摆到公共场合接…

2026/8/28 6:44:43
移动端Agent实战:从架构设计到工具调用

移动端Agent实战:从架构设计到工具调用

大家好,我是你们的技术博主。最近在做一个移动端项目时,遇到一个很有意思的需求:业务方希望 App 内部不只是一个“被动响应指令”的工具,而是一个能够理解用户意图、自动拆解任务、调用系统能力并最终交付结果的智能体。说白了&am…

2026/8/28 6:44:43
从FLOPs到内存流量:HarDNet如何优化神经网络访存效率

从FLOPs到内存流量:HarDNet如何优化神经网络访存效率

1. 从“算力瓶颈”到“访存瓶颈”的范式转移如果你在2018年前后开始接触深度学习模型部署,尤其是尝试在嵌入式设备或移动端跑一个像样的视觉模型,那你大概率经历过一段“内存焦虑”的时期。那时候,模型设计的焦点几乎完全集中在“计算量”&am…

2026/8/28 6:44:43
基于YOLO与VOC格式数据集的车体缺陷检测实战指南

基于YOLO与VOC格式数据集的车体缺陷检测实战指南

简介:目标检测是计算机视觉的核心任务之一,旨在识别图像中特定物体并定位其位置。其原理通常基于深度学习模型,通过卷积神经网络提取特征,并利用回归和分类头输出边界框与类别。这项技术的价值在于能够替代低效、主观的人工目检&a…

2026/8/28 6:39:42