• 五、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进程了,否则系统检测不到串口调试终端,会反复创建进程也会带来问题。

  • 相关阅读:
    洛谷P3275 [SCOI2011]糖果
    2018年12月30&31日
    洛谷P4114 Qtree1
    洛谷P4116 Qtree3
    洛谷P4315 月下“毛景树”
    洛谷P1505 [国家集训队]旅游
    洛谷P2253 好一个一中腰鼓!
    CF616D Longest k-Good Segment
    洛谷P3979 遥远的国度
    洛谷P2486 [SDOI2011]染色
  • 原文地址:https://www.cnblogs.com/timemachine213/p/12862636.html
Copyright © 2020-2023  润新知