zoukankan      html  css  js  c++  java
  • 五、prink的使用以及console控制日志输出级别

           事情描述:前段时间做项目,遇到了一个比较奇怪的问题,应用层下发的数据,经过驱动使用SPI发送到打印头上,数据出现被拉宽的现象。刚开始是怀疑应用层给的数据不及时导致数据输出受到延迟,后来放开串口调试,发现一按下打印,大量通过SPI输出数据的时候,会不断打印调试的语句,如果把调试语句去掉,打印就正常了,所以初步判断是大量调用printk导致代码执行的效率变差(因为我们打印头输出数据有严格要求1ms给一次数据)。

    kernel/printk/printk.c文件开头定义了一些日志级别,如下:

    int console_printk[4] = {
      CONSOLE_LOGLEVEL_DEFAULT, /* console_loglevel */
      MESSAGE_LOGLEVEL_DEFAULT, /* default_message_loglevel *
      CONSOLE_LOGLEVEL_MIN, /* minimum_console_loglevel */
      CONSOLE_LOGLEVEL_DEFAULT, /* default_console_loglevel */
    };

    第一个是默认的控制终端日志输出级别,等级为7(数字越小,等级越高),printk在调用的时候,会有一个指定的参数,这个参数就是这条printk语句要输出的日志的级别,这个级别要和CONSOLE_LOGLEVEL_DEFAULT这个级别做比较,如果printk在传入的日志级别比这个等级低的话,调试时候就看不到这条语句输出。

    第二个是日志消息默认的等级,在调用printk的时候,如果不指定默认的消息级别的话,printk就使用默认的等级,这个等级一般是在板级的配置文件中进行指定,通过make menuconfig可以修改,也可以直接打开板级文件进行修改,这个值在配置文件中一般为4,等级比控制台输出的日志要高,所以这也就是为什么我们在调用printk时候即使不指定级别,仍然能输出调试语句的原因。建议在配置系统的时候,把这个值改为7,然后自己在调试过程中调用printk语句时候,指定一个比等级7高的级别,这样可以控制日志的输出。也有另一中做法是,改内核的控制台日志输出级别为4,做法和前一做法相反,不过一般不推荐直接改系统内核。

    printk语句的执行效率是比较低的,具体可以从代码实现中看出来,内核针对printk,维护了一个循环缓冲区,不断的往缓冲区中填充数据,即使消息等级没有达到在控制台上输出的条件,但是也会不断去刷新这个缓冲区,因此在产品发布时候,不管调试语句有没有输出来,最好是将所有的printk语句给注释掉,以免引起其他代码效率上的问题。

    拓展:产品发布时候,我们一般都不会希望用户可以通过串口进入我们的系统后台,因此会主动把调试串口给关掉,在内核编译配置文件中CONFIG_SERIAL_IMX_CONSOLE=y

    将这行代码注释掉即可。同时修改根文件系统etc/inittable文件,不要创建/bin/sh进程了,否则系统检测不到串口调试终端,会反复创建进程也会带来问题。

  • 相关阅读:
    图片上传-下载-删除等图片管理的若干经验总结3-单一业务场景的完整解决方案
    图片上传-下载-删除等图片管理的若干经验总结2
    HDU 1195 Open the Lock
    HDU 1690 Bus System
    HDU 2647 Reward
    HDU 2680 Choose the best route
    HDU 1596 find the safest road
    POJ 1904 King's Quest
    CDOJ 889 Battle for Silver
    CDOJ 888 Absurdistan Roads
  • 原文地址:https://www.cnblogs.com/timemachine213/p/12862636.html
Copyright © 2011-2022 走看看