【GEC6818开发板】Linux驱动中printk无法在终端输出显示

简介: 【GEC6818开发板】Linux驱动中printk无法在终端输出显示

一、开始效果

示例代码

#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

最后重启开发板生效


四、最终效果

相关文章
|
2月前
|
运维 Java Linux
Linux 下命令后台运行秘籍:无惧终端断开的魔法
本文详细介绍了在 Linux 系统下使命令不受终端断开影响、持续在后台运行的多种方法及其原理。包括使用 `nohup`、`setsid`、括号括起来、作业调度和 `screen` 等技巧,帮助读者提高工作效率,确保任务不被意外中断。
73 0
Linux 下命令后台运行秘籍:无惧终端断开的魔法
|
3月前
|
Shell Linux API
C语言在linux环境下执行终端命令
本文介绍了在Linux环境下使用C语言执行终端命令的方法。首先,文章描述了`system()`函数,其可以直接执行shell命令并返回结果。接着介绍了更强大的`popen()`函数,它允许程序与命令行命令交互,并详细说明了如何使用此函数及其配套的`pclose()`函数。此外,还讲解了`fork()`和`exec`系列函数,前者创建新进程,后者替换当前进程执行文件。最后,对比了`system()`与`exec`系列函数的区别,并针对不同场景推荐了合适的函数选择。
|
4月前
|
Java Linux API
Linux设备驱动开发详解2
Linux设备驱动开发详解
54 6
|
4月前
|
消息中间件 算法 Unix
Linux设备驱动开发详解1
Linux设备驱动开发详解
60 5
|
4月前
|
NoSQL Linux C语言
嵌入式GDB调试Linux C程序或交叉编译(开发板)
【8月更文挑战第24天】本文档介绍了如何在嵌入式环境下使用GDB调试Linux C程序及进行交叉编译。调试步骤包括:编译程序时加入`-g`选项以生成调试信息;启动GDB并加载程序;设置断点;运行程序至断点;单步执行代码;查看变量值;继续执行或退出GDB。对于交叉编译,需安装对应架构的交叉编译工具链,配置编译环境,使用工具链编译程序,并将程序传输到开发板进行调试。过程中可能遇到工具链不匹配等问题,需针对性解决。
132 3
|
4月前
|
Ubuntu NoSQL Linux
Linux内核和驱动
Linux内核和驱动
35 2
|
4月前
|
存储 安全 Linux
|
4月前
|
数据采集 Linux
Linux源码阅读笔记20-PCI设备驱动详解
Linux源码阅读笔记20-PCI设备驱动详解
|
5月前
|
存储 JSON Linux
|
5月前
|
Oracle 关系型数据库 Linux
讲解linux下的Qt如何编译oracle的驱动库libqsqloci.so
通过这一连串的步骤,可以专业且有效地在Linux下为Qt编译Oracle驱动库 `libqsqloci.so`,使得Qt应用能够通过OCI与Oracle数据库进行交互。这些步骤适用于具备一定Linux和Qt经验的开发者,并且能够为需要使用Qt开发数据库应用的专业人士提供指导。
177 1
讲解linux下的Qt如何编译oracle的驱动库libqsqloci.so