31#

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

[复制链接]
管理员RoboMaster赛务
 楼主| 2020-4-10 20:07:34 只看该作者
好的,那么第一个问题来了。@Elecheart 大家在调试MCU时一般是否会遇到各种各样的问题,比如单片机运行着死机了,一般是什么原因呢?
32#

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

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

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

[复制链接]
管理员RoboMaster赛务
 楼主| 2020-4-10 20:09:04 只看该作者
(大家注意嘉宾的ID是Elecheart哦~)
34#

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

[复制链接]
正式队员W4LKURE
2020-4-10 20:09:19 只看该作者
前排吃瓜
回复

使用道具 举报

35#

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

[复制链接]
正式队员黄瓜皇
2020-4-10 20:09:35 只看该作者
请问该怎么排查死机的具体问题呢?
36#

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

[复制链接]
管理员RoboMaster赛务
 楼主| 2020-4-10 20:09:46 只看该作者
@Elecheart 那遇到这些问题要怎么解决呢?可以跟大家说一说吗
37#

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

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

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

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

[官方动态] 【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,就可以跳转到异常发生时的代码处。
40#

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

[复制链接]
管理员RoboMaster赛务
 楼主| 2020-4-10 20:12:53 只看该作者
刚刚问怎么排查死机的@黄瓜皇同学,get了吗~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

触屏版 | 电脑版

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

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