Stm32F103&Rt_Thread系列开发——03 日志管理

2023-10-30

Stm32F103&Rt_Thread系列开发——03 日志管理

一、前言:

        本系列教程教大家如何从0开始,在Stm32F1系列芯片上使用Rt_Thread实时操作系统进行程序开发,本教程选择的开发板为:正点原子Mini STM32F103RCT6开发板。

        在进行程序开发之前,先要建立日志管理,这样在程序开发过程中,才能根据日志信息准确定位程序所出现的问题。本章将介绍RT_Thread 的日志管理系统。

二、普通打印

1、打印函数

        学过stm32裸机的朋友,都知道裸机中是将C语言中的printf()函数进行重定向后,就可以在裸机代码中使用,在RT thread实时操作系统中,也提供了一个打印函数 rt_kprintf(); 该函数原型的路径在:/rt-thread/src/kservice.c中,其使用方法与printf()一致,并且官方推荐使用该函数,因为其效率高于printf();。唯一的缺点是,不支持浮点数打印。

使用案例:

//测试打印
const int number = 12;
const int hex = 0xa;
const char str[] = "this is test string!";
rt_kprintf("orange \n");
rt_kprintf("number: %d\n", number);
rt_kprintf("hex: %x\n", hex);
rt_kprintf("string: %s\n", str);
rt_kprintf("float: %f\n", numf);

//打印结果
orange 
number: 12
hex: a
string: this is test string!
float: %f

2、浮点数打印

前一节提到,rt_kprintf(); 不支持浮点数打印,那么当需要打印浮点数时,如何操作?笔者搜集了三种处理方法。

测试代码如下:

#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>
#include <stdio.h>

#define DBG_BUFF_MAX_LEN          256
/* debug print : support float double */
int dbg_printf(const char *fmt, ...)
{
    va_list args;
    static char rt_log_buf[DBG_BUFF_MAX_LEN] = { 0 };
    va_start(args, fmt);
    int length = vsnprintf(rt_log_buf, sizeof(rt_log_buf) - 1, fmt, args);
    rt_kputs(rt_log_buf);
    return length;
}

int main(void)
{
    //测试浮点打印
    const float pi = 3.14f;
    //方法1
    rt_kprintf("No1 pi = %d.%03d\n", (int)pi, (int)(pi*1000)%1000);
    //方法2
    dbg_printf("No2 pi = %f\n", pi);
    //方法3
    char tempchar[10];
    sprintf(tempchar, "No3 pi = %f\n", pi);
    rt_kprintf(tempchar);
    
    while (1)
    {
        rt_thread_mdelay(500);
    }
}

//测试结果
No1 pi = 3.140
No2 pi = 3.140000
No3 pi = 3.140000

方法1:应用了计算的方法,将浮点数的整数部分与小数部分单独打印。

方法2:运用vsnprintf()函数,重新封装了一个打印函数,进行打印。

方法3:使用:sprintf()函数,将格式化字符串,保存到一段char数组中,之后用rt_kprinf() 打印。

当然,还可以使用c库自带的prinf()函数,但是需要重定向串口。

3、番外,多格式打印

在做工程开发中,常用到有格式要求的数字输出,演示如下:

十进制输出使用%d,十六进制输出使用%x。而%2d,中的2表示输出宽度。%.2d与%02d类似,都表示宽度不足2时,向前方补0。%-2d表示后补空格。十六进制类似。

//输出
int a = 5;
rt_kprintf("%d\n", a);
rt_kprintf("%2d\n", a);
rt_kprintf("%.2d\n", a);
rt_kprintf("%-2d\n", a);
rt_kprintf("%02d\n", a);
//输出
5
 5
05
5 
05
//代码
int b = 0xf;
rt_kprintf("%x\n", b);
rt_kprintf("%2x\n", b);
rt_kprintf("%.2x\n", b);
rt_kprintf("%-2x\n", b);
rt_kprintf("%02x\n", b);
//输出
f
 f
0f
f 
0f

浮点数中,%.2f,表示,保留两位小数。

//代码
const float pi = 3.14159f;
dbg_printf("%f\n", pi);
dbg_printf("%.2f\n", pi);
dbg_printf("%.3f\n", pi);
// 输出
3.141590
3.14
3.142

三、日志打印

        平时使用日志时,需要区分日志等级,日志等级一般分为四个,分别是:错误(ERROR),警告(WARNING),信息(INFO),调试(LOG)。

        其中优先级为 错误 > 警告 > 信息 > 调试。我们可以在指定单个.c文件中日志的打印等级,指定打印等级后,高于该等级的日志会被打印,低于该等级的日志不会被打印。例如,指定打印等级为警告,则该文件中的错误与警告会被打印,而信息与调试不会被打印。

        Rt thread 有自带的打印日志,也可以配置轻量级日志ulog,本文介绍自带打印日志信息。

1、日志打印

打印日志的头文件为 ,该文件在/rt-thread/include/rtdbg.h中。

使用时,需要添加段名与打印等级,并包含头文件,示例如下:

#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>

#define DBG_SECTION_NAME "main"
#define DBG_COLOR
#define DBG_LEVEL DBG_LOG       //调试
// #define DBG_LEVEL DBG_INFO      //信息
// #define DBG_LEVEL DBG_WARNING   //警告
// #define DBG_LEVEL DBG_ERROR     //错误
#include <rtdbg.h>

int mian()
{
    LOG_D("this is debug");
    LOG_I("this is information");
    LOG_W("this is working");
    LOG_E("this is error");
}

输出示例:

值得注意的是:由于头文件的包含具有顺序性,故在文件中,先包含其余模块头文件,再定义DBG_SECTION_NAME与DBG_LEVEL宏,最后再包含头文件。

四、结语

日志打印就介绍到这里了,下期分享更多精彩内容。

最后欢迎关注我的公众号,会定期推送嵌入式相关教程。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Stm32F103&Rt_Thread系列开发——03 日志管理 的相关文章

随机推荐

  • 雅可比(Jacobi)计算特征值和特征向量

    雅可比迭代法法 在图形图像中很多地方用到求矩阵的特征值和特征向量 比如主成分分析 OBB包围盒等 编程时一般都是用数值分析的方法来计算 这里介绍一下雅可比迭代法求解特征值和特征向量 雅可比迭代法的原理 网上资料很多 详细可见参考资料1 这里
  • 最小二乘法(OLS)python 实践

    参考链接 1 基本原理 https zhuanlan zhihu com p 149280941 2 python实现 https zhuanlan zhihu com p 22692029 实现结果 线性回归 coding utf 8 简
  • 2022 数学建模C题 高教社杯 含半成品论文 部分代码 全部数学模型 和全套思路

    2022 数学建模国赛B题 高教社杯 含半成品论文 部分代码 全部数学模型 和全套思路 定时更新 全部内容见 https mianbaoduo com o bread mbd Y5WUkpps 注 题目阅读后主要告诉我们的内容见标蓝的关键词
  • oracle 11g安装教程完整版

    64位WIN7 oracle11g plsql安装 上部转自Oracle 11g R2 for Win7旗舰版 64位 的安装步骤 1 下载Oracle 11g R2 for Windows的版本 下载地址 http www oracle
  • MemTest64内存测试

    MemTest64是一款测试电脑内存稳定性的测试 软件同时支持32位64位运行环境 界面如下 一 使用步骤 设定使用模式 点击开始 二 各个设置项说明 测试内存 可打开任务管理器查看内存和CPU使用情况 选择合适内存值 无限制运行 建议慎用
  • Spring Boot的底层原理

    一 Spring Boot简介 1 什么是Spring Boot Spring Boot是由Pivotal团队提供的框架 其设计目的是用来简化新Spring应用的初始搭建以及开发过程 该框架使用了特定的方式 继承starter 约定优先于配
  • Java基础:Stream流常用方法

    获取Stream流的方式 java util stream Stream 是Java 8新加入的流接口 并不是一个函数式接口 获取一个流非常简单 有以下几种常用的方式 所有 Collection 集合都可通过 stream 默认方法获取流
  • 【uniapp项目路由,配置,修改uni ui默认样式,小程序端不生效问题】

    1 对不同平台进行不同配置或样式 对不同端的css样式不一样 使用 ifdef endif 包裹 其中MP表示小程序端 表仅在小程序端是那个样式 ifdef APP PLUS margin top 88rpx endif ifdef H5
  • isis安装指南(Liunx版本)+ ASP

    ISIS Integrated Software for Imagers and Spectrometers 是一个数字图像处理软件包 用于处理当前和过去 NASA 和国际行星任务收集的图像 例如 从PDS下载的LRO月球影像数据源文件为I
  • 三维视觉--基于Kinect2.0深度相机的点云获取方案实现(C++版)

    上一篇中使用的点云获取设备是Intel Realsense d455相机 这两天接触的相机不少 也发现很多点云检测和分割的论文中使用的都是Kinect相机 今天就再分享一篇使用Kinect2 0获取点云并使用C 实现 首先还是相机SDK的下
  • PADS Logic VX2.7 原理图库绘制

    首先打开PADS Logic VX2 7 1 点击文件 点击库 2 新建库 3 存放放在你想存放的文件夹中 文件命名尽量英文数字 其实中文也没事我试过 哈哈哈 后缀pt9 然后点击保存 4 点击管理库列表 先点击刚刚创建的库 点击上 移动到
  • 面向对象和面向过程:两种程序设计思想的基础介绍和对比

    一 面向过程程序设计 面向过程 程序 算法 数据结构 面向过程的核心理念是 步骤分解 即把需要解决的问题分成一个个步骤 并用不同函数来实现它们 设计思维 自顶向下 逐步求精 按照逻辑顺序从上到下完成整个过程的编写 让我们用一个简单的数学问题
  • 3DMAX中的7个基本建模小窍门

    3DMAX中的7个基本建模小窍门 在这里 我们分享一些基本的3dmax建模技巧 希望能帮助您作为3D艺术家的成长和发展 虽然这篇文章是从3ds Max的角度进行阐述的 但这里提到的所有内容对于任何其他建模应用程序都同样有效 例如Maya C
  • 软件测试52讲-笔记(持续更新中...)

    软件测试52讲 01 你真的懂测试吗 从 用户登录 测试谈起 02 如何设计一个 好的 测试用例 03 什么是单元测试 如何做好单元测试 04 为什么要做自动化测试 什么样的项目适合做自动化测试 05 你知道软件开发各阶段都有哪些自动化测试
  • Linux上安装Matlab2020a

    目录 一 下载 Crack 和 ISO 镜像文件 二 安装MATLAB 1 挂载镜像并开始运行 install 文件 2 选择 使用Key安装 3 取消挂载 三 激活MATLAB 四 创建快捷启动方式 一 下载 Crack 和 ISO 镜像
  • 硬件系统工程师宝典(34)-----FLASH电路如何设计?

    各位同学大家好 欢迎继续做客电子工程学习圈 今天我们继续来讲这本书 硬件系统工程师宝典 上篇我们了解了存储器可分为RAM和ROM 根据不同特性也可以逐级细分 并且简单介绍了EEPROM 今天我们讲一讲FLASH有哪几种 NOR FLASH
  • elementui table组建高度动画

    el table transform all 0 3s height 0 Vue component el table extends Element Table created this KaTeX parse error Expecte
  • The PLY Polygon File Format

    The PLY Polygon File Format Author Greg Turk Introduction This document presents the PLY polygon file format a format fo
  • 格密码学习笔记(一):格的定义、基本区域和行列式

    文章目录 格的基本定义 格的基本区域 格的行列式 致谢 格的基本定义 定义1 给定 n n n维实数空间 R n mathbb R n
  • Stm32F103&Rt_Thread系列开发——03 日志管理

    Stm32F103 Rt Thread系列开发 03 日志管理 一 前言 本系列教程教大家如何从0开始 在Stm32F1系列芯片上使用Rt Thread实时操作系统进行程序开发 本教程选择的开发板为 正点原子Mini STM32F103RC