单片机如何快速实现查看实时数据

news2025/5/28 12:44:11

在用 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

核心测试代码:

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的运算资源。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2386742.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

go实现钉钉三方登录

钉钉的的官方开发文档中只给出了java实现三方登录的&#xff0c;我们准备用go语言来实现 实现网页方式登录应用&#xff08;登录第三方网站&#xff09; - 钉钉开放平台 首先就是按照文档进行操作&#xff0c;备注好网站的信息 获得应用凭证&#xff0c;我们后面会用到 之后…

物流配送优化实战:用遗传算法破解选址难题

在电商与供应链高速发展的今天&#xff0c;物流配送成本优化始终是企业竞争力的核心议题之一。想象一下&#xff0c;当你面对 20 个分布在不同坐标的客户点、7 个可选配送中心和 1 个发件网点时&#xff0c;如何用最省钱的方式完成配送&#xff1f;今天我们就来拆解一个真实的物…

Linux 个人用户设置账号密码环境变量,四种方式

一、需要明白以下2点&#xff1a; 1、Linux 的环境变量是保存在变量 PATH 中&#xff0c;可通过 Linux shell 命令 echo $PATH 查看输出内容&#xff0c;或者直接输入 export 查看&#xff0c;或者输入 env 查看 2、Linux环境变量值之间是通过冒号进行隔开的( : ) 格式为&am…

Three.js搭建小米SU7三维汽车实战(5)su7登场

汽车模型加载 我们在sktechfab上下载的汽车是glb的文件格式&#xff0c;所以使用gltfLoader进行加载。这里将小车直接加载进来看看效果&#xff1b; import { GLTFLoader } from "three/addons/loaders/GLTFLoader.js"; ....其余代码省略 const gltfLoader new GLT…

格恩朗管段超声波流量计:流量测量先锋

在流量测量技术不断迭代的浪潮中&#xff0c;格恩朗自 2019 年创立起&#xff0c;便以开拓者的姿态投身其中&#xff0c;致力于为全球用户提供先进、精准的流量测量解决方案。其旗下的管段超声波流量计&#xff0c;一经推出&#xff0c;便迅速吸引了行业的目光&#xff0c;成为…

图论 判断是否有环

前言&#xff1a;有点忘记是怎么判断一个图中是否是有环 如果是一个无向图&#xff0c;其实可以直接dfs&#xff0c;加上一个vis数组来一起判断 如果是有向图呢&#xff0c; class Solution:def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool…

EasyDarwin的配置与使用

一.语言配置 准备go语言 All releases - The Go Programming Language 增加系统环境变量 让其生效 二.项目配置 Clone项目并解压 git clone https://github.com/EasyDarwin/EasyDarwin.git cd EasyDarwin go mod tidy 紧接着 make build/linux cd build cd EasyDarwin-lin-&qu…

【Android】基于SurfaceControlViewHost实现跨进程渲染

1 前言 本文将介绍基于 SurfaceControlViewHost 实现跨进程渲染普通 View 和 GlSurfaceView&#xff0c;力求用最简单的 Demo&#xff0c;介绍 SurfaceControlViewHost 的应用&#xff0c;方便读者轻松扣出核心代码应用到自己的业务中。 核心代码片段如下。 1&#xff09;服务端…

vue+ThreeJs 创造自动选择的甜甜圈(圆环)

嗨&#xff0c;我是小路。今天主要和大家分享的主题是“vueThreeJs 创造自动选择的甜甜圈”。 一个漂浮在页面中央的 3D 圆环&#xff0c;多个图标/文本/图片均匀分布在圆周上。它会自动缓慢旋转&#xff0c;形成动态视觉焦点。这就是今天要搭建的项目&#xff0c;并对…

能说一下JVM的内存区域吗

根据Java虚拟机的规范&#xff0c;JVM的内存区域可以细分为程序计数器、虚拟机栈、本地方法栈、堆和方法区。 其中方法区和线程是共享的&#xff0c;虚拟机栈、本地方法区和程序计数器是线程私有的。 介绍一下程序计数器&#xff1f; 程序计数器也被称为PC寄存器。是一块较小…

东方仙盟_灵颜妙手——表单样式——仙盟创梦IDE

代码 .东方仙盟_灵颜妙手 {background-color: #f0f8ff;padding: 10px;display: block;width:100%;height: 100%;}.东方仙盟_灵颜妙手 .表单 {max-width: 800px;margin: 0 auto;background-color: white;border-radius: 8px;box-shadow: 0 0 10px rgba(0, 123, 255, 0.1);paddin…

输入一串字符,统计其中字母的个数

#include <stdio.h> int main() { char ch; int count 0; printf("请输入一串字符&#xff1a;\n"); while ((ch getchar())! \n) { if ((ch > a && ch < z) || (ch > A && ch < Z)) { count; } } printf("字母的个数为&a…

进程IO之 进程

一、进程相关概念 1.什么是进程 程序&#xff1a;静态的&#xff0c;编译好的可执行文件&#xff0c;存放在磁盘中的指令和数据的集合 进程&#xff1a;动态的&#xff0c;是程序的一次执行过程&#xff0c;是独立的可调度的任务 2.进程的特点 &#xff08;1&#xff09;对…

OpenGL Chan视频学习-5 Vertex Attributes and Layouts in OpenGL

bilibili视频链接&#xff1a; 【最好的OpenGL教程之一】https://www.bilibili.com/video/BV1MJ411u7Bc?p5&vd_source44b77bde056381262ee55e448b9b1973 一、知识点整理 1.1.OpenGL管线工作流程 为显卡提供绘制的所有数据&#xff0c;并将数据存储在GPU内存使用着色器&…

ESP32学习笔记_Peripherals(3)——ADC

摘要 本博客介绍了ESP32-S3芯片内置SAR ADC的原理、参考电压、分辨率、信号衰减等基础知识&#xff0c;并讲解了如何使用ESP-IDF驱动库实现ADC的连续采样&#xff08;DMA&#xff09;功能&#xff0c;演示了多通道模拟信号&#xff08;如摇杆模块&#xff09;的采集与处理流程…

QT学习一

对于选择qmake还是cmake&#xff0c;现在写的暂时先用qmake 1.命名规范和快捷键 2.按钮控件常用API //创建第一个按钮QPushButton * btn new QPushButton;//让btn对象 依赖在mywidget窗口中btn->setParent(this);//显示文本btn->setText("第一个按钮");//创建…

黑马点评Reids重点详解(Reids使用重点)

目录 一、短信登录&#xff08;redisseesion&#xff09; 基于Session实现登录流程 &#x1f504; 图中关键模块解释&#xff1a; 利用seesion登录的问题 设计key的具体细节 整体访问流程 二、商户查询缓存 reids与数据库主动更新的三种方案 缓存穿透 缓存雪崩问题及…

小米2025年校招笔试真题手撕(一)

一、题目 小A每天都要吃a,b两种面包各一个。而他有n个不同的面包机&#xff0c;不同面包机制作面包的时间各不相同。第i台面包机制作a面包 需要花费ai的时间&#xff0c;制作b面包则需要花费bi的时间。 为能尽快吃到这两种面包&#xff0c;小A可以选择两个不同的面包机x&…

《软件工程》第 11 章 - 结构化软件开发

结构化软件开发是一种传统且经典的软件开发方法&#xff0c;它强调将软件系统分解为多个独立的模块&#xff0c;通过数据流和控制流来描述系统的行为。本章将结合 Java 代码示例、可视化图表&#xff0c;深入讲解面向数据流的分析与设计方法以及实时系统设计的相关内容。 11.1 …

Neo4j(三) - 使用Java操作Neo4j详解

文章目录 前言一、创建项目二、导入依赖三、节点和关系数据打印四、创建节点与关系五、查询数据方法六、更新数据方法七、删除节点与关系方法八、合并数据方法九、完整代码1. 完整代码2. 项目下载 前言 本文介绍通过 Java 操作 Neo4j 图数据库的完整流程。主要涵盖开发环境搭建…