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

2023-11-05

目录

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等

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RT-Thread分析-日志系统-rt_kprintf分析 的相关文章

  • HTML入门学习笔记

    我是目录 1 标题 段落标签 2 文本格式化标签 3 布局标签 div span 4 图像标签 5 相对路径 绝对路径 6 链接标签 锚点标签 7 表格标签 显示数据 8 列表标签 布局页面 9 表单标签 为了收集用户信息 1 标题 段落标
  • Box2D v2.3.0 用户指南(第四章)

    第四章 碰撞模块 Collision Module 4 1简介 碰撞模块包含形状 shape 以及操作它们的函数 此外 碰撞模块还包括dynamictree和broad phase来加快大型系统的碰撞处理速度 碰撞模块被设计为可独立于动态系
  • OrCAD进行DRC时报错的解决办法(持续添加中~~)

    1 WARNING ORCAP 1829 Possible pin type conflict 报错原因 器件的引脚类型和直接连接的信号类型冲突了解决方法 此类警告可直接忽略 或按如下方法处理 1 单击出现警告的器件 右键选择 Edit P

随机推荐

  • Python编程小知识-1-省略号运用

    默默无闻的省略号很好用 在Python中 一切皆对象 省略号也不例外 在Python 3中你可以直接写来得到它 gt gt gt Ellipsis gt gt gt type
  • 复习C语言指针---数组指针

    复习C语言指针 第二章 数组指针 数组指针 复习C语言指针 第二章 数组指针 数组指针定义 数组指针和二维数组 数组指针和指针数组 总结 数组指针定义 数组指针 其本质是指针 是指向一整个数组的指针 一 这里 要说明指向数组的指针和指向一整
  • mysql fulltext_干货!从零开始学习MySQL

    关注我们吧 查看更多干货文章 视频 回复 数据 还有数据分析相关资料领取 每周更有免费直播课 有问题也可私信咨询小编哦 一 为什么要用全文索引 我们在用一个东西前 得知道为什么要用它 使用全文索引无非有以下原因 like查询太慢 json字
  • openwrt 作为旁路由教程,适用于小米主路由

    小米路由作为主路由 openwrt作为旁路由时 手机上无线会提示无法访问外网 这个是由于小米路由自身解析导致 参考了好几篇文章 自己也趟了几遍才设置好 openwrt旁路由设置 刷好固件的新 Openwrt 网关 一般默认的IP地址是192
  • React Ref 其实是这样的

    大家好 我是Mokou 好久没有冒泡了 最近一直在看研究算法和数据结构方面的东西 但是似乎很多前端不喜欢看这种东西 而且目前本人算法方面也很挫 就不献丑了 当然了 最近也开始研究React了 这篇文章主要是讲述 Ref 相关的内容 如有错误
  • linux驱动开发学习笔记八:配置内核必不可少的工具--menuconfig

    一 常见的几种配置工具介绍 在配置内核的时候会有很多配置方法 make menuconfig make xxx defconfig 直接修改 config 注意 其中menuconfig是一个图形化配置工具 在后面我们会着重介绍 xxx d
  • 这篇文章把数据讲透了(四):数据挖掘

    一 前言 上一期文章中 我们已经了解到 数据 是一个庞大的体系 如下图所示 并用了 洗菜 择菜 的例子 为大家讲解数据清洗的含义 而今天笔者主要给大家讲解当净菜备好后 如何对净菜进行加工烹饪 让它变成有价值 有意义的美味佳肴 即数据挖掘的过
  • 好用的DNS服务器及各自特点

    1 114 114 114 114 在国内是比较出名的解析服务 因为解析速度快 同时连接三网 移动 电信 联通 横跨服务器延迟也不高 也可以满足用户需求 2 123 125 81 6 现在有很多人用360软件也会随着使用360DNS服务器
  • 大数据处理需要用到的九种编程语言

    随着大数据的热潮不断升温 几乎各个领域都有洪水倾泻般的信息涌来 面对用户成千上万的浏览记录 记录行为数据 如果就单纯的Excel来进行数据处理是远远不能满足的 但如果只用一些操作软件来分析 而不怎么如何用逻辑数据来分析的话 那也只是简单的数
  • 软件工程经济学知识点总结

    软件工程经济学知识点总结 题型 选择 20分 判断 20分 计算 20分 综合 25分 论述 15分 绪论 工程经济性 生产性工程项目的直接目的是盈利 非生产性工程项目的直接目的虽不是经济性的 但建设和运行中也必须重视成本 一切工程都具有经
  • 从C++角度讲解C#Out和ref的区别

    本文不同于以往的文章 而是透过c 和c 两种语言来讲解out和ref的区别 在C 中 out和ref都是用来传递参数的关键字 它们的主要区别在于 ref ref参数表示对变量的引用 这意味着当您将参数传递给一个使用ref参数的方法时 方法可
  • 基于Simulink的开关电源仿真设计

    基于Simulink的开关电源仿真设计 由220V单相工频交流电转变为直流电进行输出 设计由MATLAB的Simulink工具箱进行仿真实现 设计思路 输入端为220V单相工频交流电 输出端为48V直流电 48V直流电源应用广泛 如干电池
  • 编程实现木马的ActiveX启动和注入IE的启动方式

    木马的启动方式有很多种 现在比较流行的就是注册为系统服务启动 只适合Windows 2000以上的系统 或者以驱动的方式启动 不过 最近以ActiveX方式启动又比较流行了 因为它适合Windows 9x或2000以上的机器 而且杀毒软件
  • 华为交换机查看端口相关信息常用命令

    华为交换机查看端口相关信息常用命令 1 显示接口的运行状态和相关信息 display interface Ethernet brief dis int br 2 查看接口的描述信息 display interface description
  • Java 继承 (超详细)

    目录 1 什么是继承 2 在何处使用继承 3 如何使用继承 4 理解继承 4 1 子类可以继承父类的所有资源吗 4 2访问修饰符protected 5 方法重写 5 1方法的重写或方法的覆盖 Overriding 5 2必须遵守的规则 1
  • canvas小练习之渐变粒子特效

  • 【Python生存分析库scikit-survival的安装及使用教程】

    Python生存分析库scikit survival的安装及使用教程 生存分析是指在人口统计学领域中 对于以某种特定因素为背景下出现某类事件的时间进行统计分析的一种方法 在Python中 scikit survival就是一个十分实用的生存
  • 一文详解 ChatGPT:背后的技术,数据,未来发展

    文章目录 一文详解 ChatGPT ChatGPT背后的技术 基于 Transformer 的预训练语言模型 提示学习与指令精调 思维链 Chain of Thought COT 基于人类反馈的强化学习 Reinforcement Lear
  • Doris系列15- 索引

    文章目录 一 索引概述 二 案例 参考 一 索引概述 目前Doris只支持bitmap 索引 BITMAP 索引仅在单列上创建 bitmap index 位图索引 是一种快速数据结构 能够加快查询速度 语法 index 创建和修改相关语法有
  • 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 前言 内