Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread
vsnprintf
学习笔记
RT-Thread vsnprintf来替代rt_vsnprintf来打印浮点
发布于 2022-02-03 21:42:01 浏览:3051
订阅该版
[tocm] [RT-Thread 入门学习笔记 - 目录](https://club.rt-thread.org/ask/article/3420.html) ## 备注 - 这里提供一种调试的思路,并非强调:使用 `vsnprintf` 来替代 `rt_vsnprintf` - 终极解决方法是:完善 `rt_vsnprintf`,增加浮点的格式化功能 - 本篇为个人在使用或熟悉 RT-Thread 时的个人【学习笔记】 ## 前言 - 有童鞋说在 gcc下,`vsnprintf` 来替代 `rt_vsnprintf` 来打印浮点会引发死机 - 经过实际验证,没有发现死机 - 但并不建议直接用 `vsnprintf` 来替代 `rt_vsnprintf`,打印浮点多半用于调试,可以独立成一个专门的打印函数 - `vsnprintf` 只是用于把浮点格式化到字符串,只要字符串长度不溢出,理论上不会造成死机 - 如果发现死机,需要确认打印的环境,如中断中,尤其在串口输出的情况下 ## 测试例程 - RT-Thread Studio `arm-none-eabi-gcc` 环境:未发现死机现象 - Keil MDK5 环境:未发现死机现象 - cygwin gcc 环境:未发现死机现象 - 可以正常的用于浮点数的调试打印 ```c /* * 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 = %lf\r\n", 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 = %lf\r\n", a+b+count); rt_thread_mdelay(1000); rt_pin_write(LED0_PIN, PIN_LOW); rt_thread_mdelay(2000); } return RT_EOK; } ``` - cygwin的测试 ```c /* 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("%s\r\n", 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的打印: ```c $ ./a.exe 123453.000144 ``` ## 小结 - `rt_kprintf`,采用不依赖标准C库的方式,主要目的是为了减少ROM(Flash)的占用 - 如果实际中需要浮点打印(如打印到串口、打印到文件),可以基于 `vsnprintf` 编写一个简单的全功能格式打印函数 - RT-Thread ulog 可以开启浮点支持,开启后使用:`vsnprintf` - `vsnprintf`使用需要考虑【线程安全】问题
15
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
张世争
学以致用
文章
131
回答
801
被采纳
173
关注TA
发私信
相关文章
1
RT-THREAD在STM32H747平台上移植lwip
2
正点原子miniSTM32开发板读写sdcard
3
反馈rtt串口驱动对低功耗串口lpuart1不兼容的问题
4
Keil MDK 移植 RT-Thread Nano
5
RT1061/1052 带 RTT + LWIP和LPSPI,有什么坑要注意吗?
6
RT thread HID 如何收发数据
7
求一份基于RTT系统封装好的STM32F1系列的FLASH操作程序
8
RT-Thread修改项目名称之后不能下载
9
rt-studio编译c++
10
有木有移植rt-thread(nano)到riscv 32位MCU上
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
张世争
8
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
KunYi
6
个答案
1
次被采纳
本月文章贡献
程序员阿伟
5
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部