0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

RT-Thread vsnprintf来替代rt_vsnprintf来打印浮点

冬至子 来源:张世争 作者:张世争 2023-08-01 16:35 次阅读

前言

有童鞋说在gcc下,vsnprintf来替代rt_vsnprintf来打印浮点会引发死机

经过实际验证,没有发现死机

但并不建议直接用vsnprintf来替代rt_vsnprintf,打印浮点多半用于调试,可以独立成一个专门的打印函数

vsnprintf只是用于把浮点格式化到字符串,只要字符串长度不溢出,理论上不会造成死机

如果发现死机,需要确认打印的环境,如中断中,尤其在串口输出的情况下

测试例程

RT-Thread Studio arm-none-eabi-gcc 环境:未发现死机现象

Keil MDK5 环境:未发现死机现象

cygwin gcc 环境:未发现死机现象

可以正常的用于浮点数的调试打印

/*

Copyright (c) 2006-2018, RT-Thread Development Team

SPDX-License-Identifier: Apache-2.0

Change Logs:

Date Author Notes

2018-11-06 SummerGift change to new framework
/
#include
#include
#include
#include "drv_gpio.h"
/
defined the LED0 pin: PA5 /
#define LED0_PIN GET_PIN(A, 5)
#include
#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)
{
double a = 334455.00123345;
double b = 667788.14234234;
dbg_printf("double a = %lfrn", a);
int count = 1;
/
set LED0 pin mode to output */
rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);
while (count++)
{
rt_pin_write(LED0_PIN, PIN_HIGH);
dbg_printf("double a + b = %lfrn", a+b+count);
rt_thread_mdelay(1000);
rt_pin_write(LED0_PIN, PIN_LOW);
rt_thread_mdelay(2000);
}
return RT_EOK;
}
cygwin的测试

/ vsnprintf example /
include
include
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);
printf("%srn", rt_log_buf);
return length;
}

int main ()
{
double a = 123453.0001444;
dbg_printf(“%lf”, a);
return 0;
}

## 输出效果

```c
msh >
  | /
- RT -     Thread Operating System
 / |      4.1.0 build Feb  3 2022 21:11:28
 2006 - 2022 Copyright by RT-Thread team
double a = 334455.001233
double a + b = 1002245.143576
msh >double a + b = 1002246.143576
double a + b = 1002247.143576
double a + b = 1002248.143576
double a + b = 1002249.143576
double a + b = 1002250.143576
double a + b = 1002251.143576
double a + b = 1002252.143576
double a + b = 1002253.143576
double a + b = 1002254.143576
double a + b = 1002255.143576
double a + b = 1002256.143576
double a + b = 1002257.143576
double a + b = 1002258.143576
double a + b = 1002259.143576
double a + b = 1002260.143576
double a + b = 1002261.143576
cygwin的打印:
$ ./a.exe
123453.000144

小结

rt_kprintf,采用不依赖标准C库的方式,主要目的是为了减少ROM(Flash)的占用

如果实际中需要浮点打印(如打印到串口、打印到文件),可以基于vsnprintf编写一个简单的全功能格式打印函数

RT-Thread ulog可以开启浮点支持,开启后使用:vsnprintf
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • ROM
    ROM
    +关注

    关注

    4

    文章

    527

    浏览量

    85141
  • 串口输出
    +关注

    关注

    0

    文章

    16

    浏览量

    7437
  • RT-Thread
    +关注

    关注

    31

    文章

    1197

    浏览量

    39059
  • Flash单片机
    +关注

    关注

    0

    文章

    111

    浏览量

    9322
  • gcc编译器
    +关注

    关注

    0

    文章

    78

    浏览量

    3265
收藏 人收藏

    评论

    相关推荐

    RT-Thread记录(二、RT-Thread内核启动流程)

    在前面我们RT-Thread Studio工程基础之上讲一讲RT-Thread内核启动流程.
    的头像 发表于 06-20 00:30 4583次阅读
    <b class='flag-5'>RT-Thread</b>记录(二、<b class='flag-5'>RT-Thread</b>内核启动流程)

    如何使用RT-Thread Studio新建项目

    RT-Thread Studio学习之使用外部时钟系统简介新建RT-Thread项目使用外部时钟简介本文将基于STM32F407VET芯片介绍如何使用RT-Thread Studio
    发表于 01-20 07:51

    如何使用RT-Thread kprintf去打印数字呢

    args){ return __vsnprintf(out_buffer, buf, size, fmt, args);}注释 kservice.c 中的 rt_vsnprintf重新编译并运行rt_kprintf 和LOG_
    发表于 04-18 14:56

    RT-Thread中如何将串口重定向到rt_kprintf()呢

    重映射在初学C语言时,用的最多的怕是printf()函数了,其作用就是将传入的参数打印到屏幕上,可以实现人机交互或方便用户对程序的调试等等。在RT-Thread中,也有一个打印函数
    发表于 05-07 14:51

    怎样去解决RT-Thread浮点打印的问题呢

    (目前master分支已无该问题,RT_ALIGN_SIZE默认为8了)主要讲讲MounRiver Studio下的浮点打印(RTT Studio)问题,RT-Thread Studi
    发表于 02-07 11:49

    rt_vsnprintf完整功能版本不支持打印某些格式?

    最近在使用rt-thread的插件rt_vsnprintf完整功能版本打印东西时,有些格式无法输出,输出显示为空,如 %-*.s 这个格式,内核中很多这样的格式输出,比如rt
    发表于 03-06 10:20

    rt_vsnprintf函数内部数组分配为什么不在栈内?

    环境 Rt-thread studio ,at32F437程序中使用了软件包rt_vsnprintf,使用jlink下载程序后,程序运行总会出现莫名的逻辑故障。 分析锁定问题后,发现
    发表于 08-20 11:45

    RT-Thread编程指南

    RT-Thread编程指南——RT-Thread开发组(2015-03-31)。RT-Thread做为国内有较大影响力的开源实时操作系统,本文是RT-Thread实时操作系统的编程指南
    发表于 11-26 16:06 0次下载

    RT-Thread开发,如何有效学习RT-Thread的五个步骤

    RT-Thread推出RT-Thread Inside战略开放RT-Thread开发平台授权合作,与硬件十万个为什么合作首次推出第一款RT-Inside的开发板——iBox物联网开发套
    的头像 发表于 09-25 09:55 3.4w次阅读
    <b class='flag-5'>RT-Thread</b>开发,如何有效学习<b class='flag-5'>RT-Thread</b>的五个步骤

    RT-Thread开源作品秀】基于RT-Thread的星务平台研究

    本作品为了验证星务软件在RT-Thread系统运行的可行性,底层是否能够驱动星务软件,同时扩展RT-Thread应用范围。ART-Pi作为卫星下位机,...
    发表于 01-25 18:26 5次下载
    【<b class='flag-5'>RT-Thread</b>开源作品秀】基于<b class='flag-5'>RT-Thread</b>的星务平台研究

    RT-Thread学习笔记 RT-Thread的架构概述

    RT-Thread 简介 作为一名 RTOS 的初学者,也许你对 RT-Thread 还比较陌生。然而,随着你的深入接触,你会逐渐发现 RT-Thread 的魅力和它相较于其他同类型 RTOS
    的头像 发表于 07-09 11:27 4154次阅读
    <b class='flag-5'>RT-Thread</b>学习笔记 <b class='flag-5'>RT-Thread</b>的架构概述

    RT-Thread文档_RT-Thread 简介

    RT-Thread文档_RT-Thread 简介
    发表于 02-22 18:22 5次下载
    <b class='flag-5'>RT-Thread</b>文档_<b class='flag-5'>RT-Thread</b> 简介

    RT-Thread文档_RT-Thread 潘多拉 STM32L475 上手指南

    RT-Thread文档_RT-Thread 潘多拉 STM32L475 上手指南
    发表于 02-22 18:23 7次下载
    <b class='flag-5'>RT-Thread</b>文档_<b class='flag-5'>RT-Thread</b> 潘多拉 STM32L475 上手指南

    RT-Thread文档_RT-Thread SMP 介绍与移植

    RT-Thread文档_RT-Thread SMP 介绍与移植
    发表于 02-22 18:31 8次下载
    <b class='flag-5'>RT-Thread</b>文档_<b class='flag-5'>RT-Thread</b> SMP 介绍与移植

    基于RT-Thread Studio学习

    前期准备:从官网下载 RT-Thread Studio,弄个账号登陆,开启rt-thread学习之旅。
    的头像 发表于 05-15 11:00 2922次阅读
    基于<b class='flag-5'>RT-Thread</b> Studio学习