printk的使用与理解

文章目录

  • 一、理清printk
  • 二、printk的使用
  • 三、printk的打印级别
    • 1、基本解释
    • 2、详细解释
    • 3、如何修改console_loglevel、default_message_loglevel、minimum_console_loglevel、default_console_loglevel的值
  • 四、printk的输出地方
  • 五、其它

一、理清printk

  • printk如何使用?
  • printk的级别到底是干嘛的?
  • printk除了在控制台输出还能指定其它地方输出吗?

二、printk的使用

驱动程序里经常可以看到printk,那他和常见的printf有啥区别?使用起来没有区别!printk和printf的格式可以说一模一样,比如要打印变量a的值:

//printk
printk("a = %d\n", a);//printf
printf("a = %d\n", a);

但不一样的是printk可以手动指定打印级别,指定级别时写法如下:
在字符串前面加上指定的宏,KERN_WARNING是其中的一个宏

//printk 带打印级别
printk(KERN_WARNING"a = %d\n", a);

三、printk的打印级别

1、基本解释

在这里插入图片描述
图片上可以看到KERN_WARNING的打印级别为4,相关的宏总共有8个,也就是打印级别可以分为0-7,数字越小级别越高。那有两个问题,使用printk时不指定打印级别的话它的默认级别是多少,还是说没有级别?这些级别的用处体现在哪?
回答第一个问题:使用printk时若没有明确指定打印级别,内核会在语句处理前添加默认的打印级别:“4”;
回答第二个问题:现在我们知道了,每条printk语句都有自己的打印级别,要不就是手动指定的要不就是内核添加的,当该级别小于某个阈值时,内核才会打印该信息;若该级别大于该阈值时,则不打印该信息,注意,仅仅只是不打印而已。是可以执行dmesg命令查看以前被隐藏的打印信息的。

总结:每个printk都有自己的打印级别,打印级别用来控制该语句打不打印。

2、详细解释

include/linux/printk.h中有四个宏,其介绍如下:

//include/linux/printk.h
#define console_loglevel 		 (console_printk[0])
#define default_message_loglevel (console_printk[1])
#define minimum_console_loglevel (console_printk[2])
#define default_console_loglevel (console_printk[3])

console_loglevel当printk所指定的打印级别小于console_loglevel时,信息才会被打印;
default_message_loglevel当使用printk时没有指定打印级别、内核为其使用的默认级别就是来自default_message_loglevel;
minimum_console_loglevel :是一个预设值,平时不起作用。通过其他工具来设置console_loglevel的值时,这个值不能小于minimum_console_logleve;(引用韦东山教程原话)
default_console_loglevel :也是一个预设值,平时不起作用。它表示设置console_loglevel时的默认值,通过其他工具来设置console_loglevel的值时,用到这个值;(引用韦东山教程原话)
console_printk[]数组:定义如下

//include/linux/printk.c
int console_printk[4] = {CONSOLE_LOGLEVEL_DEFAULT,	/* console_loglevel */MESSAGE_LOGLEVEL_DEFAULT,	/* default_message_loglevel */CONSOLE_LOGLEVEL_MIN,		/* minimum_console_loglevel */CONSOLE_LOGLEVEL_DEFAULT,	/* default_console_loglevel */
};

3、如何修改console_loglevel、default_message_loglevel、minimum_console_loglevel、default_console_loglevel的值

printk的打印级别我们已经知道如何指定了,就是printk语句里加入相关表示级别的宏即可,内核会判断其等级是否小于console_loglevel,小于则打印,大于等于则不打印;那又如何修改console_loglevel、default_message_loglevel、minimum_console_loglevel、default_console_loglevel呢?
回答:直接修改/proc/sys/kernel/printk文件来改变这4个值;

echo "1 4 1 7" > /proc/sys/kernel/printk

左边第一个 1 代表 console_loglevel;
左边第二个 4 代表 default_message_loglevel;
左边第三个 1 代表 minimum_console_loglevel;
左边第四个 7 代表 default_console_loglevel;
像上面这个例子,打印等级是1,默认等级是4,如果使用printk不指定打印等级的话,则使用默认等级4,4并不小于1,则该信息不会打印;

四、printk的输出地方

在设备树中的bootargs指定console即可,如下,也可指定多个console,

# 单个console
/ {chosen {bootargs = "console=ttymxc1,115200";};
};# 多个console
/ {chosen {bootargs = "console=ttymxc1,115200 console=ttymxc2";};
};

无论是在uboot时填写的bootargs还是在哪,最后都会更新在设备树; (引用他人结论,未实验)

五、其它

文章中出现的名词解释或个人理解若有误,恳请指出。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/617272.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ安装和快速入门

文章目录 1. RabbitMQ2. 安装RabbitMQ2.1 创建shell文件2.2 编写shell文件2.3 检查rabbitmq状态2.4 设置开机自启动2.5 启动插件2.6 开放端口号2.7 创建用户2.8 登入管理页面 3. SpringBoot中集成RabbitMQ3.1 依赖安装3.2 SpringBoot配置3.3 RabbitMQ的配置类3.4 定义消费者和生…

jmeter--2.常用组件以及作用域

目录 1.常用的组件以及执行顺序 2.常用的组件作用 2.1 测试计划:jmeter启动,其它组件的容器 2.2 线程组(测试片段):代表一定虚拟用户数,测试片段代表模块 2.3 配置元件:配置信息 2.4 前置处…

设计一个简易版的数据库路由

👏作者简介:大家好,我是爱吃芝士的土豆倪,24届校招生Java选手,很高兴认识大家📕系列专栏:Spring原理、JUC原理、Kafka原理、分布式技术原理、数据库技术🔥如果感觉博主的文章还不错的…

DETR tensorRT 的 C++ 部署

DETR tensorRT 的 C 部署 本篇说说DETR tensorRT 的 C 部署。 【完整代码、模型、测试图片】 1 导出 onnx 模型(建议先看) 方法1:导出DETR onnx并修改模型输出Gather层,解决tesorrt 推理输出结果全为0问题,参考【D…

数据类型、数据类型转换(Java)

一、数据类型的分类 1. byte:1字节,-128~127 2. short:2字节,-32768~32767 3. int:4字节 默认整型 4. long:8字节 注意:随便写一个整型字面量会默认是整型的,所以我们在写一个…

加速 Android Studio 依赖项下载

在某些网络环境中,访问互联网可能受到限制,在Android Studio中,项目构建时可能需要下载依赖项,如果网络受到限制,就无法下载或下载速度非常慢只有十几 kb/s ,设置可以帮助解决下载问题。 进入设置页面找到…

RK3568驱动指南|第十一篇 pinctrl 子系统-第126章 通过pinctrl状态设置引脚复用实验

瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工…

电影《艾里甫与赛乃姆》简介

电影《艾里甫与赛乃姆》由天山电影制片厂于1981年摄制,该片由傅杰执导,由买买提祖农司马依、布维古丽、阿布里米提沙迪克、努力曼阿不力孜、买买提依不拉音江、阿不都热合曼艾力等主演。 该片改编自维吾尔族民间爱情叙事长诗《艾里甫与赛乃姆》&#xf…

如何正确使用高速探头前端--probe head

目前市面上的高速有源探头种类丰富,使用灵活,如下图所示,结构多为放大器焊接前端的组合,以E2677B探头前端为例,其焊接前端电阻有三种选择,91ohm时可实现全带宽使用(12GHz)&#xff0…

互联网 HR 眼中的好简历是什么样子的?

HR浏览一份简历也就25秒左右,如果你连「好简历」都没有,怎么能找到好工作呢? 如果你不懂得如何在简历上展示自己,或者觉得怎么改简历都不出彩,那请你一定仔细读完。 互联网运营个人简历范文> 男 22 本科 AI简历…

PaddleSeg的训练与测试推理全流程(超级详细)

LeNet模型量化 参考文档一.下载项目地址:https://gitee.com/paddlepaddle/PaddleSeg/tree/release%2F2.5/特别注意下载版本: 二.paddlepaddle-gpu安装1.环境安装参考文档:https://gitee.com/paddlepaddle/PaddleSeg/blob/release/2.8/docs/in…

JetPack组件学习ViewModel

目录 ViewModel的使用 简要分析 问答 如何实现旋转屏幕数据保持不变? 和之前的Presenter有什么区别 ViewModel的使用 1.需要先创建ViewModel类,继承自ViewModel重写onclear方法,使得页面销毁的时候能够走到自定义的onClear方法中 clas…

ALIENWARE:卓越游戏体验,源自创新基因

美国拉斯维加斯当地时间1月9日,CES 2024在万众期盼中如约而至。 作为全球消费电子领域一年一度的盛宴和行业风向标,CES 2024汇聚了来自全球的众多消费电子企业以及令人目不暇接的最新科技产品,因而受到了全球广大消费者的密切关注。 众所周知…

日期类的实现|运算符重载的复用

前言 通过前面C入门与类与对象的学习,今天我们将运用所学的知识点完成一个Date类。 本节目标 运用所学知识完成Date类。详细讲解运算符各种重载。理解运算符重载的复用。 一、Date类的六个默认成员函数 六个成员函数,Date类只需要自己实现构造函数即可…

新一代工厂融合广播系统,助力工业行业可持续发展

在当今高度竞争的工业环境中,工厂的运营效率和生产安全至关重要。为了实现这一目标,新一代工厂融合广播系统应运而生,将指挥中心、值班中心、融合通信调度主机、厂区终端和防爆话机紧密连接,构建了一个全面、高效的通信网络。 系统…

Linux进程管理、ps命令、kill命令

每一个程序在运行的时候都会被操作系统注册为系统中的一个进程 补充一下操作系统的内容: 进程实体(又称进程映像):程序段、相关数据段、PCB三部分构成 进程是进程实体的运行过程,是系统进行资源分配的一个独立单位 …

团结引擎的安装

团结引擎有多种方式可以安装,具体可以参考团结引擎官方文档,这里我们使用最简单的安装方式,通过团结Hub来安装。 1. 安装 Tuanjie Hub 进入团结引擎官网,点击右上角的【下载Unity】,进入下载界面,选择“下载…

C++——冒泡排序

作用:最常用的排序算法,对数组内元素进行排序 1,比较相邻的元素,如果第一个比第二个大,就交换他们两个。 2,对每一对相邻元素做同样的工作,执行完毕后,找到第一个最大值。 3&…

JDK21和 Flowable 7.0.0

JDK21和 Flowable 7.0.0 一.Flowable二.项目搭建1.依赖包2.数据库3.资源文件1.YML配置文件2.Drools kbase3.Drools rule4.DMN 决策表5.BPMN 流文件 4.BPMN 流程图绘制插件5.测试代码1.启动类2.Flowable 配置3.Camel 配置1.Camel 配置2.Camel Router 定义 4.扩展类监听1.外部工作…

docker compose安装gitlab

环境 查看GitLab镜像 docker search gitlab 拉取GitLab镜像 docker pull gitlab/gitlab-ce 准备gitlab-docker.yml文件 version: 3.1 services:gitlab:image: gitlab/gitlab-ce:latestcontainer_name: gitlabrestart: alwaysenvironment:GITLAB_OMNIBUS_CONFIG: |external_url…