第30课 驱动调试

[嵌入式开发模块]SHT30/20 温湿度传感器 驱动模块 本文给出我自己为SHT30/20写的驱动模块 阅读详情

第30课 驱动调试

  1. 打印:printk,自制proc文件
  2. 自制工具
  3. 根据内核打印的段错误信息分析
  4. 修改内核

第1.1节 驱动调试之printk原理

在这里插入图片描述

1. 内核处理uboot传入的参数:

使用printk将内核的一些信息打印出来(通过串口或者LCD屏幕),那么printk函数中就必然会有操作这些硬件的实现。但是printk最终会将信息打印到哪里呢?(串口或者LCD)这是由uboot中的 bootargs 参数设置的,比如:“set bootargs console=ttySAC0” 就是将打印信息输出至串口0。
在这里插入图片描述
为了弄明白printk是如何根据bootargs命令行参数找到对应的硬件操作函数的,现在在内核中搜索“console=”
但是这样搜索的效率太低,有个小技巧:在任意位置写出“console=”,然后右键—>查找引用(lookup Reference):
在这里插入图片描述
在这里插入图片描述
这时已经找到了我们想要的结果。
在这里插入图片描述
这里可以做以下猜测:当内核从bootargs命令行得到“console=”前缀参数的时候,就利用后面的console_setup函数来处理该前缀。
进入到console_setup函数中:
在这里插入图片描述
这里的str就是“console=”前缀后面带的字符串“ttySAC0”
UBOOT传入console=ttySAC0 console=tty1
在这里插入图片描述
问:怎么根据 ttySAC0 这个参数找到对应的硬件操作函数??
在这里插入图片描述

2. console硬件对应的驱动程序:

硬件的驱动程序中都会注册一个console结构体,该console结构体中会有相应的名字(.name)和相应的write函数(负责发送信息到相应的控制台终端)。

通过 register_console 注册控制台来使用具体的硬件。

注册函数register_console中会比较属于某个硬件(串口、LCD)的结构体中的名字(name属性)和console_setup 函数中接收到的来自bootargs命令行传来的那个名字(如,ttySAC0),如果一样,则在调用printk打印时就用对应硬件结构体中的write函数进行信息的输出。
在这里插入图片描述
在内核中搜索register_console 函数找到s3c对应的文件:
在这里插入图片描述
这里可以看到向内核注册了console结构体:
在这里插入图片描述

3. printk的具体实现:

这里可以猜测,printk就是通过调用console结构体中的write函数来进行输出的。
在这里插入图片描述
这里的 log_buf 是什么?—其实是一个字符数组(指向数组的指针)
在这里插入图片描述
在放入log_buf之前还要对其中的数据稍作处理:
-----在打印数据之前,要对数据的级别做处理:-----打印级别
在这里插入图片描述
在这里插入图片描述
处理完了之后就会将数据放入log_buf中。

问:既然这些信息在内核中有,那我们能否复现其中的信息??

-----通过 “dmesg” 命令即可将 log_buf 中的数据信息取出来再打印在显示终端上。
在这里插入图片描述
在这里插入图片描述
注意:这里可以通过设置bootargs参数将信息同时打印在串口和LCD上:在这里插入图片描述
call_console_drivers 函数中会根据log_buf中数据的级别来选择要打印的数据。(log_buf中有所有的打印数据,不管级别是多少;但是这些数据是否打印就要根据级别来选择了)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结:

在这里插入图片描述

第1.2节 驱动调试之printk使用

实验:

在之前的first_drv.c 点灯驱动程序中人为设置一个错误:
在这里插入图片描述
在使用寄存器的时候没有用ioremap,而是直接使用物理地址。

编译,装载之后出错:
在这里插入图片描述
这时候用printk 来找错误:
先分析:
在这里插入图片描述
应用程序调用到open函数,就会进入到内核的驱动程序中:
在这里插入图片描述
在内核驱动程序的open函数中加打印语句:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在实际操作过程中,可以用折半加打印的方式进行。

重新编译,装载驱动:
在这里插入图片描述
接下来运行应用程序(test测试程序):
在这里插入图片描述
看到打印出了26行。

在这里插入图片描述
程序死的原因就是访问了非法地址,这时就可以轻松定位到出错的地方了。

下面加入打印级别:

给所有的printk加入打印级别:
在这里插入图片描述
从之前分析printk的原理中知道,消息的打印级别必须小于某个数值才能被打印:

在这里插入图片描述
我们自己的printk打印级别设置为了“7”:
在这里插入图片描述
可以看到装载和卸载过程都没有打印信息:
在这里插入图片描述
这是因为我们自己设置的打印级别并不满足打印条件:

msg_log_level < console_loglevel

问:那我们能不能自己设置打印条件的上限console_loglevel呢??

在这里插入图片描述
在这里插入图片描述
可以看到这里的console_loglevel被设置为了“7”,因此我们的打印信息不会被打印出来。

修改这个文件后发现打印信息出来了:

在这里插入图片描述

第1.3节 驱动调试之打印到proc虚拟文件

“dmesg” 命令可以在启动内核后复现之前打印过的内核信息。

但是该命令肯定是从一个文件中读取了内核打印信息-----就是下图中的这个文件:
在这里插入图片描述

linux驱动之调试技巧--- 应用程序远程gdb+vscode调试应用程序, 串口kgdboc调试.ko驱动程序 gdb+vscode图形化调试模式 串口kgdboc调试.ko模块的结合联动调试 阅读详情

相关推荐

Android Studio真机调试HUAWEI Mate 30全流程解析

本文详细解析了使用Android Studio对HUAWEI Mate 30进行真机调试的全流程。从硬件准备、驱动安装、开启开发者选项与USB调试,到连接验证、应用运行及常见问题排查,提供了完整的实战指南。重点解决了华为HarmonyOS设备连接中的驱动与授权等关键步骤,帮助开发者高效完成真机调试。

Jerry的专栏 915

IAR许可证Generation 18代际不匹配问题解析与解决

IAR Embedded Workbench 的许可证机制采用‘代际(Generation)’模型,而非简单版本号匹配——这是一种基于数字签名算法、加密协议和硬件绑定策略演进的授权安全体系。Generation 18 是 v9.30 及以上版本强制要求的许可代际标准,对应 ECDSA 签名与增强型硬件指纹校验,旨在提升防破解能力与平台适配性。当旧版许可证(如 Generation 16/17)被用于新 IDE 时,启动器会在本地完成代际校验并直接拦截,导致‘The generation feature is

weixin_34203832的博客 345

块坐标下降法实战:如何用Python一步步优化无人机通信网络?

本文通过Python实战案例,详细介绍了块坐标下降法在优化无人机通信网络中的应用。文章以最大化网络吞吐量为目标,将复杂的非凸问题拆解为功率分配和轨迹规划两个子问题,并提供了完整的算法实现、代码示例及调参指南,为机器学习工程师解决类似优化问题提供了实用参考。

sat99的博客 975

MFRC522防冲突机制详解:当两张IC卡同时靠近读写器,会发生什么?

本文深入解析了MFRC522芯片在多张IC卡同时靠近RFID读写器时的防冲突机制,重点介绍了二叉树搜索算法在比特级的实现原理。通过详细的寄存器配置优化和实际工程案例,展示了如何有效解决信号碰撞问题,提升多卡场景下的读写性能。

weixin_29191669的博客 429

遗传算法解整数规划IntCon

x = ga(fun,nvars,A,b,[],[],lb,ub,nonlcon,IntCon) IntCon就是代表整数的参量,描述的是哪几个自变量是0-1整数变量。比如navrs设置有4个变量,设置IntCon为[2 3],代表第2和第3个变量是整数。 再比如设置IntCon=2:2:nvars,代表偶数项的变量是整数。 值得注意的是一旦设置了非空的IntCon,则Aeqandbeqmust be an empty entry ([]), andnonlconmust re...

jianti9962的博客 9220

ESP32-S3驱动PCA9685模块:I2C扩展16路舵机控制实战指南

本文提供了ESP32-S3通过I2C总线驱动PCA9685模块扩展16路PWM输出的完整实战指南。详细解析了PCA9685模块原理、硬件连接、I2C地址配置,并给出了核心驱动代码与角度控制函数,帮助开发者解决微控制器PWM引脚不足的问题,轻松实现多路舵机控制。

weixin_32005771的博客 522

笔试题-2023-思特威-数字电路设计(CIS)【纯净题目版】

10 笔试题-2023-思特威-数字电路设计(CIS)【纯净题目版】

w0shishabi的博客 1472

SI案例分享--PCB通孔互连新技术的应用(VeCS)

本文介绍了VeCS的物理结构和制造过程,并通过全波仿真模拟和测量,分析了VeCS的电性能,并与传统的测量方法进行了比较。结果表明,由于有一个连续的参考平面,VeCS的TDR阻抗可以很容易地控制到目标阻抗,同时可以大大减轻信道上的串扰,的确是一种性能不错的PCB互连创新设计方案。

一只豌豆象的博客 2116

SAP 实施:Waterfall vs. Agile —— 一场“结构性矛盾“的深刻比较先说结论:在 SAP 世界里,这从来不是“谁更好“的宗教问题,而是“你的项目 DNA 是什么“的战略选择。​

SAP 实施:Waterfall vs. Agile —— 一场"结构性矛盾"的深刻比较 先说结论:在 SAP 世界里,这从来不是"谁更好"的宗教问题,而是"你的项目 DNA 是什么"的战略选择。​ SAP 早已用 SAP Activate​ 给出了官方态度——它不是纯 Agile,也不是回头去搞旧 Waterfall,而是一个带质量门的混合架构。 1. 先回到本质:两者解决的是不同维度的风险 维度 Waterfall(传统 ASAP 路线)​ Agile(SCRUM/Kanban 式迭代)​

金牌架构师 336

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

上一篇: 第28课 hotplug/uevent机制
下一篇: 毕业班第2课移植最新UBOOT
北海的星辰大海
博客等级 码龄13年 101粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值