在用 Keil 做调试的时候,最让人头秃的是什么?
不是写代码的BUG,而是:这个条件变量是什么情况?为什么没进入这个判断?我代码跑到哪里了?
其实本质上都是通过变量判断代码的执行顺序有没有问题
还有需要观察变量的变化就像看天象,得不停地点进去、刷新,点进去、刷新......
想偷个懒用串口传到上位机画波形?可以,但要加代码啊兄弟!
用 printf
打印?你以为你在写 PC 软件呢?嵌入式的资源浪费不起啊
那有没有既不写一堆代码、又能实时观察变量并支持可视化显示的神器?
答案是:有的,兄弟
我们今天就来聊聊两种"既要又要还要"的调试法宝,它们的原理都类似:
通过调试协议直接访问 MCU 的内存,像"读心术"一样看变量的变化。
1.FreeMASTER

安装教程:https://blog.csdn.net/WL0616/article/details/129378813
额外强调:
FreeMaster 中 Plug-in Module 显示空白的问题
解决办法:打开FreeMaster的安装目录,找到register.bat文件,以管理员的身份运行一下就好了。
使用教程:https://www.bilibili.com/video/BV17D421V7LY/
安装包:\LabNas\公共资料\软件库\FMASTERSW32.exe
2.STM32CubeMonitor
st公司开发的工具,比上一个的功能更多,类似搭积木的方法,但个人感觉多出来的功能用不上。
具体观看视频有更详细的介绍
https://www.bilibili.com/video/BV1th4y1g7Mc/
3.测试
由于网上已经有比较详细的安装教程和使用说明,我就不重复写了,我们关注一下一个很重要的问题:
使用FreeMASTER监控数据的过程是否会导致单片机执行变慢?
这是一个灵魂拷问。要是你单片机跑得好好的,但加了个FreeMASTER看看变量的变化,结果如同中断一样是不是插个任务进来打断正常的任务执行,那岂不是一个乱套了?
好消息是:不会
FreeMASTER 和调试器沟通用的是调试协议(比如 SWD、JTAG),而不是走你程序里的串口、I2C 这些"正经业务通道"。
它是通过调试接口在后台"偷看"变量的,不打断你程序的执行流程,就像后排观众戴望远镜看舞台,不会跑上台抢戏。
当然,这里也不是说完全没代价------如果你监控的变量特别多、刷新频率特别快,也可能让调试器"喘不过气",刷新速度跟不上节奏,但这只是显示延迟,MCU 本体依旧在认真打工。
一句话总结:FreeMASTER更像是一个安静的观察者,不吭声、不添乱,悄悄记录你程序的点点滴滴。
实验
口说无凭,我设计了一个简单的测试demo:思路很简单,通过硬件定时器计时一段累加变量的代码执行时间,看正常不干预的运行时间和使用FreeMASTER监控变量的运行时间是否有变化。
测试单片机:STM32F103C8T6
核心测试代码:
c
uint32_t count = 0;
int main(void)
{
Serial_Init();
Timer_Init(); //1us
TIM2->CNT = 0;
TIM_Cmd(TIM2, ENABLE);
for (count = 0; count < 100 * 1000; count++) {
}
TIM_Cmd(TIM2, DISABLE);
Serial_Printf("cnt=%d\r\n", TIM2->CNT);
while (1) {
}
}
注意编译选项要选择-o0(无编译优化),防止代码中无操作的for循环被优化了
测试结果
正常运行
cnt=52778
使用FreeMASTER监控变量
cnt=52778
FreeMASTER监控变量count的波形图
两次测试后对比发现所消耗的时间完全相同,证明了使用FreeMASTER监控变量并不会占用MCU的运算资源。