Skip to content

Commit b2868ab

Browse files
authored
Merge pull request #193 from PeterJhon/print
修复printf浮点数输出问题
2 parents e6ae5b5 + b549359 commit b2868ab

File tree

10 files changed

+1465
-3
lines changed

10 files changed

+1465
-3
lines changed

rtos/rt-thread

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
# rt_vsnprintf 完整功能版本
2+
3+
在RT-Thread的kservice.c源码中的这些函数的实现是为了满足RT-Thread内核的自持能力,即在不依赖标准C库的情况下,RT-Thread核心代码也可以正常运行,因此rt_kprintf、rt_sprintf、rt_snprintf、rt_vsnprintf这类打印函数(或者称之为rt_kprintf家族函数)仅仅满足内核的使用需求,不会实现完整的、和标准C库一致的功能,以减少ROM占用。但是,很多社区小伙伴希望rt_kprintf家族函数可以支持上更多的功能(例如打印浮点数据等等)。因此,本软件包实现了该功能。
4+
5+
本软件包实现了rt_kprintf家族函数的全功能版本,因为rt_kprintf家族函数的核心功能都是调用rt_vsnprintf函数,因此只需要重新实现rt_vsnprintf函数即可。本软件包基于开源项目[printf](https://github.com/eyalroz/printf)重新实现了rt_vsnprintf,在4.1.0以及以上的RT-Thread版本中,只需要安装本软件包即可。若RT-Thread低于4.1.0版本,需要手动将kservice.c内的rt_vsnprintf函数注释掉,再安装本软件包。
6+
7+
关于newlib下使用自带printf函数的问题可以参考这边帖子的评论区:https://club.rt-thread.org/ask/article/2b0a1d202135b205.html
8+
9+
## 接管标准C库的printf家族函数(仅支持4.1.0及以上版本)
10+
本软件包有三个功能宏开关,是否允许本软件包接管printf、sprintf以及snprintf函数,默认为yes,即接管。
11+
也就是说,安装本软件包后,即便没有使能libc(RT_USING_LIBC),你可以正常的使用printf、sprintf以及snprintf函数,当你调用这三个函数时,会自动被rt_kprintf、rt_sprintf、rt_snprintf函数接管。你可以正常使用printf家族函数的所有功能。
12+
13+
```c
14+
#include <stdio.h>
15+
16+
printf("hello world\n");
17+
```
18+
19+
## ROM占用
20+
GCC下占用8.6KB, Keil下占用8KB。远小于开启标准C库的ROM占用。
21+
22+
## 如何添加该软件包
23+
24+
```
25+
RT-Thread online packages
26+
system packages --->
27+
enhanced kernel services --->
28+
[*] rt_vsnprintf_full: fully functional version of rt_vsnprintf --->
29+
Version (latest) --->
30+
```
31+
32+
- 使用 `RT-Thread Studio` 打开 `RT-Thread Settings`, 点击添加软件包,输入关键字 `printf`, 添加 `rt_vsnprintf_full` 软件包,保存
33+
34+
![1](figures/1.png)
35+
36+
37+
- 软件包目录下多出了一个 `rt_vsnprintf_full-latest` 包
38+
39+
![2](figures/2.png)
40+
41+
42+
- 打开 rt_vsnprintf.c,发现其中也实现了 rt_vsnprintf
43+
44+
```c
45+
rt_int32_t rt_vsnprintf(char *buf, rt_size_t size, const char *fmt, va_list args)
46+
{
47+
return __vsnprintf(out_buffer, buf, size, fmt, args);
48+
}
49+
```
50+
51+
- 注释掉 kservice.c 中的 rt_vsnprintf **(只针对4.1.0版本以下)**
52+
53+
- 重新编译并运行 `rt_kprintf ``LOG_I`, 浮点数打印正常
54+
![3](figures/3.png)
55+
56+
57+
58+
## 维护
59+
60+
[Meco Man](https://github.com/mysterywolf)
61+
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
from building import *
2+
3+
src = ['rt_vsnprintf.c']
4+
CPPDEFINES = []
5+
6+
if GetDepend('RT_VSNPRINTF_FULL_REPLACING_SPRINTF'):
7+
CPPDEFINES += ['sprintf=rt_sprintf']
8+
if GetDepend('RT_VSNPRINTF_FULL_REPLACING_SNPRINTF'):
9+
CPPDEFINES += ['snprintf=rt_snprintf']
10+
if GetDepend('RT_VSNPRINTF_FULL_REPLACING_PRINTF'):
11+
CPPDEFINES += ['printf=rt_kprintf']
12+
13+
group = DefineGroup('rt_kprintf', src, depend = ['PKG_USING_RT_VSNPRINTF_FULL'], CPPDEFINES = CPPDEFINES)
14+
Return('group')
43.2 KB
Loading
36.8 KB
Loading
35.9 KB
Loading

0 commit comments

Comments
 (0)