- 博客(29)
- 收藏
- 关注
原创 Linux驱动程序开发--内核空间与用户空间数据交互
本文探讨了Linux内核空间与用户空间的数据交换机制。通过字符设备驱动实验,实现了copy_from_user()和copy_to_user()函数完成内核与用户空间的数据传输。实验构建了包含open、read、write等操作的字符设备驱动框架,其中read操作将内核数据" This is cdev_test_read!"传递给用户空间,write操作接收用户空间的"nihao"数据。该机保障了系统安全,使应用程序可通过系统调用安全访问硬件资源。
2026-01-19 10:16:23
996
原创 驱动程序开发--杂项设备驱动实验
本文介绍了Linux内核中的杂项设备驱动开发。杂项设备是字符设备的特殊封装,具有节省主设备号(固定为10)和使用简单的优势。文章详细讲解了miscdevice结构体的定义与填充方法,重点阐述了misc_register()和misc_deregister()函数的用法。通过一个完整的实验示例,展示了杂项设备驱动的编写、编译、加载和测试过程,包括Makefile编写、模块加载、设备节点创建等关键步骤。测试结果显示驱动成功注册并自动创建了/dev/test设备节点,验证了杂项设备驱动开发的完整流程。
2026-01-16 11:15:58
950
原创 驱动程序开发(字符设备驱动框架实验)
本文介绍了Linux字符设备驱动开发中文件操作集的实现方法。首先概述了struct file_operations结构体的关键成员,包括read、write、open、release等函数指针的功能及对应关系。然后通过实验代码详细展示了如何初始化字符设备、填充文件操作集并实现自动创建设备节点。实验部分包含驱动程序和测试应用程序的编写,以及编译运行测试的全过程。测试结果表明,应用程序通过设备节点成功调用了驱动中的open、read、write等操作函数,验证了字符设备驱动框架的正确性。
2026-01-15 21:02:51
932
原创 驱动程序(创建设备节点实验)
本文介绍了Linux系统中设备节点的两种创建方式:手动创建和自动创建。手动创建通过mknod命令直接指定设备类型、主/次设备号来创建;自动创建则利用udev机制,通过内核函数class_create()和device_create()在驱动加载时动态生成设备节点。文中详细说明了相关函数的参数和用法,并提供了一个字符设备驱动的实验代码示例,展示了自动创建设备节点的完整流程,包括设备号申请、字符设备注册、类创建和设备创建等步骤。最后通过编译运行测试验证了设备节点的自动创建和删除功能。
2026-01-14 23:09:45
871
原创 驱动程序(注册字符设备)
本文介绍了Linux内核中字符设备的注册过程。主要内容包括:1. 字符设备通过struct cdev结构体表示,包含设备号、文件操作接口等关键信息;2. 注册流程分为初始化(cdev_init)和添加(cdev_add)两个步骤;3. 提供了实验代码示例,展示如何动态申请设备号并注册字符设备;4. 详细说明了相关内核函数的使用方法和参数含义。文章还包含驱动程序编译和测试的具体操作步骤,通过打印设备号和注册状态信息验证注册是否成功。最后给出了加载和卸载驱动模块的命令示例。
2026-01-13 21:07:16
887
原创 C语言日常练习题(51--60)
本文提供了10个C语言基础练习题,涵盖字符串处理、数组操作、指针函数、递归计算和数学运算等常见编程任务。主要内容包括:1.删除字符串空格函数;2.二维数组奇数计数(行指针和二级指针两种实现);3.字符串拷贝和连接函数;4.整数转字符串函数;5.递归实现阶乘和斐波那契数列;6.使用qsort排序整型数组;7.计算水分子数量的物理问题。这些练习适合C语言初学者巩固基础语法,提升指针、数组和函数等核心概念的运用能力。
2026-01-12 10:10:16
347
原创 C语言日常练习题(41--50)
本文展示了10个C语言编程实例,涵盖了字符串处理、数组操作、函数实现等常见任务。主要内容包括:字符串大小写转换(41)、字符串连接(42)、指针数组遍历二维数组(43)、void指针遍历一维数组(44)、计算x的n次方(45)、素数统计(46)、数据交换(47)、字符串字符统计与转换(48)、数组求和(49)以及数组排序(50)。这些示例演示了指针操作、函数定义、循环结构等基本编程技巧,适用于初学者学习基础算法和C语言特性。
2026-01-11 10:07:10
256
原创 C语言日常练习题(31--40)
本文展示了多个C语言编程实例,主要包括:1) 冒泡排序算法实现;2) 二维数组下三角元素输出;3) 二维数组最大值及其位置查找;4) 矩阵转置操作;5) 杨辉三角生成;6) 字符串输入输出;7) 机器大小端检测;8) 指针实现数组逆序;9) 使用一级指针遍历二维数组;10) 行指针遍历二维数组。这些示例涵盖了数组处理、指针操作、算法实现等核心编程技巧,演示了C语言中常见的数据结构和算法应用。
2026-01-10 20:47:19
515
原创 C语言日常练习题(21--30)
本文包含10个C语言编程练习题目及实现代码:1)整数累加求和与偶数统计;2)求最大公约数和最小公倍数;3)打印水仙花数;4)100以内素数统计;5)1-100打印遇3的倍数停止;6)素数打印优化版;7)素数判断;8)10个数找最大值;9)数组元素分类统计;10)数组逆序输出。每个题目都提供了完整的C语言实现代码,涵盖基础算法、循环控制、数组操作等核心编程概念,适合初学者练习基本编程技能。
2026-01-09 09:57:54
566
原创 C语言日常练习题(11--20)
本文展示了10个C语言编程实例:1)成绩评级转换(A-E对应不同评价);2)分数转等级(90分以上为A等);3)计算某年某月的天数(考虑闰年);4)计算某日期是该年第几天;5)打印50-100的奇数并计数;6)打印n行星号图案;7)打印字母递减图案;8)打印九九乘法表;9)找出所有3位水仙花数;10)计算1-100的偶数和。这些实例涵盖了switch语句、循环结构、条件判断等基础语法,展示了C语言在数值计算、字符处理和逻辑控制方面的应用。
2026-01-08 21:01:31
689
原创 C语言日常练习题(7、8、9、10)
摘要:本文包含4个C语言程序:(1)输入三角形三边判断类型(普通/等边/等腰/直角/等腰直角);(2)通过ASCII码判别输入字符类别(控制字符/数字/大小写字母/其他);(3)运动会成绩筛选(8秒内按性别分组,否则淘汰);(4)根据月份(淡旺季)和年龄计算票价。每个程序都包含输入处理、条件判断和输出结果功能,展示了C语言的基本控制结构和逻辑判断应用。
2026-01-07 21:22:45
308
原创 C语言日常练习题60(4、5、6)
摘要:三个C语言程序示例:1)判断闰年并输出二月天数,满足能被4整除且不被100整除,或能被400整除即为闰年;2)判断三条边能否构成三角形,满足两边之和大于第三边,并判断是否为等边三角形;3)将输入的成绩转换为等级(A-E),90分以上为A,60分以下为E。每个程序都包含输入处理和条件判断逻辑。
2025-12-01 16:47:49
265
原创 C语言日常练习题60(1、2、3)
摘要:本文包含三个C语言程序示例。第一个程序判断输入的整数是否为偶数并输出结果;第二个程序对输入的三个整数进行排序并按升序输出;第三个程序扩展了第一个程序的功能,不仅判断偶数还会输出奇数结果。这些示例展示了基本的输入输出、条件判断和排序算法在C语言中的实现方式。
2025-12-01 14:24:56
380
原创 驱动程序(三)
本文介绍了Linux内核模块中设备号申请的两种方式:静态和动态注册。通过dev_t.c代码实现了根据传入参数选择注册方式的功能:若传入major参数则使用register_chrdev_region静态注册指定设备号,否则通过alloc_chrdev_region动态分配设备号。实验结果表明,两种方式都能成功注册设备号,并通过/proc/devices验证。Makefile配置了交叉编译环境,测试时分别演示了带参数(主设备号200)和不带参数的加载方式。
2025-11-21 11:23:11
583
原创 第二个驱动程序
本文介绍了Linux内核模块符号导出的实现方法。通过两个驱动程序mathmodule.c和hello.c的实例演示:mathmodule.c定义并导出了整型变量num和加法函数add(),使用EXPORT_SYMBOL宏实现符号导出;hello.c则通过extern声明导入并使用这些符号。编译时需注意模块依赖顺序,先编译mathmodule.o再编译hello.o。测试结果显示成功加载模块后能正确打印导出的变量值和函数返回值,验证了内核符号导出机制的有效性。最后给出了模块卸载的正确顺序。
2025-11-20 18:20:58
537
原创 FreeRTOS小知识
RTOS(实时操作系统)是一种专为处理实时任务设计的操作系统,其核心特点是确保系统能够快速响应外部事件。与普通操作系统不同,RTOS采用抢占式优先级调度策略,关注任务在规定时间内完成,而非资源利用效率。FreeRTOS作为一款开源的RTOS,具有轻量级、可移植性强、功能丰富等优势。它支持任务调度、通信、同步等功能,并能通过裁剪功能模块减少资源占用。FreeRTOS采用基于优先级的抢占式调度,通过上下文切换实现任务切换,并设计了空闲任务提高CPU利用率。
2025-11-19 16:22:06
1101
原创 STM32小知识(三)
本文系统介绍了嵌入式系统中常见通信接口的工作原理和应用场景。在串行通信方面,详细解析了I2C总线的半双工特性、主从架构、开漏输出设计及速率选择(100kbps-3.4Mbps);对比了SPI的全双工高速传输(最高50Mbps)和四种工作模式;阐述了UART通过起始/停止位保证数据正确性的机制,以及RS232(全双工)和RS485(半双工差分信号)的特点。文章还涉及定时器原理(PWM生成、输入捕获)、DMA数据传输、看门狗机制等核心知识,并提供了硬件调试、低功耗设计等实用解决方案。
2025-11-18 17:39:30
1487
原创 STM32小知识(二)
本文介绍了STM32中断机制及GPIO功能。在中断部分,阐述了中断的基本概念、中断向量表的作用和中断嵌套机制,详细说明了STM32中断处理流程,包括NVIC优先级判断、现场保存和中断服务程序执行等步骤。同时介绍了常见中断类型、优先级分组方式,以及中断服务函数的特性与优化方法。在GPIO部分,讲解了STM32通用输入输出接口的工作模式(输入/输出)和具体应用场景,并对比了推挽输出与开漏输出的差异特点。全文系统梳理了STM32硬件接口的关键技术点。
2025-11-18 10:03:58
757
原创 STM32小知识(一)
本文摘要:文章系统介绍了计算机体系结构相关知识,包括指令集架构(CISC/RISC)、CPU内部结构(ALU、寄存器等)、存储体系(硬盘/内存/虚拟内存)及嵌入式系统相关内容。重点解析了ARM处理器的分类(Cortex-A/R/M系列)、存储器类型(ROM/RAM/Register)和字节序概念(大/小端判断方法)。同时详细阐述了STM32最小系统构成、嵌入式系统定义及其典型外设应用(I2C/SPI/CAN等)。全文以硬件架构为核心,结合嵌入式开发实践,构建了完整的计算机硬件知识体系框架。
2025-11-17 12:43:28
963
原创 C语言小知识(三)
摘要:指针运算中,同类型指针相减得到元素个数差而非地址差,指针加减整数表示地址移动(由数据类型决定)。数组名本质是标识符,多数情况会转为首元素指针。指针数组存放指针,数组指针指向数组。指针函数返回指针,函数指针指向函数。常量指针指向常量,指针常量是地址不可变的指针。字符数组可局部修改,字符指针指向不可修改的数据区字符串。空指针指向NULL,悬空/野指针指向无效内存。结构体成员访问用./->,内存计算考虑对齐。共用体成员共享内存,结构体成员独立存储。
2025-11-16 09:36:18
1087
原创 C语言小知识(二)
C语言数据类型主要包括整数(char,short,int等)、浮点数(float,double等)和枚举类型。整数采用补码存储,浮点数遵循IEEE754标准,由符号位、指数和尾数三部分构成。数组是连续内存空间,字符串是以'\0'结尾的字符数组。类型转换遵循从窄到宽、低精度到高精度的原则。枚举提高了代码可读性,typedef比#define更安全。switch参数需整型或枚举,break终止循环而continue跳过当前循环。多维数组是数组的数组,在内存中连续存储。
2025-11-15 15:37:28
1236
原创 驱动模块传参实验
摘要 Linux内核模块传参机制允许在模块加载时动态传递参数,提高调试效率。内核提供了三种宏:module_param()用于基本类型参数(如int、bool等),module_param_array()用于数组参数,module_param_string()用于字符串参数。这些宏定义在moduleparam.h中,需要指定参数名、类型和sysfs访问权限(如S_IRUGO表示只读)。实验示例展示了如何传递整型、字符串和数组参数,并在模块初始化时通过printk输出这些参数。该机制避免了重新编译模块的麻烦,
2025-11-14 17:19:34
255
原创 第一个驱动程序
本文介绍了Linux内核驱动模块的基本框架和编译方法。内核驱动主要由加载函数(初始化)、卸载函数(清理)、许可证声明等部分组成,其中模块参数、导出符号和作者信息为可选内容。示例代码展示了一个简单的"Hello World"驱动模块的实现,包含初始化/退出函数及基本信息声明。编译驱动需要编写Makefile文件,其中需指定目标架构、交叉编译器、内核源码路径等参数,通过make命令即可完成编译。该框架是开发Linux设备驱动的基础结构。
2025-11-14 16:12:47
219
原创 Linux内核源码和Linux内核源码结构目录组成
本文介绍了Linux内核源码的目录结构和主要内容。内核源码主要包含平台相关代码(arch)、设备驱动(drivers)、文件系统(fs)、核心功能(kernel)、网络(net)和安全模块(security)等关键组件。各目录分工明确,如block处理块设备,crypto实现加密算法,mm负责内存管理。源码还附带说明文档(Documentation)和示例代码(samples),为开发者提供参考。这种模块化结构使Linux内核保持高效稳定的同时,支持多平台和丰富功能。
2025-11-13 15:02:32
417
原创 Linux系统的压缩和解压缩
本文介绍了Linux系统常用的压缩格式及对应命令操作。Linux默认支持.gz、.bz2、.zip、.tar等压缩格式,其中.gz和.bz2需要使用tar命令处理,而.zip格式需使用zip和unzip命令。详细说明了tar命令的关键选项:-c创建包、-v显示详情、-f指定文件名、-z/-j处理.gz/.bz2格式、-x解包、-C指定解压目录。同时介绍了zip/unzip命令的基本用法,包括unzip的-d选项可指定解压路径。通过具体命令示例展示了打包(tar -cvf)和解包(tar -xvf)的操作方法
2025-11-12 15:50:09
156
原创 嵌入式开发:裸机开发、FreeRTOS、Linux区别
摘要:嵌入式开发中系统层级与开发复杂度的关系呈现反向特性。Linux作为高级系统提供高度抽象,开发者只需专注业务逻辑,内核自动处理硬件调度,AI已能胜任多数应用开发;RTOS提供部分自动化但仍需关注底层;裸机开发则需直接操作寄存器,实现多任务支持困难但实时性最强。三种模式分别类比智能驾驶、自动挡和手动挡,系统层级越高开发效率越高但实时性降低,适用场景也从低成本控制扩展到多媒体设备,开发者需根据项目需求在掌控度与开发效率间权衡。
2025-11-12 15:34:53
406
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅