STM32-- 调试 -日志输出
在调试嵌入式程序时,输出日志是非常重要的环节,可以帮助开发者定位问题、监控程序状态和性能。以下是几种常见的日志输出方式及其适用场景:
1. 使用串口(UART)输出日志
实现方式:
通过串口将日志输出到主机的串口工具(如 PuTTY
、Tera Term
、minicom
)中。
优点:
- 简单易用,几乎所有嵌入式设备都支持。
- 实时性强,适合调试运行时的动态信息。
- 与 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-- 调试 -日志输出
在调试嵌入式程序时,输出日志是非常重要的环节,可以帮助开发者定位问题、监控程序状态和性能。以下是几种常见的日志输出方式及其适用场景: 1. 使用串口(UART)输出日志 实现方式: 通过串口将日志输出到主…...

Python爬虫案例八:抓取597招聘网信息并用xlutils进行excel数据的保存
excel保存数据的三种方式: 1、pandas保存excel数据,后缀名为xlsx; 举例: 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模拟实现
引言 在现代分布式系统中,消息队列(Message Queue, MQ)作为一种重要的中间件,扮演着连接不同服务、实现异步通信和消息解耦的关键角色。Apache RocketMQ作为一款高性能的分布式消息中间件,广泛应用于实时数据流处理、…...
python语言基础-5 进阶语法-5.3 流式编程
声明:本内容非盈利性质,也不支持任何组织或个人将其用作盈利用途。本内容来源于参考书或网站,会尽量附上原文链接,并鼓励大家看原文。侵删。 5.3 流式编程(参考链接:https://www.zhihu.com/question/59062…...

JVM性能分析工具JProfiler的使用
一、基本概念 JProfiler:即“Java Profiler”,即“Java分析器”或“Java性能分析工具”。它是一款用于Java应用程序的性能分析和调试工具,主要帮助开发人员识别和解决性能瓶颈问题。 JVM:即“Java Virtual Machine”,…...
面试题: Spring中的事务是如何实现的?
Spring中的事务是如何实现的? 背景个人原因的背景正规一点的背景 答案一些思绪和灵感个人理解程度拓展知识Spring的事务管理主要涉及哪几个类?在Spring中,事务管理的流程是怎样的? 背景 个人原因的背景 想换工作, 刷面试题看到的问题, 简单记录一下, 算是个人…...
vue2-代理服务器插槽
解决跨域问题 配置代理服务器 代理服务器位于前端应用(客户端)和真实的后端服务器之间。当配置了代理服务器后,前端应用的请求不再直接发送到后端服务器,而是发送到代理服务器。代理服务器在接收到请求后,会根据预先配置的规则将请求转发到真…...

(python)unittest框架
unittest unnitest介绍 TestCase测试用例 书写真正的用例脚本...
网安基础知识|IDS入侵检测系统|IPS入侵防御系统|堡垒机|VPN|EDR|CC防御|云安全-VDC/VPC|安全服务
网安基础知识|IDS入侵检测系统|IPS入侵防御系统|堡垒机|VPN|EDR|CC防御|云安全-VDC/VPC|安全服务 IDS入侵检测系统 Intrusion Detection System 安全检测系统,通过监控网络流量、系统日志等信息,来检测系统中的安全漏洞、异常行为和入侵行为。 分为&am…...
面试小结(一)
1、hashmap的底层设计原理以及扩容规则,是否线程安全,如何线程安全。 底层原理:数组 链表 红黑树。HashMap 的底层实现是一个数组,数组中的每个元素是一个链表或红黑树(JDK 1.8 以后,当链表长度超过一定…...
笔试-笔记2
1.设存在函数int max(int,int)返回两参数中较大值,若求22,59,70三者中最大值,下列表达式不正确的是() 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)); 解析…...
html5复习二
知识点: 1、音频标签 <audio controls"controls" loop"loop" preload"auto" src"张恒远 - 追梦赤子心.mp3" muted"muted" > </audio> controls:显示控件 必须写 loop:循环播放&#x…...
大模型呼入机器人系统如何建设?
大模型呼入机器人系统如何建设? 作者:开源呼叫中心系统 FreeIPCC, Github地址:https://github.com/lihaiya/freeipcc 大模型呼叫中心呼入机器人系统的建设是一个涉及多个环节和领域的综合性工程。以下是一个详细的步骤指南,涵盖了…...

docker 部署 kvm 图形化管理工具 WebVirtMgr
镜像构建 官方最后一次更新已经是 2015年6月22日 了,官方也没有 docker 镜像,这边选择咱们自己构建如果你的服务器有魔法,可以直接 git clone 一下 webvirtmgr 的包,没有的话,可以和我一样,提前从 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 是该表的主键(具有唯一值的列…...

【从零开始的LeetCode-算法】3233. 统计不是特殊数字的数字数量
给你两个 正整数 l 和 r。对于任何数字 x,x 的所有正因数(除了 x 本身)被称为 x 的 真因数。 如果一个数字恰好仅有两个 真因数,则称该数字为 特殊数字。例如: 数字 4 是 特殊数字,因为它的真因数为 1 和…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...

Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...