单片机常用调试技巧(B站UP分享)
如何查看程序运行时间
使用Event Recorder 组件 查看运行时间
https://blog.csdn.net/twx11213030422/article/details/114013796
https://blog.csdn.net/weixin_43866583/article/details/125874888?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-125874888-blog-114013796.pc_relevant_multi_platform_whitelistv4&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-125874888-blog-114013796.pc_relevant_multi_platform_whitelistv4&utm_relevant_index=1
#include "EventRecorder.h"
添加初始化代码
/* 初始化 EventRecorder 并开启 */EventRecorderInitialize(EventRecordAll, 1U);EventRecorderStart();
时间测量起始函数
EventStartG (slot)
或者
EventStartGv (slot, val1, val2)
函数说明:
1)函数中的字母 G 是表示分组 A,B,C,D,即实际调用函数为 EventStartA,EventStartB,EventStartC 和 EventStartD。
2)函数的第一个形参 slot 的范围是 0-15,也就是最大可以测量 16 路。
3)函数后面的两个形象 val1 和 val2 是 32 Bit变量,用户可以用这两个形参来传递变量数值给 Event Statistics 调试组件里面,用于图形化展示。
时间测量结束函数
EventStopG (slot)
或者
EventStopGv (slot, val1, val2)
函数说明:
1)函数中的字母G是表示分组A,B,C,D,即实际调用函数为EventStopA,EventStopB,EventStopC 和 EventStopD。
2)函数的第一个形参 slot 的范围是 0-15,也就是最大可以测量 16 路。
3)函数后面的两个形象 val1 和 val2 是 32 位变量,用户可以用这两个形参来传递变量数值给 Event Statistics 调试组件里面,用于图形化展示。
使用示例–比如
在开始和结束添加的
EventStartA(0);//测量开始处EventStopA(0);//测量结束处
#include "EventRecorder.h"
单片机_通信协议等.assets/image-20221115133330241.png" alt="image-20221115133330241" />
如何定位程序异常位置 定位程序卡死异常位置
https://blog.csdn.net/supermuscleman/article/details/103929606
点击全速运行
通过LR的值确定当前堆栈使用的PSP或者MSP
然后在memory中定位到堆栈地址、然后就找到LR=08000F2D、PC=08000A02
Disassembly中,查找定位代码
在反汇编窗口中点击右键,选中show disassembly at address 。
输入LR地址:为发生异常后调用的下一条指令的地址,可看到发生异常的为
输入PC地址:可以定位到发生异常的调用语句
keil常用调试手段
要查看变量一定要用全局变量,效果更好
资料来源:https://www.bilibili.com/video/BV1FE411i79f/?spm_id_from=333.788.recommend_more_video.3&vd_source=16940ba3adbc66f0fb14e0c1d87db878
存储位置设置
观察硬件寄存器或者直接修改硬件寄存器
想跳过某一句,执行另一句话,或者直接执行到,直接修改PC指针
黄色箭头和绿色箭头都代表什么
不知道那个中断出现问题,或者没有写中断异常服务函数,找不到出问题中断
不知道要观察的变量在哪里被更改了,找不到–解决:给变量添加跟着断点,每个更改的操作都被捕捉
如果硬件改变了,或者DMA改变的
计算中断服务函数需要多少时间
单片机开发过程中的调试绝招–韦东山
来源:https://www.bilibili.com/video/BV1bB4y1q72a?spm_id_from=333.999.0.0&vd_source=16940ba3adbc66f0fb14e0c1d87db878
栈回溯原理及示例
函数调用关系
修改bin文件自己实现断点
使用比较偏的编译器或者芯片,或者产品没有调试接口
想查看代码任意位置的状态
这一部分适用于不满足调试条件的,,有点看不懂、可以
答疑环节(内存分配-内核了解等)
推荐的书
问:单片机使用堆、运行一段时间后,造成碎片化一般怎么处理?
少用malloc和free 或者少用free
问:内存溢出错误
使用专业工具、或者对free 或者mollc函数替代
问:要注意的函数strcopy
要注意,有些可以替换防止溢出,strcpy 替换成strncpy 还有sprintf 替换为snprintf这些会指定大小。