新闻  |   论坛  |   博客  |   在线研讨会
如何使用Ozone分析Cortex-M故障?
13261589816 | 2022-12-09 15:15:29    阅读:451   发布文章

Ozone是用于J-link和J-Trace的多平台调试,分析工具。独立的图形化界面,可加载IAR,Keil,Gcc,Clang/LLVM等工具链生成的Elf/Dwarf可执行文件,进行C/C++源代码调试和汇编指令调试。可直接使用J-Link和J-Trace内置功能,如无限flash断点,flash下载,指令跟踪等。在Cortex-M架构上,Ozone可以帮助用户快速发现和分析导致CPU故障的软件错误。本文将介绍如何使用Ozone的调试功能,深入了解这些类型的错误。

分析故障工作流程

我们首先在一个示例的基础上演示Ozone 的分析故障工作流程。示例应用程序可以生成不同类型的 Cortex-M 故障,示例可以在此处(https://wiki.segger.com/File:CortexM_FaultTest.zip)下载。在下图中,示例应用程序已下载到SEGGER Cortex-M Trace开发板板。使用的仿真器是 J-Trace PRO V2。程序已运行至_NoThumbFunc()中,当前PC位于跳转地址0的分支上。由于地址 0 处为一条 Thumb 指令,因此恢复程序执行将导致 Cortex-M CPU 故障。我们继续执行程序,看看 Ozone 如何处理故障。

图片


一、目标异常窗口

菜单栏点击 GO 后,程序执行立即中断,并弹出 Ozone 的目标异常对话框:

图片

目标异常窗口显示 CPU 故障描述及其系统寄存器的内容。在此示例中,SHCSR 寄存器 USGFAULTACT 指示发生了Cortex-M UsageFault 异常。UFSR寄存器提供已发生的UsageFault 异常; INVSTATE被置位,表示在无效的 CPU 状态下执行指令。USGFAULTENA 表示已启用 UsageFault 处理程序,如果没有使能改位,异常将升级为HardFault。异常寄存器上下文的解释特定于体系结构。因此,Ozone在异常描述中尽可能多的显示处理过的信息。当程序执行暂停且目标处于异常状态时,都会显示目标异常窗口。


二、向量捕获

图片

开始调试时,Ozone 会启用 Cortex-M 故障向量捕获。这会导致程序执行在进入故障处理程序时立即中止。Ozone 将显示目标异常窗口。如上图所示,可以使用 Ozone 的 Break & Tracepoints 窗口设置或清除单个向量捕获。Ozone还提供命令Break.SetVectorCatch以编程方式编辑目标的矢量捕获状态。例如,此命令可用于在调试启动时修改 Ozone 的默认向量捕获初始化行为。该命令在项目脚本函数OnProjectLoad中使用。


三、调试窗口

现在我们使用Ozone的调试窗口来进一步了解故障。

图片

Call Stack窗口显示目标处于UsageFault异常状态。该窗口显示故障源自函数_NoThumbFunc。我们在Call Stack窗口中选择_NoThumbFunc。在Call Stack窗口中选择调用帧时,Ozone 的调用帧感知调试窗口会将输出切换到所选帧的执行上下文(请参阅上图)。Local Data窗口指示在函数_NoThumbFunc中执行了地址 0 分支。这导致 CPU 在 ARM 状态下执行 Thumb 指令。查看Ozone的寄存器窗口,寄存器UFSR确认CPU已发出INVSTATE UsageFault。

使用跟踪功能分析故障

在不确定的故障情况下,Cortex-M 内核无法提供故障指令的准确 PC,可以使用 Ozone 的跟踪窗口来快速识别故障指令。

图片

如上例所示,使用 Ozone 的 Backtrace Highlighting 功能可以轻松地将不精确的 BusFault 异常追溯到错误的存储指令。

总结

Cortex-M处理器异常包含:

(1)HardFault异常,是缺省异常,固定优先级为-1,优先级比除NMI之外的所有中断和异常更高。

(2)MemManage异常,可通过使用内存保护单元(MPU)引起内存访问冲突异常。

(3)BusFault异常,在任一内存访问错误时触发,例如通过非法读/写,向量捕获。

(4)UsageFault异常,在执行错误时触发。UsageFault异常在向量表第6位,IRQ为-11,具有可配置优先级。如果未启用UsageFault,则会改为触发HardFault。

在任一异常中,都会从向量表中调用异常处理程序,类似于中断处理过程。Ozone检测到目标系统崩溃时,会自动分析目标状态并提供所必要的信息。异常窗口指示崩溃的原因,位置以及NVIC寄存器;Call Stack窗口可以从异常中展开,以便导航到错误位置,即使跨过多个异常( The Call Stack Window can also unwind from an exception to enable easy navigation to the location of error, even across multiple exceptions.)。

更多信息请参考:

https://wiki.segger.com/ Analyzing_Cortex-M_Faults_with_Ozone


*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
北京麦克泰软件技术有限公司(中文简称麦克泰,英文简称 BMR)成立于1995年, 是国内专业的嵌入式系统软件企业,与世界领先的嵌入式软件供应商合作有二十多年的时间,为嵌入式研发提供丰富的工具,软件,解决方案和培训服务。
推荐文章
最近访客