【KEIL软件开发:传说中的软件断点到底是什么?】
转自面向软件开发进阶读者的公众号,分享包括但不限于 C 语言、KEIL、STM32、51 等知识
不知道大家是否有过这样的经历:代码全速运行的时候,等了很久发现并没有得到想要的结果,然后暂停之后发现程序死在了循环里面,或者断言里面。
那么,我们是否有办法在程序断言失败的时候,让程序自动停下来呢?而不是苦苦等待结果呢?
如果用常规的方法,肯定是在断言里面加入断点,只要断言失败,那么程序自然就停下来了。
但是我们知道,KEIL 加入断点后有可能在再次打开工程后消失,而且STM32单片机支持的断点数量也有限,有没有好的方法?
有的,就是软件断点!
你可以在需要停止CPU运行的代码中加入这条语句:
__breakpoint(0); //后面的立即数不怎么重要
这样,当你的程序断言失败了之后,如果运行到这条语句,在线调试模式下就会自动停止单片机运行(如果不在在线调试模式,也会进入停止运行,所以需要后面的优化方案)。
比如 hardfault 错误很难查,但是你可以在进入这个中断后,立刻执行一条汇编软件断点代码:
BKPT 0
或者直接在中断处理函数中加入代码:
void HardFault_Handler(void)
{
__breakpoint(0);
}
这样一来,一旦运行到这个函数,单片机就会马上自动停止运行,而且你还可以通过 stack 窗口查看是从哪里跳进这个函数的,这样就能快速定位这种错误了!
只有在满足条件下,才会在你设置断点位置自动停止在断点处。比如一个条件下,会导致整个程序出问题,那么你可以在应用程序中添加代码,让其在满足条件时自动停止运行(前提是处于在线调试,否则没有任何打印信息的情况下,停止运行是很麻烦的事情)。
但有的时候,我只想让软件断点在进入调试模式时生效,正常运行时不产生软件断点,又该如何处理;换句话说,如何判断单片机处于调试模式还是正常模式。
C语言版:
if(*((uint32_t*)0xE000EDF0) & 0x00000001) // 判断是否工作在调试模式
{
__breakpoint(0);
}
汇编版:
DEMCR EQU 0xE000EDF0
LDR r0, =DEMCR
LDR r0,[r0,#0x00]
AND r0,r0,#0x00000001
CBZ r0,no_debug
BKPT 0
no_debug ; 地址标签
适用于 STM32f1x or Cortex-M3/M4 平台,其他平台自行研究。
注意:刚下载程序时判断也会成立,必须断开调试器后再上电才可退出调试模式(或者其他方式退出调试模式)。
https://t.cn/A6S2YGw2
namo-amitabhaya!
转自面向软件开发进阶读者的公众号,分享包括但不限于 C 语言、KEIL、STM32、51 等知识
不知道大家是否有过这样的经历:代码全速运行的时候,等了很久发现并没有得到想要的结果,然后暂停之后发现程序死在了循环里面,或者断言里面。
那么,我们是否有办法在程序断言失败的时候,让程序自动停下来呢?而不是苦苦等待结果呢?
如果用常规的方法,肯定是在断言里面加入断点,只要断言失败,那么程序自然就停下来了。
但是我们知道,KEIL 加入断点后有可能在再次打开工程后消失,而且STM32单片机支持的断点数量也有限,有没有好的方法?
有的,就是软件断点!
你可以在需要停止CPU运行的代码中加入这条语句:
__breakpoint(0); //后面的立即数不怎么重要
这样,当你的程序断言失败了之后,如果运行到这条语句,在线调试模式下就会自动停止单片机运行(如果不在在线调试模式,也会进入停止运行,所以需要后面的优化方案)。
比如 hardfault 错误很难查,但是你可以在进入这个中断后,立刻执行一条汇编软件断点代码:
BKPT 0
或者直接在中断处理函数中加入代码:
void HardFault_Handler(void)
{
__breakpoint(0);
}
这样一来,一旦运行到这个函数,单片机就会马上自动停止运行,而且你还可以通过 stack 窗口查看是从哪里跳进这个函数的,这样就能快速定位这种错误了!
只有在满足条件下,才会在你设置断点位置自动停止在断点处。比如一个条件下,会导致整个程序出问题,那么你可以在应用程序中添加代码,让其在满足条件时自动停止运行(前提是处于在线调试,否则没有任何打印信息的情况下,停止运行是很麻烦的事情)。
但有的时候,我只想让软件断点在进入调试模式时生效,正常运行时不产生软件断点,又该如何处理;换句话说,如何判断单片机处于调试模式还是正常模式。
C语言版:
if(*((uint32_t*)0xE000EDF0) & 0x00000001) // 判断是否工作在调试模式
{
__breakpoint(0);
}
汇编版:
DEMCR EQU 0xE000EDF0
LDR r0, =DEMCR
LDR r0,[r0,#0x00]
AND r0,r0,#0x00000001
CBZ r0,no_debug
BKPT 0
no_debug ; 地址标签
适用于 STM32f1x or Cortex-M3/M4 平台,其他平台自行研究。
注意:刚下载程序时判断也会成立,必须断开调试器后再上电才可退出调试模式(或者其他方式退出调试模式)。
https://t.cn/A6S2YGw2
namo-amitabhaya!
大部分时间用来看书,可是却不觉得有什么收获,更不要提快乐。不过,健身和音乐给了我一些多巴胺,让我能在人间的日子勉强保持微笑。
回想起电视剧《第八号当铺》,感谢这部剧在我小的时候,就教我分辨对于人真正重要的许多价值。
最后,俞敏洪说他大学坚持做的事情之一,就是背单词,而且是用词源词根法背单词。所以,我就在这里写下来。
enter= intestine 肠
eg. dys enter y名词:痢疾,腹泻
equ=equal 相等的
eg. equ ator 名词:赤道(将地球等分的东西)
erg,urg= work(工作;功)
eg.erg 名词:尔格(功的单位。)
metall urg y 名词:冶金术
err=wander;err(流浪;犯错)
eg. error 名词:错误
err ant 形容词:漂泊的,游侠的,偏离正途的。
erythr=red (红色)
eg. erythro cyte 名词:红血球;红细胞
ess=be(存在)
eg. ess ence 名词:本质,要素,精髓
ethn=race(种族)
eg. ethn o cide 名词:种族文化灭绝
ev=age(年龄;时代)
eg. co ev al 形容词:同时代的,同年龄的
fa,fess=speak(说)
eg. fa ble 名词:寓言;传说;虚构
in fa nt 名词:婴儿,幼儿 形容词:婴儿的,幼年的
pro fess 动词:声称;公开言明。
fac=face(脸;正面)
eg. fac ial 形容词:脸部的,容颜的,表面的。
inter fac e 名词:界面;分界面;不同学科之共有事实、问题、理论。
回想起电视剧《第八号当铺》,感谢这部剧在我小的时候,就教我分辨对于人真正重要的许多价值。
最后,俞敏洪说他大学坚持做的事情之一,就是背单词,而且是用词源词根法背单词。所以,我就在这里写下来。
enter= intestine 肠
eg. dys enter y名词:痢疾,腹泻
equ=equal 相等的
eg. equ ator 名词:赤道(将地球等分的东西)
erg,urg= work(工作;功)
eg.erg 名词:尔格(功的单位。)
metall urg y 名词:冶金术
err=wander;err(流浪;犯错)
eg. error 名词:错误
err ant 形容词:漂泊的,游侠的,偏离正途的。
erythr=red (红色)
eg. erythro cyte 名词:红血球;红细胞
ess=be(存在)
eg. ess ence 名词:本质,要素,精髓
ethn=race(种族)
eg. ethn o cide 名词:种族文化灭绝
ev=age(年龄;时代)
eg. co ev al 形容词:同时代的,同年龄的
fa,fess=speak(说)
eg. fa ble 名词:寓言;传说;虚构
in fa nt 名词:婴儿,幼儿 形容词:婴儿的,幼年的
pro fess 动词:声称;公开言明。
fac=face(脸;正面)
eg. fac ial 形容词:脸部的,容颜的,表面的。
inter fac e 名词:界面;分界面;不同学科之共有事实、问题、理论。
#考研# #考研英语#
2022考研常用词根汇总(4)
8. ambul=walk,表示“行走,走路”
ambulance 救护车,流动医院(ambul+ance;走的东西;救护车)
ambulant走动的,流动的(ambul+ant)
circumambulate环行,绕…而行(circum绕圈+ambul+ate;绕着走)
somnambulate梦游,梦行(sonm睡+ambul+ate;睡着走;梦游)
perambulate游历,巡游(per到处+ambul+ate;到处走遍;游历)
9. anim=life,spirit, 表示“生命,精神”等
aniaml动物(anim+al;有生命的东西;动物)
animate使有生气,活泼(anim+ate;使有生命)
animation生动动画(animate的名词)
inanimate无生命的(in无+anim+ate生命)
magnanimous心胸博大的(magn大+anim生命+ous;大生命;心胸博大)
unanimous意见一致的(un+anim生命+ous;[大家]同一个生命;一致的)
equanimity平静沉着(equ平等+anim生命+ity;生命平等;平静)
animosity憎恨,憎恶(anim+osity多的状态;生命太多;由爱变恨;仇恨)
2022考研常用词根汇总(4)
8. ambul=walk,表示“行走,走路”
ambulance 救护车,流动医院(ambul+ance;走的东西;救护车)
ambulant走动的,流动的(ambul+ant)
circumambulate环行,绕…而行(circum绕圈+ambul+ate;绕着走)
somnambulate梦游,梦行(sonm睡+ambul+ate;睡着走;梦游)
perambulate游历,巡游(per到处+ambul+ate;到处走遍;游历)
9. anim=life,spirit, 表示“生命,精神”等
aniaml动物(anim+al;有生命的东西;动物)
animate使有生气,活泼(anim+ate;使有生命)
animation生动动画(animate的名词)
inanimate无生命的(in无+anim+ate生命)
magnanimous心胸博大的(magn大+anim生命+ous;大生命;心胸博大)
unanimous意见一致的(un+anim生命+ous;[大家]同一个生命;一致的)
equanimity平静沉着(equ平等+anim生命+ity;生命平等;平静)
animosity憎恨,憎恶(anim+osity多的状态;生命太多;由爱变恨;仇恨)
✋热门推荐