You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 13:44:51