查看: 600|回复: 0

[原创] 如何使用Ozone分析Cortex-M故障?

[复制链接]
  • TA的每日心情
    开心
    2023-6-12 14:34
  • 签到天数: 165 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2022-9-23 15:01:54 | 显示全部楼层 |阅读模式
    分享到:


    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 如何处理故障。

    1.png
    一、目标异常窗口

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

    2.png

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


    二、向量捕获
    3.png

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


    三、调试窗口

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

    4.png

    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 的跟踪窗口来快速识别故障指令。

    5.png

    如上例所示,使用 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


    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-5-20 17:29 , Processed in 0.124236 second(s), 16 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.