BLE_TYQ_BJQ_CH32V303/packages/rt_vsnprintf_full-master
小马_666 b2c5011701 first commit 2024-12-01 13:49:43 +08:00
..
figures first commit 2024-12-01 13:49:43 +08:00
README.md first commit 2024-12-01 13:49:43 +08:00
rt_vsnprintf.c first commit 2024-12-01 13:49:43 +08:00

README.md

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重新实现了rt_vsnprintf在4.1.0以及以上的RT-Thread版本中只需要安装本软件包即可。若RT-Thread低于4.1.0版本需要手动将kservice.c内的rt_vsnprintf函数注释掉再安装本软件包。

关于newlib下使用自带printf函数的问题可以参考这边帖子的评论区https://club.rt-thread.org/ask/article/2b0a1d202135b205.html

接管标准C库的printf家族函数仅支持4.1.0及以上版本)

本软件包有三个功能宏开关是否允许本软件包接管printf、sprintf以及snprintf函数默认为yes即接管。 也就是说安装本软件包后即便没有使能libc(RT_USING_LIBC)你可以正常的使用printf、sprintf以及snprintf函数当你调用这三个函数时会自动被rt_kprintf、rt_sprintf、rt_snprintf函数接管。你可以正常使用printf家族函数的所有功能。

#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

  • 软件包目录下多出了一个 rt_vsnprintf_full-latest

    2

  • 打开 rt_vsnprintf.c发现其中也实现了 rt_vsnprintf

    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

维护

Meco Man