RT-Thread分析-日志系统-rt_kprintf分析

目录

1 前言

2 rt_kprintf()

3 配置选项

4 console设备

4.1 设备声明

4.2 设备创建

4.3 获取_console_device

5 分析rt_kprintf()函数

6 rt_kprintf重定向


1 前言

        内核除了提供接口rt_kprintf()用于输出打印信息,还支持一整套完善的日志组件ulog。两者在实现上有重叠部分,都使用到console模块;其余功能都相互独立,只有深究其实现机制,才能更好的去使用或者移植该系统。

2 rt_kprintf()

  • 内核提供一个用于输出日志信息的接口
  • 默认使用console设备输出打印,其设备名称可在配置选项中修改
  • 如果未注册console设备,rt_kprintf最终会调用rt_hw_console_output()输出打印;该函数供用户自己实现功能

3 配置选项

使用该接口,需要在编译前进行如下配置

  • 主要决定如下两个参数
//打印缓存长度
#define RT_CONSOLEBUF_SIZE 256
//控制台设备名称
#define RT_CONSOLE_DEVICE_NAME "uart2"

4 console设备

        rt_kprintf()系统默认使用console设备输出打印信息,所有需要先了解内核如何创建并使用sonsole设备

4.1 设备声明

        内核使用全局变量_console_device来维护console设备

static rt_device_t _console_device = RT_NULL;

4.2 设备创建

  • 在启动过程中,内核会调用rt_hw_usart_init()完成uart设备注册;
  • 然后调用rt_console_set_device(RT_CONSOLE_DEVICE_NAME),去已注册的设备中查找是否有名称为RT_CONSOLE_DEVICE_NAME的设备,如果有则将该设备作为为_console_device

4.3 获取_console_device

  • 外部统一调用rt_console_get_device()来获取_console_device
rt_device_t rt_console_get_device(void)
{
    return _console_device;
}

5 分析rt_kprintf()函数

RT_WEAK void rt_kprintf(const char *fmt, ...)
{
    //1 缓存区声明,注意是静态局部变量,最大长度为RT_CONSOLEBUF_SIZE
    static char rt_log_buf[RT_CONSOLEBUF_SIZE];
    
    va_start(args, fmt);
    //2 整理打印日志保存到rt_log_buf,并返回实际输出长度
    length = rt_vsnprintf(rt_log_buf, sizeof(rt_log_buf) - 1, fmt, args);
    
    //3 限制长度
    if (length > RT_CONSOLEBUF_SIZE - 1)
        length = RT_CONSOLEBUF_SIZE - 1;
        
    if (_console_device == RT_NULL)
    {
        //4 如果内核未注册console设备,则执行rt_hw_console_output()完成输出。
        rt_hw_console_output(rt_log_buf);
    }
    else
    {
        //5 直接使用console设备输出信息
        rt_device_write(_console_device, 0, rt_log_buf, length);
    }
    
    va_end(args);
}

6 rt_kprintf重定向

  • 可以利用系统预留的rt_hw_console_output()接口。
  • 不注册console设备,自己在rt_hw_console_output()中完成重定向
  • 或者将console注册为任意设备,比如以太网,CAN,USB等

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RT-Thread是一个实时操作系统,可以在嵌入式系统上运行。要在RT-Thread中使用多个串口,并使用rt_kprintf函数打印输出,您可以按照以下步骤进行操作: 1. 配置串口设备:在RT-Thread的配置文件(rtconfig.h)中,找到`RT_SERIAL_DEVICE`宏定义。如果需要使用多个串口,可以将该宏定义的值设置为串口设备的数量,例如`#define RT_SERIAL_DEVICE 2`表示有两个串口设备。 2. 初始化串口设备:在应用程序初始化的地方,通过调用`rt_device_init`函数初始化每个串口设备。例如,如果有两个串口设备,可以使用以下代码初始化它们: ```c rt_device_t serial1, serial2; serial1 = rt_device_find("uart1"); serial2 = rt_device_find("uart2"); rt_device_init(serial1); rt_device_init(serial2); ``` 3. 打开串口设备:在需要使用串口的地方,通过调用`rt_device_open`函数打开相应的串口设备。例如,如果要使用第一个串口设备,可以使用以下代码打开它: ```c rt_device_open(serial1, RT_DEVICE_FLAG_RDWR); ``` 4. 使用rt_kprintf函数打印输出:在需要打印输出的地方,可以使用rt_kprintf函数来代替标准库的printf函数。例如,使用以下代码在第一个串口设备上打印输出: ```c rt_kprintf("Hello, RT-Thread!\n"); ``` 通过上述步骤,您可以在RT-Thread中使用多个串口,并使用rt_kprintf函数进行打印输出。请确保配置文件和代码中的串口设备名称与实际硬件一致,并根据需求进行相应的修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值