当前位置: 首页 > news >正文

STM32-- 调试 -日志输出

在调试嵌入式程序时,输出日志是非常重要的环节,可以帮助开发者定位问题、监控程序状态和性能。以下是几种常见的日志输出方式及其适用场景:


1. 使用串口(UART)输出日志

实现方式

通过串口将日志输出到主机的串口工具(如 PuTTYTera Termminicom)中。

优点
  • 简单易用,几乎所有嵌入式设备都支持。
  • 实时性强,适合调试运行时的动态信息。
  • 与 printf 结合使用方便。
示例代码
#include <stdio.h>// 配置 fputc 实现 printf 重定向到 UART
int fputc(int ch, FILE *f) {UART_SendByte((uint8_t)ch);  // 自定义的 UART 发送函数while (!UART_IsTxEmpty());  // 等待发送完成return ch;
}void debug_log(const char *format, ...) {va_list args;va_start(args, format);vprintf(format, args);  // 使用重定向后的 printfva_end(args);
}int main(void) {UART_Init();  // 初始化 UARTdebug_log("System initialized.\n");while (1) {debug_log("Looping...\n");HAL_Delay(1000);}return 0;
}

2. 使用 SWO 或 ITM 输出日志

实现方式
  • STM32 和一些 Cortex-M 系列 MCU 提供 SWO(Single Wire Output)ITM(Instrumentation Trace Macrocell) 输出,支持通过 ST-Link 等调试器采集日志。
优点
  • 非阻塞,性能开销小。
  • 无需占用 UART,引脚利用率高。
  • 支持与调试器同步显示日志。
使用工具
  • Keil MDK 自带 SWO Viewer。
  • STM32CubeMonitor。
  • Segger RTT Viewer。
示例代码
#include "stm32f1xx.h"void ITM_SendChar(uint8_t ch) {while (ITM->PORT[0].u32 == 0); // 等待 ITM 可用ITM->PORT[0].u8 = ch;
}void debug_log(const char *format, ...) {char buffer[128];va_list args;va_start(args, format);vsnprintf(buffer, sizeof(buffer), format, args);va_end(args);for (char *p = buffer; *p; ++p) {ITM_SendChar(*p);}
}int main(void) {debug_log("Hello SWO logging!\n");while (1);
}

3. 使用 LED 或 GPIO 信号

实现方式

通过控制 LED 闪烁频率或 GPIO 电平变化,输出简单的调试信息。

优点
  • 无需额外工具,适合硬件最小系统。
  • 简单可靠,特别是在串口不可用或程序无法正常运行时。
示例代码
void debug_signal(uint8_t code) {for (uint8_t i = 0; i < code; i++) {HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); // 假设 LED 在 PC13HAL_Delay(200);}HAL_Delay(1000); // 间隔一段时间
}int main(void) {debug_signal(3);  // 表示某种错误代码while (1);
}

4. 使用 SD 卡或文件系统存储日志

实现方式

将日志存储到 SD 卡或闪存,供后续分析。

优点
  • 可记录大批量日志,便于回溯问题。
  • 不会干扰实时运行的功能。
  • 适合脱机运行的系统。
示例代码
#include "fatfs.h"void debug_log(const char *format, ...) {char buffer[128];va_list args;va_start(args, format);vsnprintf(buffer, sizeof(buffer), format, args);va_end(args);FIL file;if (f_open(&file, "log.txt", FA_WRITE | FA_OPEN_APPEND) == FR_OK) {f_write(&file, buffer, strlen(buffer), NULL);f_close(&file);}
}

5. 使用网络(如 Ethernet、Wi-Fi)输出日志

实现方式

通过 TCP/UDP 协议将日志输出到远程服务器或 PC 工具。

优点
  • 支持远程监控。
  • 可集成到已有的网络通信架构中。
示例代码
void debug_log(const char *format, ...) {char buffer[256];va_list args;va_start(args, format);vsnprintf(buffer, sizeof(buffer), format, args);va_end(args);// 假设使用 lwIP 的 UDP 发送udp_send_to(buffer, strlen(buffer), "192.168.1.100", 5000);
}

6. 使用实时操作系统(RTOS)日志管理

实现方式

借助 RTOS 的任务与队列,集中管理日志的输出。

优点
  • 避免在高优先级任务中直接阻塞。
  • 提高系统的实时性和可靠性。
示例代码
QueueHandle_t logQueue;void logger_task(void *param) {char buffer[128];while (1) {if (xQueueReceive(logQueue, buffer, portMAX_DELAY)) {printf("%s", buffer); // 可根据需求输出到 UART 或文件}}
}void debug_log(const char *format, ...) {char buffer[128];va_list args;va_start(args, format);vsnprintf(buffer, sizeof(buffer), format, args);va_end(args);xQueueSend(logQueue, buffer, 0);
}int main(void) {logQueue = xQueueCreate(10, 128);xTaskCreate(logger_task, "Logger", 512, NULL, 1, NULL);debug_log("RTOS logging started.\n");vTaskStartScheduler();return 0;
}

总结

  • 实时调试:优先使用串口(UART)、SWO 或网络。
  • 脱机调试:使用 SD 卡或闪存存储日志。
  • 简单场景:用 LED 或 GPIO。
  • 复杂系统:结合 RTOS 提供的队列和任务管理日志输出。

根据项目实际需求选择合适的方法,同时要注意优化性能,避免日志输出对系统实时性造成干扰。

相关文章:

STM32-- 调试 -日志输出

在调试嵌入式程序时&#xff0c;输出日志是非常重要的环节&#xff0c;可以帮助开发者定位问题、监控程序状态和性能。以下是几种常见的日志输出方式及其适用场景&#xff1a; 1. 使用串口&#xff08;UART&#xff09;输出日志 实现方式&#xff1a; 通过串口将日志输出到主…...

Python爬虫案例八:抓取597招聘网信息并用xlutils进行excel数据的保存

excel保存数据的三种方式&#xff1a; 1、pandas保存excel数据&#xff0c;后缀名为xlsx; 举例&#xff1a; import pandas as pddic {姓名: [张三, 李四, 王五, 赵六],年龄: [18, 19, 20, 21],住址: [广州, 青岛, 南京, 重庆] } dic_file pd.DataFrame(dic) dic_file…...

小试牛刀-Anchor安装和基础测试

目录 一、编写目的 二、安装步骤 2.1 安装Rust 设置rustup镜像 安装Rust 2.2 安装node.js 2.3 安装Solana-CLI 2.4 安装Anchor CLI 三、Program测试 四、可能出现的问题 Welcome to Code Blocks blog 本篇文章主要介绍了 [Anchor安装和基础测试] 博主广交技术好友&…...

51单片机基础01 单片机最小系统

目录 一、什么是51单片机 二、51单片机的引脚介绍 1、VCC GND 2、XTAL1 2 3、RST 4、EA 5、PSEN 6、ALE 7、RXD、TXD 8、INT0、INT1 9、T0、T1 10、MOSI、MISO、SCK 11、WR、RD 12、通用IO P0 13、通用IO P1 14、通用IO P2 三、51单片机的最小系统 1、供电与…...

RocketMQ文件刷盘机制深度解析与Java模拟实现

引言 在现代分布式系统中&#xff0c;消息队列&#xff08;Message Queue, MQ&#xff09;作为一种重要的中间件&#xff0c;扮演着连接不同服务、实现异步通信和消息解耦的关键角色。Apache RocketMQ作为一款高性能的分布式消息中间件&#xff0c;广泛应用于实时数据流处理、…...

python语言基础-5 进阶语法-5.3 流式编程

声明&#xff1a;本内容非盈利性质&#xff0c;也不支持任何组织或个人将其用作盈利用途。本内容来源于参考书或网站&#xff0c;会尽量附上原文链接&#xff0c;并鼓励大家看原文。侵删。 5.3 流式编程&#xff08;参考链接&#xff1a;https://www.zhihu.com/question/59062…...

JVM性能分析工具JProfiler的使用

一、基本概念 JProfiler&#xff1a;即“Java Profiler”&#xff0c;即“Java分析器”或“Java性能分析工具”。它是一款用于Java应用程序的性能分析和调试工具&#xff0c;主要帮助开发人员识别和解决性能瓶颈问题。 JVM&#xff1a;即“Java Virtual Machine”&#xff0c…...

面试题: Spring中的事务是如何实现的?

Spring中的事务是如何实现的? 背景个人原因的背景正规一点的背景 答案一些思绪和灵感个人理解程度拓展知识Spring的事务管理主要涉及哪几个类?在Spring中&#xff0c;事务管理的流程是怎样的? 背景 个人原因的背景 想换工作, 刷面试题看到的问题, 简单记录一下, 算是个人…...

vue2-代理服务器插槽

解决跨域问题 配置代理服务器 代理服务器位于前端应用(客户端)和真实的后端服务器之间。当配置了代理服务器后&#xff0c;前端应用的请求不再直接发送到后端服务器&#xff0c;而是发送到代理服务器。代理服务器在接收到请求后&#xff0c;会根据预先配置的规则将请求转发到真…...

(python)unittest框架

unittest unnitest介绍 TestCase测试用例 书写真正的用例脚本...

网安基础知识|IDS入侵检测系统|IPS入侵防御系统|堡垒机|VPN|EDR|CC防御|云安全-VDC/VPC|安全服务

网安基础知识|IDS入侵检测系统|IPS入侵防御系统|堡垒机|VPN|EDR|CC防御|云安全-VDC/VPC|安全服务 IDS入侵检测系统 Intrusion Detection System 安全检测系统&#xff0c;通过监控网络流量、系统日志等信息&#xff0c;来检测系统中的安全漏洞、异常行为和入侵行为。 分为&am…...

面试小结(一)

1、hashmap的底层设计原理以及扩容规则&#xff0c;是否线程安全&#xff0c;如何线程安全。 底层原理&#xff1a;数组 链表 红黑树。HashMap 的底层实现是一个数组&#xff0c;数组中的每个元素是一个链表或红黑树&#xff08;JDK 1.8 以后&#xff0c;当链表长度超过一定…...

笔试-笔记2

1.设存在函数int max(int,int)返回两参数中较大值&#xff0c;若求22&#xff0c;59&#xff0c;70三者中最大值&#xff0c;下列表达式不正确的是() A.int mmax(22,59,70); B.int mmax(22,max(59,70)); C.int mmax(max(22,59),70); D.int mmax(59,max(22,70)); 解析&#xf…...

html5复习二

知识点&#xff1a; 1、音频标签 <audio controls"controls" loop"loop" preload"auto" src"张恒远 - 追梦赤子心.mp3" muted"muted" > </audio> controls:显示控件 必须写 loop&#xff1a;循环播放&#x…...

大模型呼入机器人系统如何建设?

大模型呼入机器人系统如何建设&#xff1f; 作者&#xff1a;开源呼叫中心系统 FreeIPCC, Github地址&#xff1a;https://github.com/lihaiya/freeipcc 大模型呼叫中心呼入机器人系统的建设是一个涉及多个环节和领域的综合性工程。以下是一个详细的步骤指南&#xff0c;涵盖了…...

docker 部署 kvm 图形化管理工具 WebVirtMgr

镜像构建 官方最后一次更新已经是 2015年6月22日 了&#xff0c;官方也没有 docker 镜像&#xff0c;这边选择咱们自己构建如果你的服务器有魔法&#xff0c;可以直接 git clone 一下 webvirtmgr 的包&#xff0c;没有的话&#xff0c;可以和我一样&#xff0c;提前从 github 上…...

【Unity How】Unity中如何实现物体的匀速往返移动

直接上代码 using UnityEngine;public class CubeBouncePingPong : MonoBehaviour {[Header("移动参数")][Tooltip("移动速度")]public float moveSpeed 2f; // 控制移动的速度[Tooltip("最大移动距离")]public float maxDistance 5f; // 最大…...

Block Successive Upper Bound Minimization Method(BSUM)算法

BSUM优化方法学习 先验知识参考资料1 A Unified Convergence Analysis of Block Successive Minimization Methods for Nonsmooth OptimizationSUCCESSIVE UPPER-BOUND MINIMIZATION (SUM) 连续上限最小化算法THE BLOCK SUCCESSIVE UPPER-BOUND MINIMIZATION ALGORITHM 块连续上…...

力扣2388. 将表中的空值更改为前一个值

一、数据 2388. 将表中的空值更改为前一个值 表: CoffeeShop ---------------------- | Column Name | Type | ---------------------- | id | int | | drink | varchar | ---------------------- id 是该表的主键&#xff08;具有唯一值的列&#xf…...

【从零开始的LeetCode-算法】3233. 统计不是特殊数字的数字数量

给你两个 正整数 l 和 r。对于任何数字 x&#xff0c;x 的所有正因数&#xff08;除了 x 本身&#xff09;被称为 x 的 真因数。 如果一个数字恰好仅有两个 真因数&#xff0c;则称该数字为 特殊数字。例如&#xff1a; 数字 4 是 特殊数字&#xff0c;因为它的真因数为 1 和…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...