有关内核中printk的相关知识

1260阅读 0评论2011-08-19 songtao0728
分类:LINUX

以下的实现是在/opt/FrienldyARM/mini2440/linux-2.6.32.2(友善提供的)内核下编译开发.
 
相关知识点:
 
对printk打印优先级的定义是在/linux-2.6.23.2/include/linux/kernel.h中,截图如下:
         
 
对printk默认优先级的宏定义是在/linux-2.6.32.2/kernel/printk.c中,截图如下:
           
 
printk打印中几个关于调试用的宏定义:
 
(下面的__在这里是两个_ ,这个宏可以在内核和用户空间使用.)
 
__FILE__ : 表示源代码文件,以绝对路径的方式出现.(注意这里是绝对路径) 对应字符串类型(%s)
__LINE__: 表示这行printk允许在这个源代码文件中的第几行,这是一个很好的给出调测点位置的信息.(%d)
__FUNCTION__: 表示在那个函数之中,也是比较好的定位方式.(%s)
__STDC__: 通常为1,表示为标准的ANSI C.(%d)
__DATE__:
__TIME__: 这两个是非常常用的.不过有时我们需要使用msec,这种情况下只好自己写了.(%s)
 
下附程序进行验证说明:
         
 
编译下载到mini2440开发板,加载模块和卸载模块结果如下:
        
 
另外经常在调试打印的时候见到下面的打印宏定义:
 #define DEBUG_SWITCH 0

5 #if DEBUG_SWITCH

6         #define P_DEBUG(fmt, args...) printk("<1>" "[%s]"fmt, __FUNCTION__, ##args)

7 #else

8         #define P_DEBUG(fmt, args...) printk("<7>" "[%s]"fmt, __FUNCTION__, ##args)

9 #endif

 
现只针对args...和##args作解释,其它不作解释:
 
args...
    GCC编译器中的CPP预编译器,是支持这种写法的,args... 比 args,...的写法可读性较好.
      其含义为:应该是P_DEBUG的参数,第一个传给fmt,第二个开始传给args...可为多个.

##args
     其含义就是把args...中的多个参数串联起来.
上一篇:LED非典型应用—感光测试
下一篇:linux随身小笔记