系列文章目录
- linux内核模块开发
- 字符设备驱动
- 内核中并发和竞态的解决方法
- IO模型
- 设备树
- GPIO子系统,内核定时器
- 中断子系统
- platform总线驱动
- i2c总线驱动
- spi总线驱动
- 块设备驱动
- 网卡设备驱动
- camera驱动
一、printk的语法格式
在linux内核中的打印函数是printk,用法如下:
printk(打印级别 "打印信息");
或
printk("打印信息");
二、printk的打印级别
1.级别
#define KERN_EMERG "0" /* system is unusable */
#define KERN_ALERT "1" /* action must be taken immediately */
#define KERN_CRIT "2" /* critical conditions */
#define KERN_ERR "3" /* error conditions */
#define KERN_WARNING "4" /* warning conditions */
#define KERN_NOTICE "5" /* normal but significant condition */
#define KERN_INFO "6" /* informational */
#define KERN_DEBUG "7" /* debug-level messages */
在linux内核中将打印的信息分为8个级别,分别是0-7。数值越小级别越高。内核中的打印级别就是起到过滤信息的作用
2.printk使用案例
代码如下(示例):
#include <linux/init.h>
#include <linux/module.h>
static int __init mycdev_init(void)
{
//1.打印级别是3,大于终端的4级别,消息应该会在终端上回显
printk(KERN_ERR "hello DC22021 everyone!\n");
//2使用的默认消息级别是4,终端级别也是4,所以消息不会在终端上回显
printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);
return 0;
}
static void __exit mycdev_exit(void)
{
//1.打印级别是3,大于终端的4级别,消息应该会在终端上回显
printk(KERN_ERR "bye DC22021 everyone!\n");
//2使用的默认消息级别是4,终端级别也是4,所以消息不会在终端上回显
printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);
}
module_init(mycdev_init);
module_exit(mycdev_exit);
MODULE_LICENSE("GPL");
需要在ubuntu中打开虚拟终端,
打开:ctrl+alt+(fn)+{F2 ~ F6} ===>用户名:linux 密码:xxx
安装卸载驱动看现象:
在init和exit中只显示了第一句话
退出:ctrl+alt+(fn)+F1
注:修改默认消息级别的方法如下:
su root
echo 4 3 1 7 > /proc/sys/kernel/printk
如果需要修改开发板的默认消息级别,可以在rcS脚本中写上
/home/linux/nfs/rootfs/etc/init.d/rcS
echo 4 3 1 7 > /proc/sys/kernel/printk
dmesg //主动查看内核中的所有的打印信息(如果消息级别高于终端级别,颜色是红色的)
sudo dmesg -c/-C //清空内核的打印信息
注:-c:先回显后清除 -C :直接清除