news 2026/8/28 6:39:39

【TriCore-OS】ISR

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【TriCore-OS】ISR

文章目录

  • 1. 中断
  • 1.1 Cat1 与 Cat2 对比
    • 1.2 入口宏的汇编实现
    • 1.3 中断屏蔽级别机制
    • 1.4 OS 如何介入 Cat2 ISR
      • 1.4.1 介入时机总览
      • 1.4.2 Os_Isr_Entry 详解
      • 1.4.3 Os_Isr_Exit 详解
  • 2. 定时器中断(OS_HRT)

1. 中断

1.1 Cat1 与 Cat2 对比

特性Cat1 ISRCat2 ISR
OS介入完全不介入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 自行 rfe)rslcx + rfe

1.2 入口宏的汇编实现

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;从中断返回
Os_Arch_Cat1Entry(func,core,x):.align5svlcx;仅保存 Lower Context movh.a a14,hi:func;计算回调地址 lea a14,[a14]lo:func ji a14;★ 直接跳转到用户回调,不经过 OS

Cat1 的 ji 是无条件跳转,用户 ISR 函数自己负责 rslcx + rfe 返回。

1.3 中断屏蔽级别机制

Os_Isr_DisableAllInterrupts / Os_Isr_SuspendOSInterrupts 的区别在

/* DisableAllInterrupts: 屏蔽到 Cat1 级别(几乎屏蔽所有中断) */Os_Arch_SetIntMaskLevel(OS_CAT1_MASKLEVE);// 26/* SuspendOSInterrupts: 屏蔽到 Cat2 级别(只屏蔽 Cat2,Cat1 仍可抢占) */Os_Arch_SetIntMaskLevel(OS_CAT2_MASKLEVE);// 26

1.4 OS 如何介入 Cat2 ISR

1.4.1 介入时机总览

OS 对 Cat2 的介入分为 入口(Entry) 和 出口(Exit) 两个钩子,包围用户 ISR 回调:

硬件触发中断 │ ▼[Cat2 向量表入口]── svlcx+Os_Arch_SaveContext │ ▼[Os_Isr_Entry]★ OS 介入点1-禁中断、禁调度 │-栈溢出检查 │-设置 ProcType=CAT2 │-记录当前 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 切换上下文 ▼ rslcx+rfe 返回

1.4.2 Os_Isr_Entry 详解

前置处理(进入 ISR 上下文)

coreId=Os_Core_GetLogicId();Os_Arch_IntDisableAll();// 1. 关中断OS_CORE_DISABLESCH(coreId);// 2. 禁止调度(防止 ISR 期间触发调度)// 3. 栈溢出检查(针对被中断的任务栈)taskCfg=OS_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 / 普通 App)

if(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 栈溢出复检nextContext=Os_Core_IsrBuffPop(coreId);// 弹出被中断上下文if(OS_ZERO_VALUE!=OS_CORE_GETINTCNTS(coreId)){// 嵌套 ISR 场景:恢复上层 ISR 的保护域和上下文intedIsrCfg=OS_ISR_GETCFG(((Os_IsrDynType*)nextContext)->isrId);Os_Isr_RestoreNextIsrProtection(intedIsrCfg,coreId);OS_CORE_SETCURRISR(coreId,intedIsrCfg->isrDyn);}else{// 最外层 ISR:恢复到任务上下文intedTaskCfg=OS_TASK_GETCFG(((Os_TaskDynType*)nextContext)->taskId);OS_CORE_ALLOWSCH(coreId);// 使能调度if(Os_Schedler_NeedSchedle(...))// ★ 检查是否需要调度{nextTask=Os_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 coreId=Os_Core_GetLogicId();Os_Arch_ContextDynType*nextContext=Os_Core_IsrGetIsrBuff(coreId);isrId=OS_CORE_GETCURRENTISRID(coreId);isrCfg=OS_ISR_GETCFG(isrId);// 1. 强制释放 Resource(LIFO)if(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_HRT)

2.1 OS_HRT是什么

OS_HRT(High-Resolution Timer)是 AUTOSAR OS 中基于硬件 STM(System Timer Module)的高精度计数器中断服务例程,对应 OS_ISR(OS_HRT) 函数。它本质上是一个 Cat2 类别的 ISR,由 STM 比较匹配触发,负责处理 Counter 的 Expiration Point 队列。

2.2 OS_HRT流程图

2.3 OS_HRT的触发流程

STM 硬件(TIM0==CMP0)│ ▼ 产生中断 → 跳到 Os_Arch_Cat2Entry 生成的向量表入口 │(svlcx 保存上下文 → call Os_Arch_SaveContext → call Os_Isr_Entry)Os_Isr_Entry(Cat2 通用入口,设置 ProcType=CAT2、当前 ISR ID 等)│ ▼ 调用 ISR 回调(即 OS_HRT 函数体,通过 isrCfg->contextCfg->entryAddr) │ ▼ OS_HRT 处理 Expiration Point 队列 │ ▼Os_Isr_Exit(恢复上下文/触发调度)│ ▼ rslcx+rfe 返回被中断现场

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. 临界区结束 } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/28 6:38:31

遮挡剔除 HZB

1. 引言在实时渲染中,遮挡剔除(Occlusion Culling)是提升性能的关键手段之一。它的核心思想很简单:不绘制那些被其他物体挡住、最终不会出现在屏幕上的物体。而 HZB(Hierarchical Z-Buffer,层次 Z 缓冲&…

作者头像 李华
网站建设 2026/8/28 6:38:29

Matlab从入门到精通:核心思维、工具箱应用与工程实践全解析

1. 从零到一:我的Matlab入门心路与核心认知第一次打开Matlab,面对那个简洁的命令行窗口和复杂的工具栏,我和大多数新手一样感到茫然。它不像Python那样“亲民”,也不像C那样“硬核”,它自成一派,是工程计算…

作者头像 李华
网站建设 2026/8/28 6:38:09

古墓丽影亚特兰蒂斯遗迹远程玩 古墓丽影亚特兰蒂斯遗迹串流教程

怎么实现古墓丽影亚特兰蒂斯遗迹远程玩?不少游戏爱好者想要脱离电脑主机守在屏幕前的束缚,随时随地体验遗迹探险、对抗猛兽的乐趣,怎么才能实现古墓丽影亚特兰蒂斯遗迹远程玩呢?无界趣连2.0就是很合适的串流工具,用手机…

作者头像 李华
网站建设 2026/8/28 6:37:06

LLM空间推理能力差?从提示词到函数调用的工程纠正路径

在 Hacker News 上,“How do you correct spatial reasoning of LLMs?” 这个讨论所反映的问题,很多做 LLM 应用的团队都遇到过。文本摘要、意图识别、检索问答做得不错,一旦进入导航指令、室内布局、CAD 辅助、自动排版等场景,模…

作者头像 李华
网站建设 2026/8/28 6:33:03

蜂窝物联网LTE天线选型、仿真与排障实战指南

最近给一款智能水表挑天线,翻了几家厂商的产品页,发现一个挺有意思的变化:LTE天线这个大类下面,不知道什么时候多了一排新版本——FPC软板的、PCB贴片的、外置胶棒的、带IPEX端子的,频段覆盖从Band 3/8铺到Band 1/5/28…

作者头像 李华
网站建设 2026/8/28 6:30:30

必看!加拿大化妆品CNF注册流程,加拿大化妆品CNF认证检测要求

想将您的化妆品成功打入加拿大市场?了解并完成加拿大化妆品CNF注册是您必须跨越的第一道门槛。 加拿大化妆品CNF注册是指加拿大化妆品法规(Cosmetic Notification Form,简称CNF)的注册。加拿大化妆品CNF注册是由加拿大卫生部负责管…

作者头像 李华