简介
驱动需要实现一个功能:将输出信息根据重要程度分成三个级别,INFO < DEBUG < ERROR,有一个全局变量debug_level控制当前驱动允许输出信息的级别,要做到能实时修改这个debug_level,从而控制驱动输出的级别(级别>=debug_level的信息才可输出)。
代码实现
首先,在头文件test.h里定义下三种级别:
#define INFO_LEVEL 2
#define DEBUG_LEVEL 1
#define ERROR_LEVEL 0
其次,需要在C文件test.c里定义一个全局变量(如果全局变量定义在头文件里,那么凡是引用了此头文件的C文件会重复定义一次这个变量,编译会报错):
int debug_level = DEBUG_LEVEL;//赋初值
之后,在test.h里添加debug_level 全局变量的声明,并define调试输出函数:
#define INFO_LEVEL 2
#define DEBUG_LEVEL 1
#define ERROR_LEVEL 0
... ...
extern int debug_level;
#define my_dbg(level, format, ...) \
do { \
if(level <= debug_level) { \
switch(level) { \
case ERROR_LEVEL: \
printk("E: <%s, %d>: " format, __func__, __LINE__, ##__VA_ARGS__); \
break; \
case DEBUG_LEVEL: \
printk("D: <%s, %d>: " format, __func__, __LINE__, ##__VA_ARGS__); \
break; \
case INFO_LEVEL: \
printk("I: <%s, %d>: " format, __func__, __LINE__, ##__VA_ARGS__); \
break; \
} \
} \
} while(0) \
最后,实现实时控制全局输出级别:
参考以下博客,创建一个文件来控制全局变量的值,在该文件的read操作函数里,读取用户空间输入的值,然后赋给全局变量debug_level。还需针对错误的输入值进行处理。
linux驱动之debugfs使用_krokodil98的博客
使用:
C文件如果需要使用my_dbg,#include “test.h” 然后直接调用即可。
不引用.h文件直接调用会编译报错:error : implicit declararion of function 'my_dbg'
例如,在C文件中添加以下代码:
#include "test.h"
... ...
void debug_test(){
my_dbg(INFO_LEVEL, "debug_test1\n");
my_dbg(DEBUG_LEVEL, "debug_test1\n");
my_dbg(ERROR_LEVEL, "debug_test1\n");
printk("---------------------------------\n");
int temp = 10;
char test[20]="hello today! ";
my_dbg(INFO_LEVEL, "%s with param %d\n", test, temp);
my_dbg(DEBUG_LEVEL, "%s with param %d\n", test, temp);
my_dbg(ERROR_LEVEL, "%s with param %d\n", test, temp);
}
运行效果
- 输入非法数值
root@Vostro-3268:/sys/kernel/debug/ieee80211/phy3# echo 3 > debug_level
root@Vostro-3268:/sys/kernel/debug/ieee80211/phy3# sudo dmesg -c
[28183.500689] debug_level : wrong input level number 3
[28183.500691] --> ERROR_LEVEL:0
[28183.500692] --> DEBUG_LEVEL:1
[28183.500693] --> INFO_LEVEL:2
- 输入不同级别
root@Vostro-3268:/sys/kernel/debug/ieee80211/phy3# echo 0 > debug_level
root@Vostro-3268:/sys/kernel/debug/ieee80211/phy3# sudo dmesg -c
[28229.492752] debug_level : 1 -> 0
[28229.492755] --> ERROR_LEVEL:0
[28229.492756] --> DEBUG_LEVEL:1
[28229.492757] --> INFO_LEVEL:2
... ...
[28237.968524] E: <debug_test,1783>: debug_test1
[28237.968524] ---------------------------------
[28237.968525] E: <debug_test,1789>: hello today! with param 10
root@Vostro-3268:/sys/kernel/debug/ieee80211/phy3# echo 2 > debug_level
root@Vostro-3268:/sys/kernel/debug/ieee80211/phy3# sudo dmesg -c
[28275.668899] debug_level : 0 -> 2
[28275.668901] --> ERROR_LEVEL:0
[28275.668902] --> DEBUG_LEVEL:1
[28275.668903] --> INFO_LEVEL:2
... ...
[28280.544955] I: <debug_test,1781>: debug_test1
[28280.544955] D: <debug_test,1782>: debug_test1
[28280.544955] E: <debug_test,1783>: debug_test1
[28280.544956] ---------------------------------
[28280.544957] I: <debug_test,1787>: hello today! with param 10
[28280.544957] D: <debug_test,1788>: hello today! with param 10
[28280.544958] E: <debug_test,1789>: hello today! with param 10