iap 完善 & 浮点数printf 适配

Signed-off-by: a1012112796 <1012112796@qq.com>
This commit is contained in:
2023-01-03 13:16:29 +08:00
parent 669e1f1e77
commit 1ec5bc8ffd
16 changed files with 1668 additions and 579 deletions

12
packages/SConscript Normal file
View File

@@ -0,0 +1,12 @@
import os
from building import *
objs = []
cwd = GetCurrentDir()
list = os.listdir(cwd)
for item in list:
if os.path.isfile(os.path.join(cwd, item, 'SConscript')):
objs = objs + SConscript(os.path.join(item, 'SConscript'))
Return('objs')

7
packages/pkgs.json Normal file
View File

@@ -0,0 +1,7 @@
[
{
"path": "/packages/system/enhanced-kservice/rt_vsnprintf_full",
"ver": "latest",
"name": "RT_VSNPRINTF_FULL"
}
]

1
packages/pkgs_error.json Normal file
View File

@@ -0,0 +1 @@
[]

View File

@@ -0,0 +1,59 @@
# rt_vsnprintf 完整功能版本
在RT-Thread的kservice.c源码中的这些函数的实现是为了满足RT-Thread内核的自持能力即在不依赖标准C库的情况下RT-Thread核心代码也可以正常运行因此rt_kprintf、rt_sprintf、rt_snprintf、rt_vsnprintf这类打印函数或者称之为rt_kprintf家族函数仅仅满足内核的使用需求不会实现完整的、和标准C库一致的功能以减少ROM占用。但是很多社区小伙伴希望rt_kprintf家族函数可以支持上更多的功能例如打印浮点数据等等。因此本软件包实现了该功能。
本软件包实现了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函数注释掉再安装本软件包。
## 接管标准C库的printf家族函数仅支持4.1.0及以上版本)
本软件包有三个功能宏开关是否允许本软件包接管printf、sprintf以及snprintf函数默认为yes即接管。
也就是说安装本软件包后即便没有使能libc(RT_USING_LIBC)你可以正常的使用printf、sprintf以及snprintf函数当你调用这三个函数时会自动被rt_kprintf、rt_sprintf、rt_snprintf函数接管。你可以正常使用printf家族函数的所有功能。
```c
#include <stdio.h>
printf("hello world\n");
```
## ROM占用
GCC下占用8.6KB, Keil下占用8KB。远小于开启标准C库的ROM占用。
## 如何添加该软件包
```
RT-Thread online packages
system packages --->
enhanced kernel services --->
[*] rt_vsnprintf_full: fully functional version of rt_vsnprintf --->
Version (latest) --->
```
- 使用 `RT-Thread Studio` 打开 `RT-Thread Settings`, 点击添加软件包,输入关键字 `printf`, 添加 `rt_vsnprintf_full` 软件包,保存
![1](figures/1.png)
- 软件包目录下多出了一个 `rt_vsnprintf_full-latest`
![2](figures/2.png)
- 打开 rt_vsnprintf.c发现其中也实现了 rt_vsnprintf
```c
rt_int32_t rt_vsnprintf(char *buf, rt_size_t size, const char *fmt, va_list args)
{
return __vsnprintf(out_buffer, buf, size, fmt, args);
}
```
- 注释掉 kservice.c 中的 rt_vsnprintf **(只针对4.1.0版本以下)**
- 重新编译并运行 `rt_kprintf ` 和 `LOG_I`, 浮点数打印正常
![3](figures/3.png)
## 维护
[Meco Man](https://github.com/mysterywolf)

View File

@@ -0,0 +1,14 @@
from building import *
src = ['rt_vsnprintf.c']
CPPDEFINES = []
if GetDepend('RT_VSNPRINTF_FULL_REPLACING_SPRINTF'):
CPPDEFINES += ['sprintf=rt_sprintf']
if GetDepend('RT_VSNPRINTF_FULL_REPLACING_SNPRINTF'):
CPPDEFINES += ['snprintf=rt_snprintf']
if GetDepend('RT_VSNPRINTF_FULL_REPLACING_PRINTF'):
CPPDEFINES += ['printf=rt_kprintf']
group = DefineGroup('rt_kprintf', src, depend = ['PKG_USING_RT_VSNPRINTF_FULL'], CPPDEFINES = CPPDEFINES)
Return('group')

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

File diff suppressed because it is too large Load Diff