- 博客(17)
- 收藏
- 关注
原创 (1)GPIO子系统-----命令行控制 GPIO
本教程针对(正极接 VCC,负极接 GPIO1_IO03),详细讲解命令行控制方法,适配 i.MX6ULL 开发板的 GPIO 操作逻辑。
2025-11-30 15:21:13
896
原创 (10)Linux字符设备驱动基础:杂项设备驱动
杂项设备是 Linux 内核中一类特殊的字符设备,统一使用主设备号10MISC_MAJOR),每个杂项设备分配唯一的次设备号。简化开发:内核提供杂项设备框架,自动处理设备号申请、设备节点创建等流程;统一管理:所有杂项设备挂载在/dev/misc目录下(或直接在/dev下生成设备文件);轻量级:适用于功能单一的设备(如 LED、蜂鸣器、简单传感器),无需复杂的文件操作集。首先定义miscdevice.minor = MISC_DYNAMIC_MINOR, // 自动分配次设备号。
2025-11-28 12:09:47
426
原创 (9)Linux字符设备驱动基础:文件集操作、内核空间与用户空间数据交换与文件私有数据
字符设备驱动是 Linux 驱动开发的基础,本文将基于完整的字符设备驱动代码,讲解等核心知识点,帮助开发者掌握字符设备驱动的开发流程与关键技术。
2025-11-27 12:27:32
887
原创 (8)Linux 字符设备驱动基础:从设备号到 cdev 注册(自动创建设备节点)
在 Linux 字符设备驱动开发中,手动通过mknod命令创建设备节点的方式虽直观,但在实际场景中不够便捷 —— 每次加载驱动都需手动执行创建命令,且卸载后需手动清理设备文件。更高效的方式是通过内核提供的和函数,实现设备节点的,核心依赖udev系统(Linux 主流发行版默认内置)的热插拔事件机制。本文将详细讲解 “设备号注册 → cdev 绑定 → 自动创建设备节点” 的完整流程,无需手动干预,驱动加载时自动在/dev目录下生成设备文件,卸载时自动清理,符合实际驱动开发规范。
2025-11-26 18:13:20
626
原创 (7)Linux 字符设备驱动基础:从设备号到 cdev 注册(手动创建设备节点)
在 Linux 字符设备驱动开发中,)只是第一步,要让驱动真正响应用户空间的读写操作,还需将设备号与驱动的核心操作函数(openreadwrite等)绑定 —— 这就需要cdev结构体(字符设备描述符)的支持。本篇教程将基于上一节的代码,补充cdev_init和cdev_add核心步骤,完整实现字符设备的注册流程,并详细讲解每个环节的原理和用法。
2025-11-26 16:12:54
686
原创 (6)Linux 字符设备驱动基础:主次设备号详解
设备号是一个 32 位的无符号整数(dev_t主设备号 (Major Number)作用:用来标识驱动程序。也就是说,一个主设备号对应一个驱动。例如,所有串口终端(/dev/ttyS*)都共享同一个主设备号(通常是 4),因为它们由同一个串口驱动程序管理。范围:高 12 位,因此理论上最大可以有个不同的主设备号。次设备号 (Minor Number)作用:用来标识同一个驱动程序所管理的具体设备实例。例如,/dev/ttyS0和/dev/ttyS1。
2025-11-26 15:18:42
917
原创 (5)Linux内核模块卸载过程(基于内核源码的解析)
内核模块卸载是 “校验 - 清理 - 回收” 的闭环:4.校验层:确保模块无依赖、无引用、状态合法;5.清理层:执行模块自定义卸载逻辑 + 内核自动资源清理;6.回收层:释放内存、移除模块控制结构,彻底脱离内核管理。
2025-11-25 11:11:00
862
原创 (4)Linux内核模块加载过程(基于内核源码的浅析)
符号重定位完成后,模块的代码已能正常运行,此时调用从中获取模块通过注册的初始化函数地址(该地址已通过重定位修正为最终运行地址);调用该初始化函数:初始化函数通常会完成设备注册(如)、中断申请()、创建/proc/sys节点等核心工作;初始化函数返回值检查:返回 0 表示初始化成功,返回非零则加载失败,内核会释放已分配的所有资源。内存分配逻辑:模块加载过程涉及两次内存分配 —— 第一次是在 vmalloc 区分配临时内存存储 .ko 数据,第二次是为 core 段和 init 段分配最终运行内存;
2025-11-25 11:05:00
773
原创 (3)内核模块间交互-内核模块符号导出
将符号sym(函数名或变量名)导出到内核全局符号表,所有内核模块(无论许可协议)均可访问。:仅将符号sym导出给遵循 GPL(或兼容 GPL)许可协议的模块,非 GPL 模块调用会导致内核拒绝加载(触发taint标记,提示许可不兼容)。两者的本质:编译时将符号的「名称 - 地址映射」写入模块的.symtab(符号表)和.modinfo(模块信息)段;模块加载时,内核将这些映射添加到全局符号表(kallsyms),供其他模块通过符号名查询地址并调用。
2025-11-24 22:52:34
758
原创 (2)Linux内核驱动模块传参实现
摘要: Linux内核驱动开发中,模块传参机制允许动态配置驱动行为而无需重新编译。通过module_param等宏定义参数(整数、字符串、布尔值等),用户可在加载模块时传递参数值(如gpio_pin=10)。典型应用包括硬件配置(GPIO引脚、波特率)、功能开关(调试日志)和兼容性适配。参数通过sysfs文件系统(/sys/module/<模块名>/parameters/)提供运行时查看/修改能力,权限由perm参数控制。该机制显著提升驱动模块的灵活性和复用性。
2025-11-24 19:10:37
538
原创 (1)一个最简单的内核驱动模块(hello world)
本文详细介绍了如何编写和运行一个简单的Linux内核"Hello World"驱动模块。主要内容包括:1)环境准备,安装必要的工具链和内核头文件;2)驱动代码编写,解析模块初始化、退出函数及关键宏定义;3)Makefile编写,说明内核模块编译的特殊性;4)模块加载、卸载操作及日志查看方法。通过这个基础示例,读者可以了解Linux内核驱动开发的基本流程和核心概念,包括内核态编程特点、模块加载机制和内核日志系统等。文章采用逐步讲解的方式,适合内核驱动开发初学者入门学习。
2025-11-24 16:25:38
945
原创 通讯录管理系统C++版
功能:编写一个通讯录系统包含手机通讯录和手机卡通讯录,实现对通讯录的添加、修改、删除、浏览、查找、以及通讯录的清空。总体描述:通讯录管理系统:模块:包括添加、修改、删除、浏览、查抄联系人以及通讯录的清空1.手机联系人类2.手机卡联系人类,继承于手机联系人3.通讯录抽象类4.手机通讯录类,继承于通讯簿类5.手机卡通讯录类,继承于通讯簿类6.菜单类程序详细设计与说明:手机联系人类: 表示一个手机联系人class PhoneContact//手机联系人类{protected://数据成
2022-07-09 23:11:28
3112
6
原创 【DFT/FFT存在的问题---栅栏效应的解决手段】
说到栅栏效应就要提到两个分辨率,一个是物理分辨率,另外一个是计算分辨率。假设对一个信号以采样率fs进行采样,采样M个点,做N点FFT变换(N≥M),那么对应的物理分辨率为fs/M,计算分辨率为fs/N,其中物理分辨率是首要解决问题,如果不解决物理分辨率,即使计算分辨率再高计算得到的结果也是错的。.....................
2022-07-09 22:52:42
2623
2
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅