软件断点的介绍

代码全速运行的时候,等了很久发现并没有得到想要的结果,然后暂停之后发现程序死在了循环里面,或者断言里面。那么,我们是否有办法在程序断言失败的时候,让程序自动停下来呢?而不是苦苦等待结果呢?如果用常规的方法,肯定是在断言里面加入断点,只要断言失败,那么程序自然就停下来了。但是我们知道,keil 加入断点后有可能在再次打开工程后消失,而且stm32单片机支持的断点数量也有限,有没有好的方法?有的,就是软件断点!你可以在需要停止cpu运行的代码中加入这条语句:
__breakpoint(0); //后面的立即数不怎么重要 这样,当你的程序断言失败了之后,如果运行到这条语句,在线调试模式下就会自动停止单片机运行(如果不在
在线调试
模式,也会进入停止运行,所以需要后面的优化方案)。比如 hardfault 错误很难查,但是你可以在进入这个中断后,立刻执行一条汇编软件断点代码:
bkpt 0 或者直接在中断处理函数中加入代码:
void hardfault_handler(void) 这样一来,一旦运行到这个函数,单片机就会马上自动停止运行,而且你还可以通过 stack 窗口查看是从哪里跳进这个函数的,这样就能快速定位这种错误了!只有在满足条件下,才会在你设置断点位置自动停止在断点处。比如一个条件下,会导致整个程序出问题,那么你可以在应用程序中添加代码,让其在满足条件时自动停止运行(前提是处于在线调试,否则没有任何打印信息的情况下停止运行是很麻烦的事情)。但有的时候,我只想让软件断点在进入调试模式时生效,正常运行时不产生软件断点,又该如何处理;换句话说,如何判断单片机处于
调试模式
还是正常模式。
c语言版:
if(*((uint32_t*)0xe000edf0) & 0x00000001) // 判断是否工作在调试模式 汇编版:
demcr          equ     0xe000edf0 适用于 stm32f1x  or  cortex-m3/m4 平台,其他平台自行研究。
注意:刚下载程序时判断也会成立,必须断开调试器后再上电才可退出调试模式(或者其他方式退出调试模式)。


如何破解近几年LED终端市场持续下跌的低迷态势?
新物种:科大讯飞AI学习机LUMIE 10系列闪耀上市
五防联锁在开关柜遥控中的应用
虚拟币梦碎,AMD和英伟达显卡库存清不完!
绝缘电压和绝缘电阻
软件断点的介绍
iPhone8什么时候上市?iPhone8最新消息汇总:iPhone8、iPhone7外形大对比,iPhone8的四大猜想值得期待
双核安卓4.0 索尼MT27i再曝光
2020中国(深圳)新能源汽车核心技术发展论坛成功举办
国产芯片最新进展,14nm将于明年底实现量产
用于流媒体的内容交付网络
满足探地雷达主机应用需求的高速板对板连接器
三星位于苏州的面板工厂很快会转让给TCL
视频图像处理技术应用探析_图像处理技术在视频监视中的应用
中国电子检测类型大汇总 | 汇总1
什么是模拟看门狗?模拟看门狗有什么用处?
PCIe-3504PoE图像采集卡功能特点
【玩转多核异构】M核程序的启动、编写和仿真——飞凌嵌入式
浅谈传感器误差和ADC误差及校正此类误差的优势
无人直升机在农业上的应用优势