ARM M4+AUTOSAR应用核启动异常:Stopped at vector catch调试求助
问题背景
基于ARM M4核心运行AUTOSAR栈,启动应用核时触发异常,收到错误提示:Stopped at vector catch。已通过Lauterbach调试器获取栈追踪信息,但无法准确定位问题根源,需确认异常是否与Exception_15或栈溢出相关,并获取有效的调试方法。
栈追踪信息
-000 Os_Hal_UnhandledEXC(asm) -> exception -001 Os_CoreAsrGetAsrStatus(inline) ... OS_FUNC_ATTRIBUTE_DEFINITION(OS_LOCAL_INLINE P2VAR(Os_CoreAsrStatusType volatile, AUTOMATIC, OS_VAR_NOINIT), OS_CODE, OS_ALWAYS_INLINE, Os_CoreAsrGetAsrStatus, ( P2CONST(Os_CoreAsrConfigType, AUTOMATIC, OS_CONST) Core )) { 376 return ((P2VAR(Os_CoreAsrStatusType volatile, AUTOMATIC, OS_VAR_NOINIT))Core->Core.Status); -001 Os_CoreOsIsStarted(inline) Core = 0xEED1 350 return (Os_StdReturnType)(Os_CoreAsrGetAsrStatus(Core)->OsState == OS_COREOSSTATE_STARTED); -001 Os_CoreShutdown(Error = 13, Synchronize = 1) Error = 13 Synchronize = 1 core = 0xEED1 1111 if(OS_LIKELY(Os_CoreOsIsStarted(core) != 0u)) -002 Os_SystemShutdown(Error = ???) Error = ??? currentCoreId = OS_CORE_ID_0 = OS_CORE_ID_MASTER ... if(core->Status->ActivationState == OS_CORESTATE_ACTIVATED_ASR) { (void)Os_XSigSend_ShutdownAllCores(Os_Core2AsrCore(core), currentThread, Error); } } } /* #30 Shutdown local core with shutdown synchronization. */ 1263 Os_CoreShutdown(Error, TRUE); -003 Os_ErrProtectionError(Fatalerror = ?) Fatalerror = ? status = ??? ... /* #40 Handle protection hook return value. */ Os_ErrHandleProtectionReaction(protectionReaction, status); /* #50 Resume interrupts. */ Os_IntResume(&interruptState); } else { 1451 Os_SystemShutdown(status); -004 Os_StackOverflowCheck(inline) Os_ErrProtectionError(OS_STATUS_STACKFAULT); Os_ThreadSuspendAndStart(inline) Current = 0x0 Next = 0x0D CallPreThreadHook = 0 1065 Os_StackOverflowCheck(); -004 Os_IsrRun(Isr = 0x0D) Isr = 0x0D interruptedThread = 0x0 interruptState = (Global = 1, Level = 0) 423 Os_ThreadSuspendAndStart(interruptedThread, &Isr->Thread, FALSE); -005 Os_Isr_Core0_Exception_15(asm) ... OS_HAL_ASM_EXPORT(Os_Isr_Core0_Interrupt_161) OS_HAL_ASM_EXPORT(Os_Isr_Core0_Interrupt_321) /* Definitions of the ISR wrappers on OsCore0 */ OS_HAL_ASM_IMPORT(OsCfg_Isr_CounterIsr_SystemTimer) OS_HAL_ASM_THUMB_FUNCTION OS_HAL_ASM_FUNCTION_BEGIN(Os_Isr_Core0_Exception_15) 62 Os_Hal_Cat2Entry_Interrupt OsCfg_Isr_CounterIsr_SystemTimer -006 ST:0x81000000(asm) end of frame
调试建议与问题定位方向
1. 优先确认栈溢出的真实性
从栈追踪看,Os_StackOverflowCheck直接触发了Os_ErrProtectionError(OS_STATUS_STACKFAULT),这是明确的栈溢出告警信号:
- 检查
OsCfg_Isr_CounterIsr_SystemTimer(系统定时器ISR)的栈配置:AUTOSAR中Cat2 ISR的栈大小是否配置足够,是否存在递归调用或局部变量过大的情况。 - 验证启动阶段栈的初始化状态:确认应用核栈的起始地址、大小是否符合配置,是否存在栈初始化不完整导致的溢出误报。
- 查看Lauterbach调试器的栈指针(SP)值,对比栈的起始/结束地址,直接判断是否真的越界。
2. 解析Exception_15的具体触发原因
ARM Cortex-M4中Exception_15对应SysTick异常,此处关联的是系统定时器ISR:
- 检查SysTick定时器的配置:确认时钟源、重载值是否正确,是否在核启动过早阶段就触发了SysTick中断(此时OS尚未完成初始化)。
- 验证ISR入口的上下文切换:
Os_ThreadSuspendAndStart在切换到ISR线程时,是否因为栈溢出导致上下文保存失败,进而触发后续的系统shutdown和未处理异常。 - 查看核心寄存器状态:在Lauterbach中读取
CFSR(Configurable Fault Status Register)、HFSR(HardFault Status Register),这些寄存器会明确指示异常的具体类型(如栈溢出属于MemManage或BusFault的子类)。
3. 追踪错误码13的含义
栈中Os_CoreShutdown的Error参数为13,需查AUTOSAR OS的错误码定义:
- 该错误码通常对应
OS_E_OS_STACKFAULT或相关栈异常,进一步佐证栈溢出的可能性。 - 确认
Os_SystemShutdown中传递的原始错误码,是否在Os_ErrProtectionError阶段被正确传递。
4. 核启动阶段的时序验证
异常发生在应用核启动时,需检查启动流程:
- 确认SysTick中断是否在OS完成核心初始化前被使能:AUTOSAR规范中,核启动阶段应先完成OS核心初始化,再开启外设中断。
- 检查多核同步机制:如果是多核系统,确认主核与应用核的启动同步信号是否正确,是否存在应用核未就绪就触发中断的情况。
5. Lauterbach调试器的进阶用法
- 使用
Data.List命令查看栈内存,检查栈顶附近是否有非法写入或破坏的迹象。 - 设置向量捕获断点(vector catch),在异常触发前捕获上下文,查看触发异常的指令地址和寄存器状态。
- 启用AUTOSAR OS的调试跟踪功能,通过
Os_Trace相关接口输出启动阶段的关键步骤,定位异常发生的时序节点。
内容的提问来源于stack exchange,提问作者user2986042
相关产品推荐
相关产品推荐

