【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. 临界区结束 } }

相关新闻

元胞自动机建模:从森林火灾到美赛实战的Python实现与技巧

元胞自动机建模:从森林火灾到美赛实战的Python实现与技巧

1. 项目概述:当数学建模遇上元胞自动机如果你正在为美国大学生数学建模竞赛(MCM/ICM,俗称“美赛”)做准备,并且对“元胞自动机”这个听起来有点玄乎的工具感到既好奇又无从下手,那么这篇笔记可能就是为你准…

2026/10/27 10:39:08 阅读更多 →
PyTorch模型层冻结:迁移学习中的参数固定原理与工程实践

PyTorch模型层冻结:迁移学习中的参数固定原理与工程实践

1. 项目概述:为什么我们需要“冻结”网络层?在深度学习的模型训练与微调实践中,我们经常会遇到一个非常实际的需求:只更新模型的一部分参数,而让另一部分参数保持“冻结”状态,不参与反向传播和梯度更新。这…

2026/10/24 9:55:58 阅读更多 →
从国赛题看实战渗透:手工分析与逻辑推理的思维跃迁

从国赛题看实战渗透:手工分析与逻辑推理的思维跃迁

1. 从一道国赛题看实战渗透的思维跃迁2022年的那场中职网络空间安全国赛,对于很多刚入行的朋友来说,可能是一道难以逾越的坎。我最近重新复盘了其中的竞赛试题4,发现它远不止是一道“找Flag”的题目,更像是一个精心设计的、高度贴…

2026/10/26 12:18:45 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/1 0:24:43 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/31 10:20:19 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/31 10:20:23 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/1 1:06:58 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/31 10:30:19 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/31 9:29:43 阅读更多 →

日新闻

周新闻

月新闻