楼主

[官方动态] 【RM2020 圆桌】第七期 嵌入式调试技巧分享

[复制链接]
梯队队员Elecheart
2020-4-10 20:04:13 显示全部楼层
Hi~ 大家好
回复

使用道具 举报

沙发

[官方动态] 【RM2020 圆桌】第七期 嵌入式调试技巧分享

[复制链接]
梯队队员Elecheart
2020-4-10 20:07:02 显示全部楼层
大家使用的MCU基本是基于Cortex-M3和M4的内核,本期主要给大家分享Cortex-M3和M4内核MCU的调试技巧。
板凳

[官方动态] 【RM2020 圆桌】第七期 嵌入式调试技巧分享

[复制链接]
梯队队员Elecheart
2020-4-10 20:08:14 显示全部楼层
MCU死机基本上都是程序运行中触发了异常中断导致的,比如使用了空指针、野指针、访问越界之类的内存访问错误,或者是使用了未初始化的外设,再或者是非对齐访问等等。具体大家可以参阅《CM3与CM4权威指南》中的12.2 错误的原因 章节。
地板

[官方动态] 【RM2020 圆桌】第七期 嵌入式调试技巧分享

[复制链接]
梯队队员Elecheart
2020-4-10 20:10:29 显示全部楼层
这个可以从定位问题发生的位置来入手,当异常发生时,MCU内核会将R0~R3、R12、LR、PC、XPRS寄存器按顺序压入栈,其中LR寄存器为异常发生时将要执行的下一条地址。在Keil的调试界面中,我们可以通过以下两个方法找到它。
5#

[官方动态] 【RM2020 圆桌】第七期 嵌入式调试技巧分享

[复制链接]
梯队队员Elecheart
2020-4-10 20:11:06 显示全部楼层
方法一:
打开 Call Stack Window,选中最顶上的异常处理函数,右键Show Caller Code跳转到异常发生时的代码处。有的时候这种方法可能无法使用,大家可以使用另外一个方法。
6#

[官方动态] 【RM2020 圆桌】第七期 嵌入式调试技巧分享

[复制链接]
梯队队员Elecheart
2020-4-10 20:11:37 显示全部楼层
方法二:
1.打开View -> Registers Window,找到SP,它的值为当前的栈顶地址。
2.打开Memory Window,在Address中输入栈顶地址显示栈的内容,按照压栈顺序其中21~24字节即为压入的LR,记下对应的值(注意大小端 “E1 E2 00 08” 在小端机器上表示为0x0800E2E1)。
3.在Dissassembly汇编窗口中单击右键,在弹出的菜单中选择Show Dissassembly at Address,将压入LR的值输入并点击Go To,就可以跳转到异常发生时的代码处。
7#

[官方动态] 【RM2020 圆桌】第七期 嵌入式调试技巧分享

[复制链接]
梯队队员Elecheart
2020-4-10 20:14:17 显示全部楼层
我们可以通过查看系统控制块SCB中相关错误寄存器来判断,在Keil的调试模式中打开View -> System Viewer -> Core Peripherals -> Fault Reports查看。比如对指向超出RAM区域的指针进行操作,发现进入HardFault_Handler,这时发现总线错误状态寄存器BRSR中的BFARVALID位被置位,表示访问了一个无效的总线地址。在CM4的SCB中还有像CFSR、HFSR、BFAR、MMFAR这样的错误寄存器。作为扩展,大家可以阅读内核用户手册《Cortex-M4 Devices Generic User Guide》或《Cortex-M3 Devices Generic User Guide》中4.3 System control block章节。
8#

[官方动态] 【RM2020 圆桌】第七期 嵌入式调试技巧分享

[复制链接]
梯队队员Elecheart
2020-4-10 20:17:02 显示全部楼层
这种情况时很常见的,在实际测试时出现了问题,这时候却往往不在调试模式下,而接入调试器进行调试会进行复位,原来的问题现场就被破坏了。这时我们就需要使用Attch的调试方法进行调试,这种方法不会对MCU进行复位。在Keil中的操作方法给大家推荐一篇Keil的官方文档进行阅读:http://www.keil.com/support/docs/3697.htm
9#

[官方动态] 【RM2020 圆桌】第七期 嵌入式调试技巧分享

[复制链接]
梯队队员Elecheart
2020-4-10 20:19:28 显示全部楼层
这种情况一般是访问越界导致的,我们可以用访问断点来定位是在哪里被修改的。在变量的内存地址处定义访问写断点,这样在程序写入这个变量时就会停下程序供我们分析。
10#

[官方动态] 【RM2020 圆桌】第七期 嵌入式调试技巧分享

[复制链接]
梯队队员Elecheart
2020-4-10 20:22:13 显示全部楼层
除了Keil以外也可以使用其他调试工具,比如OpenOCD+GDB,但是这个配置比较复杂,对新手可能并不友好。我在这里给使用J-Link调试器的同学推荐一款调试软件Ozone,这款软件是J-Link出品公司的官方免费软件。可以调试gcc和armcc编译出来的固件。armcc和gcc分别编译出axf和elf文件,包含了调试信息。在Ozone中载入这些文件就可以进行源码级调试,而且功能不弱于Keil。其中图标数据的显示比J-Scope更易于操作和直观,更适合于调试和整定参数。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

触屏版 | 电脑版

Copyright © 2024 RoboMasters 版权所有 备案号 粤ICP备2022092332号

快速回复 返回顶部 返回列表