驱动程序与测试程序之间的数据交换KC08131105d01_第1页
驱动程序与测试程序之间的数据交换KC08131105d01_第2页
驱动程序与测试程序之间的数据交换KC08131105d01_第3页
驱动程序与测试程序之间的数据交换KC08131105d01_第4页
驱动程序与测试程序之间的数据交换KC08131105d01_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

嵌入式技术应用驱动程序与测试程序之间的数据交换模块三:嵌入式网关之驱动程序编写学习目标一、有关复制的两个内核函数二、编写copydata_driver驱动程序三、编写copydata_test测试程序四、测试程序和驱动程序copydata的Makefile一、有关复制的两个内核函数

由于用户空间与内核空间的内存映射方式完全不同,所以不能使用像memcpy()之类的函数在用户空间与内核空间之间传输数据。1.1copy_to_user()函数内核函数copy_to_user()是将数据从驱动程序复制到应用程序中。这个函数的原型如下:返回值=应用程序调用的count参数,表明请求数据传输成功。unsignedlongcopy_to_user(void*to,constvoid*from,unsignedlongcount);返回值<应用程序调用的count参数,表明部分数据传输成功。根据设备的不同,导致这个问题的原因也不同,一般采取再次读取的方法。返回值=0,表示到达文件的末尾。返回值=负数,表示出现错误,并且返回值指明了是何种错误,错误号的定义见<linux/errno.h>。1.2copy_from_user()函数内核函数copy_from_user()是将数据从应用程序复制到驱动程序中。unsignedlongcopy_from_user(void*to,constvoid*from,unsignedlongcount);返回值=应用程序调用的count参数,表明请求数据传输成功。返回值<应用程序调用的count参数,表明部分数据传输成功。根据设备的不同,导致这个问题的原因也不同,一般采取再次读取的方法。返回值=0,表明没有写入任何数据。返回值=负数,表示出现错误,并且返回值指明了是何种错误,错误号的定义见<linux/errno.h>。二、编写copydata_driver驱动程序见copydata_driver.c,可以使用gedit打开。下面我们来看看有关复制的两个内核函数的语句。2.1登记有关复制的两个内核函数2.2编写有关复制的两个内核函数staticssize_tdemo_read(structfile*filp,char*buffer,size_tcount,loff_t*ppos){copy_to_user(buffer,data_to_user,count);

returncount;//上一条语句将数据从内核复制到应用程序}staticstructfile_operationscopydata_fops={owner:THIS_MODULE,//表示这个驱动的所有者为驱动模块本身

read:demo_read,//登记demo_read()函数为read()函数

write:demo_write,//登记demo_write()函数为write()函数};三、编写copydata_test测试程序接下来需要编写一个使用驱动程序中read()和write()函数的测试程序。staticssize_tdemo_write(structfile*file,constchar*buffer,size_tcount,loff_t*ppos){inti;

copy_from_user(drv_buf,buffer,count);

for(i=0;i<5;i++){//上一条语句将数据从应用程序复制到内核data_to_user[i]=drv_buf[i]+drv_buf[i];}returncount;}见copydata_test.c,可以使用gedit打开。其中,copydata_test测试程序的核心语句如下所示。intmain(){......printf("Write%dbytesdatato%s.\n",5,DEVICE_NAME);showbuf(buf);write(fd,buf,5);//将数据写入内核

printf("Read%dbytesdatafrom%s.\n",5,DEVICE_NAME);read(fd,buf,5);//从内核读取处理完的数据

showbuf(buf);......}四、测试程序和驱动程序copydata的MakefileTARGET=copydata_testCROSS_COMPILE=arm-linux-CC=$(CROSS_COMPILE)gccSTRIP=$(CROSS_COMPILE)strip#指定内核源代码的路径KERNELDIR=/opt/EmbedSky/linux-2.6.30.4/PWD:=$(shellpwd)#使用交叉编译器编译测试程序和驱动程序all:$(TARGET)modules$(TARGET): $(CC)-o$(TARGET)$(TARGET).cmodules: $(MAKE)-C$(KERNELDIR)M=$(PWD)modulesclean: rm-rf*.o*~core.depend.*.c

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论