0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用Ozone分析Cortex-M异常

麦克泰技术 来源:麦克泰技术 2024-11-29 11:14 次阅读

Ozone可以帮助用户快速分析和查找导致CPU故障的软件bug。本文解释如何使用Ozone的调试功能,深入了解Cortex-M架构上的这些错误。

故障分析流程

我们首先基于一个示例应用程序演示Ozone的故障分析工作流。示例应用程序可以生成不同类型的Cortex-M故障,工程下载链接https://wiki.segger.com/File:CortexM_FaultTest.zip(请复制链接到浏览器下载)。在下图中,示例应用程序被下载到SEGGER Cortex-M trace参考板,调试工具使用J-Trace PRO。程序执行到函数_NoThumbFunc中,PC位于跳转到地址0的指令处,由于在地址0处是一条Thumb指令,继续执行程序将导致Cortex-M CPU故障。恢复程序执行,看看Ozone是如何处理故障。

4f0a964e-adff-11ef-93f3-92fbcf53809c.png

目标异常对话框

点击GO后,程序执行中断,Ozone弹出目标异常对话框:

4f39e8c2-adff-11ef-93f3-92fbcf53809c.png

目标异常对话框描述了CPU故障及其系统寄存器上下文。本例中,SHCSR寄存器的USGFAULTACT位表示发生了一个Cortex-M UsageFault异常。寄存器UFSR提供了发生的UsageFault异常的具体类型。示例中,INVSTATE位被置位,表示指令在无效的CPU状态下执行。USGFAULTENA字段表示启用了UsageFault处理程序,否则异常将升级为HardFault。异常寄存器上下文的解释与特定体系结构相关,Ozone旨在通过异常描述显示尽可能多的处理信息,当程序执行停止并且目标处于异常状态时,会显示目标异常对话框。

向量捕获

4f4db532-adff-11ef-93f3-92fbcf53809c.png

当调试会话开始时,Ozone设置捕获所有Cortex-M故障向量,在程序进入错误处理程序时立即中断执行,也使Ozone能够在故障进入时立即弹出目标异常对话框。可以通过Ozone的Break&Tracepoints窗口设置或清除某个向量捕获。Ozone也提供命令Break.SetVectorCatch以编程方式设置目标的向量捕获状态。例如,该命令可以用来修改Ozone在调试会话开始时的默认vector catch 的行为,该命令在项目脚本函数OnProjectLoad中使用。

调试窗口

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

4f5e9c3a-adff-11ef-93f3-92fbcf53809c.png

Call Stack窗口表示目标处于UsageFault异常状态。该窗口还指出故障源自函数_NoThumbFunc。在Call Stack窗口中选择_NoThumbFunc调用帧,Ozone的调用帧感知调试窗口将输出切换到所选帧的执行上下文。Local Data窗口表明在_NoThumbFunc函数中执行了一个到地址0的跳转,导致CPU在ARM状态下执行Thumb指令。查看Ozone的寄存器窗口,寄存器UFSR确认CPU已经发出INVSTATE UsageFault。这是Ozone基本故障分析工作流程。

嵌套的异常

Ozone可以提供关于Cortex-M上嵌套异常和嵌套故障的准确信息。为了演示这一点,让我们继续调试前一节的示例应用程序。我们现在用一条未定义的指令覆盖UsageFault处理程序的单个分支指令:

4f918a32-adff-11ef-93f3-92fbcf53809c.png

在跳过0x8000384地址的未定义指令后,Ozone的目标异常对话框再次弹出:

4fade88a-adff-11ef-93f3-92fbcf53809c.png

对话框通知抢占了UsageFault异常的为HardFault异常。除了寄存器字段INVSTATE之外,还设置了字段UNDEFINSTR。这表明在调用路径中发生了两种类型的UsageFault异常。HFSR寄存器字段FORCED进一步表明UNDEFINSTR异常已经升级为HardFault。

由于Cortex-M CPU现在正在处理嵌套异常,Ozone的Call Stack窗口相应更新:

4fbd9e38-adff-11ef-93f3-92fbcf53809c.png

在多个堆栈上嵌套异常

关于嵌套异常的信息可以占用两个堆栈,如下一个示例所示,在这种情况下,Ozone能够提供准确的调用堆栈和本地数据信息。本例中,程序执行已停止在调用堆栈5级的SVC指令上:

4feb01b6-adff-11ef-93f3-92fbcf53809c.png

在执行SVC调用之后,在处理程序模式下执行了一个附加的函数调用路径。应用程序现在停止在load加载指令上,该指令即将从无效地址0x100000加载:

5001437c-adff-11ef-93f3-92fbcf53809c.png

此时,Ozone的Call Stack窗口表明堆栈交换已经发生。从表列stack Used中堆栈使用值0的位置,用户可以看到:

上面的调用帧,包括SVC_Handler都在主栈上。

下面的调用帧,包括SVCall Exception)位于进程堆栈上。

当前使用了40字节的主堆栈和88字节的进程堆栈。

注意,Ozone用尖括号括起了特定于目标的调用帧。继续执行程序,看看Ozone是如何处理即将发生的故障。程序恢复执行后,立即弹出目标异常对话框,指示HardFault异常:

501321e6-adff-11ef-93f3-92fbcf53809c.png

由于没有启用BusFault异常处理程序,Cortex-M将BusFault异常升级为HardFault。寄存器字段PRECISERR表示发生了精确的BusFault异常。字段BFARVALID表示错误的load/store指令的内存访问地址可用。Ozone将所有这些信息集成到目标异常对话框顶部区域中的异常描述中。字段SVCALLACT进一步表明,一个SVC处理程序已被当前异常抢占。

关闭目标异常对话框,使用Ozone的调试窗口进一步调查故障。

5036b7d2-adff-11ef-93f3-92fbcf53809c.png

如上图所示,Ozone的调用帧感知调试窗口提供了故障的清晰图像:Local data窗口显示了解引用数据指针的无效值。Call Stack窗口显示完整的程序执行路径,跟踪多个嵌套异常和CPU堆栈。用户可以在register窗口中查询到相同信息。

使用Trace分析故障

在不精确的故障场景中,当Cortex-M内核无法提供故障指令的精确PC时,可以使用Ozone的trace窗口来快速识别故障指令,确定更复杂故障的原因,特别是不精确的故障。

5052a816-adff-11ef-93f3-92fbcf53809c.png

如上图所示,使用Ozone的回溯特性,可以很容易地将不精确的BusFault异常追溯到出错的存储指令。

Ozone是一块面向嵌入式应用程序的调试器。使用Ozone,可以在C/ C++ /Rust源代码和汇编级别调试嵌入式应用。Ozone与J-Link和J-Trace紧密集成,提供丰富的调试分析功能。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    31

    文章

    5332

    浏览量

    120194
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10845

    浏览量

    211447
  • 应用程序
    +关注

    关注

    37

    文章

    3257

    浏览量

    57663
  • Cortex-M
    +关注

    关注

    2

    文章

    229

    浏览量

    29745

原文标题:如何使用Ozone分析Cortex-M异常

文章出处:【微信号:麦克泰技术,微信公众号:麦克泰技术】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    为什么说Cortex-M是低功耗应用的首选

    虽然Cortex-M处理器家族目标瞄准效能光谱较低端的区域,但是和大多数微控制器(MCU)采用的其他典型处理器相比,Cortex-M的效能依然算相当强悍。举例来说,像是许多高效能微控制器所采用的Cortex-M4与
    发表于 07-28 09:44 3478次阅读
    为什么说<b class='flag-5'>Cortex-M</b>是低功耗应用的首选

    ARM Cortex-M学习笔记:初识Systick定时器

    Cortex-M的内核中包含Systick定时器了,只要是Cortex-M系列的MCU就会有Systick,因此这是通用的,下面详细分析
    的头像 发表于 05-15 15:01 2893次阅读
    ARM <b class='flag-5'>Cortex-M</b>学习笔记:初识Systick定时器

    如何使用Ozone分析Cortex-M故障?

    源代码调试和汇编指令调试。可直接使用J-Link和J-Trace内置功能,如无限flash断点,flash下载,指令跟踪等。在Cortex-M架构上,Ozone可以帮助用户快速发现和分析导致CPU故障
    发表于 09-23 11:26

    Atmel Studio 6软件中如何调试ARM Cortex-M

    Atmel Studio 6软件中如何调试ARM Cortex-M
    的头像 发表于 07-04 10:49 4234次阅读

    关于STM32和Cortex-M内核系列介绍(1)

    Cortex-M内核系列和STM32-讲座
    的头像 发表于 07-05 01:07 8033次阅读

    关于STM32与Cortex-M内核系列的介绍(2)

    Cortex-M内核系列和STM32-讲座3
    的头像 发表于 07-05 00:45 4516次阅读

    关于Cortex-M 调试应用的介绍

    Cortex-M 调试应用
    的头像 发表于 07-10 00:56 2615次阅读

    米尔科技Cortex-M Prototyping System +介绍

    ARM® Cortex®-M原型系统 MPS2+,为Cortex-M 系列微处理器设计的原型验证评估系统,包含最新的Cortex-M7 及Corte
    的头像 发表于 11-14 10:45 1929次阅读
    米尔科技<b class='flag-5'>Cortex-M</b> Prototyping System +介绍

    Cortex-M内核的MPU内存保护单元

    讲讲Cortex-M内核的MPU内存保护单元
    的头像 发表于 03-04 11:17 3662次阅读
    <b class='flag-5'>Cortex-M</b>内核的MPU内存保护单元

    Cortex-M可以跑Linux操作系统吗?

    Cortex-M可以跑Linux操作系统吗?
    发表于 12-01 11:36 2次下载
    <b class='flag-5'>Cortex-M</b>可以跑Linux操作系统吗?

    no cortex-m sw device found 问题解决【转】

    no cortex-m sw device found 问题解决【转】
    发表于 12-02 17:36 33次下载
    no <b class='flag-5'>cortex-m</b> sw device found 问题解决【转】

    如何使用Ozone的调试功能

    源代码调试和汇编指令调试。可直接使用J-Link和J-Trace内置功能,如无限flash断点,flash下载,指令跟踪等。在Cortex-M架构上,Ozone可以帮助用户快速发现和分析导致CPU故障的软件错误。本文将介绍如何使
    的头像 发表于 09-06 11:26 5449次阅读

    分析ARM Cortex-M内核复位启动过程

    ARM Cortex-M内核的复位启动过程也被称为复位序列(Reset sequence),下面就来简要总结分析下这一过程。
    的头像 发表于 03-20 09:58 2314次阅读

    Cortex-M 内核中断/异常系统、中断优先级/嵌套 详解

    Cortex-M 内核中断/异常系统、中断优先级/嵌套 详解
    的头像 发表于 09-27 15:29 2108次阅读
    <b class='flag-5'>Cortex-M</b> 内核中断/<b class='flag-5'>异常</b>系统、中断优先级/嵌套 详解

    Cortex-M位带操作的原理

    Cortex-M位带操作的原理
    的头像 发表于 10-24 15:27 871次阅读
    <b class='flag-5'>Cortex-M</b>位带操作的原理