嵌入式LINUX驱动学习之1.linux 内核打印函数printk

一、函数有头文件

  路径:/opt/kernel/include/linux/printk.h
  头文件包含:#include <linux/printk>
                       *注:一般其它头文件已包含了当前头文件,编写代码时可以不用写*

二、定义的关键宏

#define KERN_EMERG      "<0>"    //系统崩溃事件
#define KERN_ALERT      "<1>"    //事件需要立即处理
#define KERN_CRIT       "<2>"    //重要事件
#define KERN_ERR        "<3>"    //错误事件
#define KERN_WARNING    "<4>"    //警告事件
#define KERN_NOTICE     "<5>"    //正常的重要事件
#define KERN_INFO       "<6>"    //信息
#define KERN_DEBUG      "<7>"    //debug消息。
#define KERN_DEFAULT    "<d>"    //系统内核默认日志级别

三、函数原型

int printk(const char *fmt, ...);
//功能:内核打印函数,使用方式和printf类似,
//      都是采用可变长参数列表

四、函数使用(上位编写)

新建源文件:printk_test.c

//vim printk_test.c
include <linux/init.h>
#include <linux/module.h>
static int printk_init(void){
    
    
    printk("装载模块:%s\n",__func__);
    printk(KERN_EMERG "系统崩溃\n");
    printk(KERN_ALERT "事件需要处理\n");
    printk(KERN_CRIT "严重\n");
    printk(KERN_ERR "错误\n");
    printk(KERN_WARNING "警告\n");
    printk(KERN_NOTICE "正常事件\n");
    printk(KERN_INFO "提示信息\n");
    printk(KERN_DEBUG "调试\n");
    return 0;
}
static void printk_exit(void){
    
    
    printk("卸载模块:%s\n",__func__);
    printk("<0>" "系统崩溃\n");
    printk("<1>" "事件需要处理\n");
    printk("<2>" "严重\n");
    printk("<3>" "错误\n");
    printk("<4>" "警告\n");
    printk("<5>" "正常事件\n");
    printk("<6>" "提示信息\n");
    printk("<7>" "调试\n");
}
module_init(printk_init);
module_exit(printk_exit);
MODULE_LICENSE("GPL");

新建Makefile文件

# vim Makefile
obj-m += p_test.o
all:
        make -C /opt/kernel SUBDIRS=$(PWD) modules
clean:
        make -C /opt/kernel SUBDIRS=$(PWD) clean
# 目录 /opt/kernel  为开发板对应内核源码    

五、编译下载(上位机操作)

make   //生成printk_test.ko文件
cp /printk_test.ko /nfs_server/drivers/test //nfs_server为根文件系统目录

六、修改下位机linux打印内核信息环境

echo 8 > /proc/sys/kernel/printk  //表示打印内核消息级别小于8即:0~7。

还可以在内核 源代码中进行修改:

//  cd /opt/kernrl
//  vim kernel/printk.c
#define DEFAULT_CONSOLE_LOGLEVEL 8 /* anything MORE serious than KERN_DEBUG */
//  :wq   修改后保存退出
//  make uImage    重新编译内核 ,编译完成后,生成文件在:arch/arm/boot/uImage
//烧写uImage到SD卡 / EMMC /  网络挂载点  /  ......

七、装载模块 / 卸载模块测试

/drivers/test # echo 8 > /proc/sys/kernel/printk    //以下打印级别为0~7
/drivers/test # insmod printk_test.ko 
[ 2284.699000] 装载模块:printk_init
[ 2284.699000] 打印级别:<7>
[ 2284.700000] 系统崩溃
[ 2284.701000] 事件需要处理
[ 2284.703000] 严重
[ 2284.704000] 错误
[ 2284.705000] 警告
[ 2284.706000] 正常事件
[ 2284.707000] 提示信息
[ 2284.711000] 调试
/drivers/test # rmmod p_test.ko 
[ 2315.846000] 卸载模块:printk_exit
[ 2315.846000] 系统崩溃
[ 2315.847000] 事件需要处理
[ 2315.848000] 严重
[ 2315.849000] 错误
[ 2315.850000] 警告
[ 2315.851000] 正常事件
[ 2315.852000] 提示信息
[ 2315.853000] 调试
/drivers/test # echo 3 >/proc/sys/kernel/printk  //以下打印级别为0~3
/drivers/test # insmod p_test.ko 
[ 2336.840000] 系统崩溃
[ 2336.840000] 事件需要处理
[ 2336.840000] 严重
/drivers/test # rmmod p_test.ko 
[ 2339.333000] 系统崩溃
[ 2339.333000] 事件需要处理
[ 2339.333000] 严重

猜你喜欢

转载自blog.csdn.net/weixin_47273317/article/details/107708362