在嵌入式C语言开发中,MCU程序常常需要集成看门狗定时器。但使用KEIL MDK断点调试时,只要程序在断点处停留稍久,“喂狗”时机就会被错过,导致看门狗强制复位,调试过程十分烦人。关闭看门狗代码再编译当然能解决,可一旦不方便或不允许改动源码,就需要另寻他法。下面这个方法,不改变一行代码就能让你避开看门狗的干扰。
第一步:在MDK调试模式下,找到初始化看门狗的函数调用位置(例如 iwdg_init()),在这里打一个断点,并让程序运行到此处暂停。

第二步:在代码编辑窗口中,把光标放到 iwdg_init() 调用之后的下一行语句上,然后右键选择 “Set Program Counter”(设置程序计数器)。

做完这一步,程序计数器(PC)就会直接跳过 iwdg_init() 的执行,指向其后续指令。此时再继续运行,看门狗的初始化压根不会被触发。

这个技巧的本质,是借助调试器强行改变了CPU即将执行的指令地址。由于我们绕过了 iwdg_init(),看门狗定时器始终处于未使能的默认状态,自然就不会在调试期间产生复位信号。这纯粹是调试环境下的“欺骗”手段,对源代码没有半点影响。要想验证效果,可以打开IWDG相关寄存器窗口——配置、使能、窗口值、计数器全都为零,说明看门狗确实没有被初始化。

从那之后,无论你在程序中加多少个断点、停留多久,都不用再担心看门狗复位来捣乱了。
总结:这个方法特别适合在必须保留看门狗代码的前提下进行调试的场景,省去了反复修改代码、重新编译下载的麻烦,显著提升调试效率。当然,这只是调试期间的临时手段,最终发布的固件中仍要确保看门狗逻辑正确运行,以保障系统在异常情况下的自恢复能力。如果你也有更多调试妙招,不妨到云栈社区与众多嵌入式开发者交流分享。
|