一、开始效果
示例代码:
#include <linux/module.h> #include <linux/printk.h> static int __init gec6818led_init(void) { printk("gec6818led_init\n"); return 0; } static void __exit gec6818led_exit(void) { printk("gec6818led_exit\n"); } module_init(gec6818led_init); module_exit(gec6818led_exit); MODULE_AUTHOR("gec.xsc"); MODULE_DESCRIPTION("GEC6818 Led Driver"); MODULE_LICENSE("GPL");
将此代码make后,生成的.ko文件下载到开发板中,执行insmod命令后无法输出显示调试效果。
二、原因
为了保证开发板程序在运行时,能够正常打印输出的信息,那么,要保证程序中设置输入的等级在高于控制台输出信息的等级。
当前开发板控制台输出信息的等级如下:
[root@GEC6818 /proc/sys/kernel]#cat printk
7 7 1 7
内核源码中的等级如下:
1 #define KERN_EMERG "<0>" /* system is unusable */ 2 #define KERN_ALERT "<1>" /* action must be taken immediately */ 3 #define KERN_CRIT "<2>" /* critical conditions */ 4 #define KERN_ERR "<3>" /* error conditions */ 5 #define KERN_WARNING "<4>" /* warning conditions */ 6 #define KERN_NOTICE "<5>" /* normal but significant condition */ 7 #define KERN_INFO "<6>" /* informational */ 8 #define KERN_DEBUG "<7>" /* debug‐level messages */
数字越大,等级越低
目前内核源码中的等级设置如下
int console_printk[4] = { DEFAULT_CONSOLE_LOGLEVEL, /* console_loglevel */ ‐‐‐>7 DEFAULT_MESSAGE_LOGLEVEL, /* default_message_loglevel */‐‐> 7 MINIMUM_CONSOLE_LOGLEVEL, /* minimum_console_loglevel */ ‐‐‐>1 DEFAULT_CONSOLE_LOGLEVEL, /* default_console_loglevel */‐‐‐>7 }; #define DEFAULT_CONSOLE_LOGLEVEL 7 /* anything MORE serious than KERN_DEBUG */ /* printk's without a loglevel use this.. */‐‐‐>如果printk函数没有设置日志等级, 则使用该等级 #define DEFAULT_MESSAGE_LOGLEVEL CONFIG_DEFAULT_MESSAGE_LOGLEVEL CONFIG_DEFAULT_MESSAGE_LOGLEVEL‐‐‐‐>他们是内核进行配置时,可以进行重新配置
三、解决方法
方法一:
在写程序时,给printk函数设置一个日志等级,具体使用如下:
printk(KERN_WARNING "%s: Open Error,retrying at different ringspeed\n", dev‐>name);
方法二:(不推荐)
重写进行内核配置默认的日志等级
CONFIG_DEFAULT_
方法三:
还可以直接在开发板上,重新设置printk等级,将它写入到配置文件(/etc/profile)中
echo 7 4 1 7 > /proc/sys/kernel/printk
最后重启开发板生效
四、最终效果