蓝盟IT小贴士,来喽!
我不知道道友有没有那样的经历,在软线满转速的时候,等了很久也没有得到预想的结果。 然后暂停后,我意识到程序死在循环里。 或者断言死在里面。
那么,有什么方法可以在断言程序失败时自动停止程序吗? 不是等待结果吗?
按照常规方法,肯定会在断言中插入断点。 如果断言失败,程序自然会停止。
但是,我们知道,KEIL加入断点后,可能会在再次打开项目后消失,而且STM32单片机支持的断点数量也有限。 有好的方法吗?
是的,软件断点。
此语句可以包含在需要停止CPU执行的代码中:
__breakpoint(0; //后的即时数不太重要
这样,在断言您的程序失败后,执行到此语句后,将在在线调试模式下自动停止单片机的执行(即使不是在线调试模式也将停止,因此需要后面的优化方案)。
例如,hardfault错误很难检查,但在进入此中断后,可以立即执行汇编软件断点代码:
BKPT 0
或者直接向中断处理函数添加代码。
声音硬件故障处理程序(声音)
{
__breakpoint(0;
}
这样,一旦运行到这个函数,单片机就会立即自动停止。 另外,还可以从堆栈窗口看到它是从哪里跳到这个函数的。 这样可以快速确定这种错误。
只有在满足条件的情况下,才会在设定断点的位置自动停止在断点处。 例如,在某些情况下,如果整个程序出现问题,可以向APP中添加代码,以便在满足条件时自动停止运行(前提是正在进行在线调试)。 否则,在没有打印信息的情况下停止操作将非常困难)。
但是,有一次,我只是在进入调试模式时启用了软件断点,在正常运行时不发生软件断点,该怎么处理呢? 换言之,单片机如何判断是调试模式还是正常模式?
c语言版
判断是否在if(* ) (uint32_t* )0xE000EDF0)0x00000001 )//调试模式下动作
{
__breakpoint(0;
}
汇编版
DEMCR EQU0xE000EDF0
LDR r0,=德米克尔LDR r0,[r0,#0x00]
AND r0,r0,#0x00000001
CBZ r0,否_调试
BKPT 0
o _调试; 地址标签
适用于STM32f1x or Cortex-M3/M4平台,其他平台将自行考虑
文/上海蓝盟 IT外包专家