【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

最后重启开发板生效


四、最终效果

相关文章
|
3月前
|
监控 Linux 开发者
理解Linux操作系统内核中物理设备驱动(phy driver)的功能。
综合来看,物理设备驱动在Linux系统中的作用是至关重要的,它通过与硬件设备的紧密配合,为上层应用提供稳定可靠的通信基础设施。开发一款优秀的物理设备驱动需要开发者具备深厚的硬件知识、熟练的编程技能以及对Linux内核架构的深入理解,以确保驱动程序能在不同的硬件平台和网络条件下都能提供最优的性能。
169 0
|
5月前
|
Linux 网络安全 iOS开发
SecureCRT & SecureFX 9.6.3 for macOS, Linux, Windows - 跨平台的多协议终端仿真和文件传输
SecureCRT & SecureFX 9.6.3 for macOS, Linux, Windows - 跨平台的多协议终端仿真和文件传输
1276 4
SecureCRT & SecureFX 9.6.3 for macOS, Linux, Windows - 跨平台的多协议终端仿真和文件传输
|
7月前
|
JavaScript Linux 网络安全
Termux安卓终端美化与开发实战:从下载到插件优化,小白也能玩转Linux
Termux是一款安卓平台上的开源终端模拟器,支持apt包管理、SSH连接及Python/Node.js/C++开发环境搭建,被誉为“手机上的Linux系统”。其特点包括零ROOT权限、跨平台开发和强大扩展性。本文详细介绍其安装准备、基础与高级环境配置、必备插件推荐、常见问题解决方法以及延伸学习资源,帮助用户充分利用Termux进行开发与学习。适用于Android 7+设备,原创内容转载请注明来源。
1378 77
|
12月前
|
运维 Java Linux
Linux 下命令后台运行秘籍:无惧终端断开的魔法
本文详细介绍了在 Linux 系统下使命令不受终端断开影响、持续在后台运行的多种方法及其原理。包括使用 `nohup`、`setsid`、括号括起来、作业调度和 `screen` 等技巧,帮助读者提高工作效率,确保任务不被意外中断。
365 0
Linux 下命令后台运行秘籍:无惧终端断开的魔法
|
Java Linux API
Linux设备驱动开发详解2
Linux设备驱动开发详解
151 6
|
Shell Linux API
C语言在linux环境下执行终端命令
本文介绍了在Linux环境下使用C语言执行终端命令的方法。首先,文章描述了`system()`函数,其可以直接执行shell命令并返回结果。接着介绍了更强大的`popen()`函数,它允许程序与命令行命令交互,并详细说明了如何使用此函数及其配套的`pclose()`函数。此外,还讲解了`fork()`和`exec`系列函数,前者创建新进程,后者替换当前进程执行文件。最后,对比了`system()`与`exec`系列函数的区别,并针对不同场景推荐了合适的函数选择。
|
消息中间件 算法 Unix
Linux设备驱动开发详解1
Linux设备驱动开发详解
219 5
|
NoSQL Linux C语言
嵌入式GDB调试Linux C程序或交叉编译(开发板)
【8月更文挑战第24天】本文档介绍了如何在嵌入式环境下使用GDB调试Linux C程序及进行交叉编译。调试步骤包括:编译程序时加入`-g`选项以生成调试信息;启动GDB并加载程序;设置断点;运行程序至断点;单步执行代码;查看变量值;继续执行或退出GDB。对于交叉编译,需安装对应架构的交叉编译工具链,配置编译环境,使用工具链编译程序,并将程序传输到开发板进行调试。过程中可能遇到工具链不匹配等问题,需针对性解决。
683 3
|
Ubuntu NoSQL Linux
Linux内核和驱动
Linux内核和驱动
108 2