不知道道友是否有这样的经历,代码全速运行的时候,等了很久发现并没有得到想要的结果,然后暂停之后发现程序死在了循环里面,或者断言里面。
不知道道友是否有这样的经历,代码全速运行的时候,等了很久发现并没有得到想要的结果,然后暂停之后发现程序死在了循环里面,或者断言里面。
那么我们是否有办法在程序断言失败的时候,让程序自动停下来呢?而不是苦苦等待结果呢?
如果用常规的方法,肯定是在断言里面加入断点,只要断言失败,那么程序自然就停下来了。
但是我们知道,KEIL 加入断点后有可能在再次打开工程后消失,而且STM32单片机支持的断点数量也有限,有没有好的方法?
有的,就是软件断点。
你可以在需要停止CPU运行的代码中加入这条语句:
__breakPoint(0);//后面的立即数不怎么重要
这样,当你的程序断言失败了之后,如果运行到这条语句,在线调试模式下就会自动停止单片机运行(如果不在在线调试模式,也会进入停止运行,所以需要后面的优化方案)。
比如 hardfault 错误很难查,但是你可以在进入这个中断后,立刻执行一条汇编软件断点代码:
或者直接在中断处理函数中加入代码:
voidHardFault_Handler(void){__breakpoint(0);}
这样一来,一旦运行到这个函数,单片机就会马上自动停止运行,而且你还可以通过 stack 窗口查看是从哪里跳进这个函数的,这样就能快速定位这种错误了!
只有在满足条件下,才会在你设置断点位置自动停止在断点处。比如一个条件下,会导致整个程序出问题,那么你可以在应用程序中添加代码,让其在满足条件时自动停止运行(前提是处于在线调试,否则没有任何打印信息的情况下停止运行是很麻烦的事情)。
但有的时候,我只想让软件断点在进入调试模式时生效,正常运行时不产生软件断点,又该如何处理;换句话说,如何判断单片机处于调试模式还是正常模式。
C 语言版
(*((uint32_t*)0xE000EDF0)&0x00000001)//判断是否工作在调试模式{__breakpoint(0);}汇编版DEMCREQU0xE000EDF0LDRr0,=DEMCRLDRr0,[r0,ANDr0,r0,CBZr0,no_debugBKPT0no_debug;地址标签
适用于 STM32f1x or Cortex-M3/M4 平台,其他平台自行研究
注意,刚下载程序时判断也会成立,必须断开调试器后再上电才可退出调试模式(或者其他方式退出调试模式)
Java工具 MyEclipse 怎样进行调试
JAVA程序写好之后,在需要调试的语句前面双击,会出现一个蓝色的圆点,也就是断点。
然后点debug,不要点run,程序运行到你所设置断点处会暂停,然后你可以查看当前一些变量的值,单步的快捷键有F5和F6两个,具体有什么区别,我也说不清楚,一个会走得很详细,每条语句都会看到(包括JAVA底层封装好的类),另一个就没这么详细,你自己试一下就知道了,光说也说不清楚。呵呵,希望对你有所帮助

断点续传下载软件的特点
断点续传的理解可以分为两部分:一部分是断点,一部分是续传。 断点的由来是在下载过程中,将一个下载文件分成了多个部分,同时进行多个部分一起的下载,当某个时间点,任务被暂停了,此时下载暂停的位置就是断点了。 续传就更好理解些了,就是当一个未完成的下载任务再次开始时,会从上次的断点继续传送。 这样的功能如果碰到网络故障,可以从已经上传或下载的部分开始继续上传下载以后未上传下载的部分,而没有必要重头开始上传下载。 可以节省时间,提高速度。
vc中所说的断点是什么?有什么作用?该怎么用啊?
断点最大的作用就是调试的时候用的, 比如说你觉得自己的程序某处有问题, 就在那一行(或前后不远处)加上断点,程序运行到这里自动会停,然后你看看各项的值(什么表达式啊,函数返回值啊)有没有异常,这样更利于查错 还有就是如果你插了断点但程序调试的时候始终没停,说明程序根本没运行到你插断点的地方 断点是调试时很重要的工具
发表评论