有没有做高仿的网站百度知道提问首页
- 作者: 五速梦信息网
- 时间: 2026年03月21日 06:53
当前位置: 首页 > news >正文
有没有做高仿的网站,百度知道提问首页,网站后台的文章怎么做,广安网站建设兼职目录 1. 字符设备驱动简介1.1 重要函数1.2 简单框架代码流程1.3 linux中关于驱动的重要命令 2. 字符设备驱动简单框架编写2.1 添加LICENSE信息2.2 驱动模块的入口与出口2.3 入口和出口函数的编写2.4 设备操作结构体定义2.4.1 结构体函数内容填充 3. 应用程序简介#xff1a;4.… 目录 1. 字符设备驱动简介1.1 重要函数1.2 简单框架代码流程1.3 linux中关于驱动的重要命令 2. 字符设备驱动简单框架编写2.1 添加LICENSE信息2.2 驱动模块的入口与出口2.3 入口和出口函数的编写2.4 设备操作结构体定义2.4.1 结构体函数内容填充 3. 应用程序简介4. 应用程序的编写思路 1. 字符设备驱动简介 目前的驱动开发一般是分为三类第一类就是字符设备驱动、块设备驱动、和网络驱动三类其中字符设备驱动是最多最杂的现在对字符设备驱动进行一个简要的介绍 字符设备驱动是指那些以字节流进行数据传输的设备、IIC、SPI、LCD、按键、例如键盘、鼠标、打印机等其中包含以下几个关键的部分 设备注册和注销通过设备注册使设备能被系统识别注销则相反数据操作函数通常包含open,read,write,realse等中断处理处理设备产生的中断以响应特定事件 通过字符型设备驱动可以使系统方便统一管理不同的设备这样就可以给上层应用提供相应的接口函数方便应用程序与设备之间进行数据交换和通信 本次的实验是通过简单的实验建立一个设备驱动开发的基本框架为后续的学习打下基础其中会列出重要的函数以及重要的挂载指令当然其中有一些函数是比较老的例如要手动分配设备号但是为了便于学习目前就以简单的为主因为越是抽象的越简单但是越抽象就越难以理解 1.1 重要函数 这里只是把本实验相关的重要函数给罗列出来了主要的作用就是对本次实验的一个总结如果没有做个这个实验那么看着没啥感觉的例如我下面罗列函数的顺序就是我们在编写驱动实验时整个流程的顺序首先就是注册入口和出口函数其次就是编写入口和出口函数再次就是编写文件结构体的对应相关的函数内容 MODULE-LICENSE(GPL): 表示该内核模块遵循的许可协议是通用公共许可GPL。指定许可协议非常重要它明确了该模块在使用、分发等方面的权利和限制。如果不写这个的话就会导致在装载设备驱动时出现警告module_init(**_init):模块的入口函数进行初始化也就是加载模块时第一个就是运行这个函数注册的函数*对模块进行初始化设置module_exit(_exit):模块的出口函数对模块进行卸载时就会执行这个函数注册的函数****static int __init ****_init(void):设备加载函数进行模块的初始化和加载的设置这个函数要被入口函数进行注册后起作用register_chrdev(unsigned int major, const char *name, const struct file_operations fops):对设备进行注册static int __exit ****_exit(void):设备卸载函数、进行模块的卸载时这个函数内部的程序就会执行不过要被出口函数进行注册unregister_chrdev(unsigned int major, const char name):对模块进行卸载static const struct file_operations **_fops : struct file_operations是一个很重要的结构体其中定义了很多与文件操作有关的函数指针例如read,write,realse,open等等这些函数可以按需进行填充这样就方便与设备之间进行文件的操作下面进行实验时会进行一个详细的说明 1.2 简单框架代码流程 代码实验编写流程 1.3 linux中关于驱动的重要命令 lsmod:显示有哪些模块被加载了也就是显示所有的加载模块lsmod:显示有哪些模块被加载了也就是显示所有的加载模块depmod更新模块的依赖关系也就是新加载一个模块时要先运行一下这个命令,不然有错误modprob **.ko:这个命令的作用就是加载模块.komknod /dev/ c 200 0:mknod手动创建节点的命令。/dev/*** 创建设备的名称。c字符型设备。200主设备号自己指定。0次设备号自己指定。cat /proc/devices:这个命令的作用是查看所有加载的模块显示所有设备号等rmmod .ko:卸载模块.ko;cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq:这个命令是显示当成CPU的频率
- 字符设备驱动简单框架编写 上面已经介绍了驱动编写的则整体流程以及介绍了重要的加载驱动的一些linux的命令因此下面的代码就不做过多的介绍
2.1 添加LICENSE信息 我们需要在代码中添加LICENSE信息否则编译会出错不过我们还可以添加一些其他的信息例如作者邮箱等等
MODULE_LICENSE(GPL);2.2 驱动模块的入口与出口 linux的驱动有两种加载形式一就是编译进linux内核中当内核启动驱动也启动另一种方法就是把启动编译成模块也就*.ko文件通过insmode或者modprob的命令进行加载模块这样做的好处就是便于调试而且不用重启linux内核代码如下下面两个函数的作用就是对模块进行加载和卸载并在加载和卸载函数中对字符设备进行注册如我们裸机编程中系统中断函数对中断服务函数的注册一样
/* * 模块入口和出口函数注册*/
module_init(chrdevbase_init);/入口,加载模块/
module_exit(chrdevbase_exit);/出口卸载模块/2.3 入口和出口函数的编写 注意入口函数是通过init来修饰注意是两个杠而对于出口函数通过exit进行修饰在出入口函数中对设备进行注册CHRDEVBASE_MAJOR是设备号CHREEVBAScE_NAME是设备名chrdevbase_fops是文件操作结构体;出口函数是类似的
#define CHRDEVBASE_MAJOR 200
#define CHREEVBASE_NAME chrdevbasestatic int __init chrdevbase_init(void) {printk(chrdevbase_init3\r\n);/注册字符设备/register_chrdev(CHRDEVBASE_MAJOR, CHREEVBASE_NAME,chrdevbase_fops);return 0; } static void __exit chrdevbase_exit(void) {printk(chrdevbase_exit\r\n);unregister_chrdev(CHRDEVBASE_MAJOR,CHREEVBASE_NAME); } 2.4 设备操作结构体定义 对于设备的操作file_operations结构体也称为文件操作结构体这也是为什么linux下一切皆文件我们的操作大部分都是通过文件来进行管理我们可能用不到那么多的功能因此我们要用到什么功能就进行对应的添加和书写就行代码如下注意这里使用的是 static const struct file_operations chrdevbase_fops{.owner THIS_MODULE,.open chrdevbase_open,.release chrdevbase_release,.read chrdevbase_read,.write chrdevbase_write, };2.4.1 结构体函数内容填充 可以看到我们对上面的文件操作结构体中定义了四个函数指针分别是chrdevbase_open、chrdevbase_release、chrdevbase_read、chrdevbase_write接下来就是对这四个函数进行内容填充 static char readbuf[100];/读缓冲/ static char writebuf[100]; static char kerneldata[]{kernel data!};/********/ static ssize_t chrdevbase_read(struct file * file, char * buf, size_t count, loff_t *off) {int ret0;memcpy(readbuf,kerneldata,sizeof(kerneldata));ret copy_to_user(buf,readbuf,count);if(ret0){printk(Error!);}else{}return 0; } /**********/ static ssize_t chrdevbase_write(struct file * file, const char * buf, size_t count,loff_t *off) {int ret 0;ret copy_from_user(writebuf,buf,count);printk(Kernel recevdata:%s\r\n,writebuf);if(ret 0){printk(Kernel recevdata:%s\r\n,writebuf);}return 0; } static int chrdevbase_release(struct inode * inode, struct file * file) {printk(chrdevbase_ralease\r\n);return 0; } static int chrdevbase_open(struct inode * inode, struct file * file) {printk(chrdevbase_open\n);return 0; }3. 应用程序简介 当驱动程序编写完毕后要通过应用程序进行调用驱动函数的一些接口函数这些功能的实现是在应用程序中实现的这样就实现了应用程序与驱动程序的分离可以这样类比我们写应用程序就相当于我们在windows系统上写C程序我们写C程序时也没有关注下层这就是一种分离不过这两者是可以相互进行数据交换的不过要用特定的方法注意驱动程序和应用程序的编译是不一样的对于应用程序的编译是下面的指令 arm-linux-gnueabihf-gcc ***APP.c -o ***APP应用程序的编译指令\((MAKE) -C \)(KERNELDIR) M$(CURRENT_PATH) modules:驱动程序的编译Make部分核心指令 从上面的编译指令中就可以看出区别对于驱动的编译要用到一系列的库这些库包含板子的信息以及一些arm中的一些库等等最终生成一个驱动模块属于下层的驱动文件 而对于应用程序的编译则是用到了一个.c文件以及基础库就像我们编译C语言一样只不过我们写一个hello.c文件用的是gcc编译器生成的是x86架构的可执行文件同理我们使用arm-linux-gnueabihf-gcc交叉编译器生成的是arm架构的可执行文件这明显是上层的应用程序不过我们写上层应用程序时通过传参命令的形式就可以与下层的驱动进行数据文件交换 - 应用程序的编写思路 编写测试APP就是编写Linux应用程序需要用到C库和文件操作相关的一些函数open、read、write 和 close 这四个函数这些函数可以根据下面的命令进行找详细帮助“man 1”通常是用户命令的手册页“man 2”一般是系统调用的手册页“man 3”可能是 C 库函数的手册页 wyjBK:$ man 2 read wyjBK:\( man 2 write wyjBK:~\) man 2 close wyjBK:~$ man 2 open因此在应用程序中编写程序就是如何对驱动程序进行调用和使用不过要注意的是对于驱动的编写属于内核态而对于应用程序的编写属于应用态应用态不能直接操作内核态要通过一定的程序从而间接操作内核态 int mian(int argc,char *argv[]) {int ret 0;int fd 0;char *filename;char readbuf[100];char writebuf[100];static char usrdata[]{Usr data!Usr data!Usr data!};filenameargv[1];fd open(filename, O_RDWR);if(fd0){printf(Cant open file %s\r\n,filename);}/read/if(atoi(argv[2])1){retread(fd, readbuf, 50); printf(\r\nAPP read data:%s\r\n,readbuf);}/write/if(atoi(argv[2])2){memcpy(writebuf,usrdata,sizeof(usrdata));ret write(fd, writebuf,50);}/close/ret close(fd);if(ret0){printf(Cant close %s\r\n,filename);}return 0; }
- 上一篇: 有没有做ppt很厉害的网站沈阳市城乡建设局
- 下一篇: 有没有做家纺类的网站本地环境建设网站
相关文章
-
有没有做ppt很厉害的网站沈阳市城乡建设局
有没有做ppt很厉害的网站沈阳市城乡建设局
- 技术栈
- 2026年03月21日
-
有没有做logo的网站wordpress如何设置点击直接下载
有没有做logo的网站wordpress如何设置点击直接下载
- 技术栈
- 2026年03月21日
-
有没有专业做特产的网站做网站可以不做后端吗
有没有专业做特产的网站做网站可以不做后端吗
- 技术栈
- 2026年03月21日
-
有没有做家纺类的网站本地环境建设网站
有没有做家纺类的网站本地环境建设网站
- 技术栈
- 2026年03月21日
-
有没有做旅游攻略的网站惠州网站建设公司推荐乐云seo
有没有做旅游攻略的网站惠州网站建设公司推荐乐云seo
- 技术栈
- 2026年03月21日
-
有没有做美食的视频网站外贸做什么产品出口好
有没有做美食的视频网站外贸做什么产品出口好
- 技术栈
- 2026年03月21日
