ch7嵌入式Linux应用程序开发过程.ppt

上传人:b****1 文档编号:1367394 上传时间:2022-10-21 格式:PPT 页数:35 大小:849.50KB
下载 相关 举报
ch7嵌入式Linux应用程序开发过程.ppt_第1页
第1页 / 共35页
ch7嵌入式Linux应用程序开发过程.ppt_第2页
第2页 / 共35页
ch7嵌入式Linux应用程序开发过程.ppt_第3页
第3页 / 共35页
ch7嵌入式Linux应用程序开发过程.ppt_第4页
第4页 / 共35页
ch7嵌入式Linux应用程序开发过程.ppt_第5页
第5页 / 共35页
点击查看更多>>
下载资源
资源描述

ch7嵌入式Linux应用程序开发过程.ppt

《ch7嵌入式Linux应用程序开发过程.ppt》由会员分享,可在线阅读,更多相关《ch7嵌入式Linux应用程序开发过程.ppt(35页珍藏版)》请在冰豆网上搜索。

ch7嵌入式Linux应用程序开发过程.ppt

基于ARM和linux的开发,2022/10/21,2,Linux应用程序,Linux应用程序设计,编写程序,编写Makefile文件,编译,运行,2,3,编写helloworld文件,Helloworld程序是一个只在输出控制台上打印出“hello,world”字串的程序#includeintmain()printf(“hello,world!

n”);,3,4,编写Makefile文件,Linux应用程序设计,4,5,编译器,编译x86平台采用的gcc编译器#gccohelloworldhelloworld.c,编译ARM平台采用的arm-linux-gcc编译器#arm-linux-gccohelloworldhelloworld.c,5,6,编译,#/usr/local/arm/2.95.3/bin/arm-linux-gccohelloworldhelloworld.c,如果有Makefile文件#make,6,7,Linux应用程序运行1,Linux应用程序设计,应用程序运行可以采用如下两种方式:

在Linux内核启动起来,并且有办法从主机获取文件时,可以在Linux控制台直接从主机获取编译后的应用程序。

可以通过ftp、nfs、ssh等方式达到。

也可以在编译应用程序后将该应用程序拷贝到ramdisk中,然后重新制作ramdisk,并更新ramdisk文件系统,此时新的程序将在文件系统中。

7,8,Linux应用程序运行2,JXARM9-2410通过NFS将主机的/tftpboot/目录挂接到目标机的/mnt/nfs目录下#mount192.168.1.180:

/tftpboot/mnt/nfs#cd/mnt/nfs/examples#./helloworld,8,9,Linux应用程序运行3,Linux应用程序设计,重新编译内核时,通常将应用程序添加到Linux文件系统的bin目录,该目录有全局路径。

且该文件应该具有执行属性,可以通过如下命令修改:

chmod777leddemo在新内核启动后,直接在命令行输入文件名即可运行。

当直接在Linux控制台中从主机上获取应用程序时,必须保存到可写的位置,且通过如下命令执行该程序:

./leddemo,9,10,配置Linux应用程序启动后自动运行,Linux应用程序设计,如果需要在系统启动以后自动运行helloworld程序,需要编辑ramdisk中的启动脚本文件,该文件为root/rd/etc/init.d/rcS使用vi编辑器编辑,在该文件最后添加如下脚本:

/bin/helloworld该脚本将启动后运行helloworld,直到程序退出。

或/bin/helloworld&它将在后台运行helloworld,不影响其他的程序运行。

10,11,linux驱动程序,Linux驱动程序设计,Linux下对外设的访问只能通过驱动程序进行,Linux具有统一的驱动程序接口,以文件操作的方式管理驱动程序,如:

open、read、write、ioctl,驱动程序是内核的一部分,可以使用中断、DMA等操作,驱动程序需要在用户态和内核态之间传递数据,11,12,设备驱动程序的概念,对硬件的控制涉及寄存器中各位的操作,通常这些操作与设备直接相关并且对时序的要求非常严格,如果这些工作都交由应用程序员来负责,那么对硬件设备的编程将变得异常复杂而困难。

驱动程序的作用正是要屏蔽硬件的这些底层细节,从而简化应用程序的编写。

操作系统一般提供设备驱动程序来完成对特定硬件的控制,以建立应用程序和设备之间的抽象接口,而不是应用程序直接操作硬件。

12,13,设备驱动程序的概念,设备驱动程序实际是处理和操作硬件控制器的软件,从本质上讲,是内核中具有最高特权级的、驻留内存的、可共享的底层硬件处理例程。

Linux操作系统将所有的设备全部看成文件,都纳入文件系统的范畴,并通过文件的操作界面进行操作。

一般来说,是把设备映射为一个特殊的设备文件,用户程序可以像对其他文件一样对此设备文件进行操作。

设备文件的属性由三部分信息组成:

文件的类型,主设备号,次设备号,13,14,设备驱动程序的概念,驱动程序是内核的一部分,是操作系统内核与硬件设备的直接接口,驱动程序屏蔽了硬件的细节,完成以下功能:

对设备初始化和释放对设备进行管理,包括实时参数设置,以及提供对设备的操作接口读取应用程序传送给设备文件的数据或回送应用程序请求的数据检测和处理设备出现的错误,14,15,Linux驱动程序,Linux驱动程序设计,Linux屏蔽了应用层对外设的直接访问,不能在用户态直接进行如下操作:

*(unsignedchar*)0x02000006)=0x3e;,Linux下用户态无法处理中断,Linux下对外设的访问推荐采用驱动程序进行,在内核态编写驱动程序(包括直接对外设操作、处理中断等),用户态通过标准驱动程序调用方法进行操作。

15,16,Linux驱动程序编译方式,Linux驱动程序设计,Linux中驱动程序的使用可以按照两种方式编译:

一种是静态编译进内核另一种是编译成模块以供动态加载,由于嵌入式Linux不能够象桌面Linux那样灵活的使用insmod/rmmod加载卸载设备驱动程序,因而通常在Linux中将设备驱动程序静态编译进内核。

16,17,Linux下设备驱动程序分类,Linux驱动程序设计,字符设备:

是指存取时没有缓存的设备。

典型的字符设备包括鼠标,键盘,串行口等。

块设备:

块设备的读写都有缓存来支持,并且块设备必须能够随机存取(randomaccess)。

典型的块设备主要包括硬盘软盘设备,CD-ROM等。

网络设备:

Linux的网络系统主要是基于BSDunix的socket机制。

在系统和驱动程序之间定义有专门的数据结构(sk_buff)进行数据的传递。

系统里支持对发送数据和接收数据的缓存,提供流量控制机制,提供对多协议的支持。

17,18,Linux下设备驱动程序组成,Linux驱动程序设计,自动配置和初始化子程序:

负责检测所要驱动的硬件设备是否存在和是否能正常工作。

如果该设备正常,则对这个设备及其相关的、设备驱动程序需要的软件状态进行初始化。

这部分驱动程序仅在初始化的时候被调用一次。

服务于I/O请求的子程序:

调用这部分是由于系统调用的结果。

这部分程序在执行的时候,系统仍认为是和进行调用的进程属于同一个进程,只是由用户态变成了核心态,具有进行此系统调用的用户程序的运行环境,因此可以在其中调用sleep()等与进程运行环境有关的函数。

中断服务子程序:

18,19,Linux下设备驱动程序I/O设备入口点1,Linux驱动程序设计,在系统内部,I/O设备的存取通过一组固定的入口点来进行,这组入口点是由每个设备的设备驱动程序提供的。

而入口点由一个文件操作结构(file_operations)向系统进行说明。

一般来说,字符型设备驱动程序能够提供如下几个入口点:

open:

打开设备准备I/O操作。

对字符特别设备文件进行打开操作,都会调用设备的open入口点。

open子程序必须对将要进行的I/O操作做好必要的准备工作,如清除缓冲区等。

如果设备是独占的,即同一时刻只能有一个程序访问此设备,则open子程序必须设置一些标志以表示设备处于忙状态。

close:

关闭一个设备。

当最后一次使用设备终结后,调用close子程序。

独占设备必须标记设备可再次使用。

19,20,Linux下设备驱动程序I/O设备入口点2,Linux驱动程序设计,write:

往设备上写数据。

对于有缓冲区的I/O操作,一般是把数据写入缓冲区里。

对字符特别设备文件进行写操作将调用write子程序。

ioctl:

执行读、写之外的操作。

select:

检查设备,看数据是否可读或设备是否可用于写数据。

select系统调用在检查与设备特别文件相关的文件描述符时使用select入口点。

如果设备驱动程序没有提供上述入口点中的某一个,系统会用缺省的子程序来代替。

对于不同的系统,也还有一些其它的入口点。

Read:

从设备上读数据。

对于有缓冲区的I/O操作,一般是从缓冲区里读数据。

对字符特别设备文件进行读操作将调用read子程序。

20,21,Linux下设备驱动程序I/O设备入口点3,在用户自己的驱动程序中,首先要根据驱动程序的功能,完成file_operations结构中的函数的实现不需要的函数接口可以直接在file_operations结构中初始化为NULL每个进程对设备的操作,都会根据主次设备号,转换成对file_operations结构的访问,21,22,设备驱动程序的开发过程,查看原理图,理解设备的工作原理。

定义设备号。

设备由一个主设备号和一个次设备号来标识。

主设备号惟一标识了设备类型,即设备驱动程序类型,它是块设备表或字符设备表项的索引实现初始化函数。

在驱动程序中实现驱动的注册和卸载设计所要实现的文件操作,定义file_operations结构,22,23,设备驱动程序的开发过程,实现所需的文件操作调用,如read、write等实现中断服务,并用request_irq向内核注册,中断并不是每个设备驱动所必需的。

编译该驱动程序到内核中,或者用insmod命令加载模块测试该设备,编写应用程序,对驱动程序进行测试,23,24,Linux下设备注册1,Linux驱动程序设计,设备驱动程序所提供的入口点,在设备驱动程序初始化的时候向系统进行登记,以便系统在适当的时候调用。

Linux系统里,通过调用register_chrdev向系统注册字符型设备驱动程序。

register_chrdev定义为:

#include#includeintregister_chrdev(unsignedintmajor,constchar*name,structfile_operations*fops);,其中,major是为设备驱动程序向系统申请的主设备号,如果为0则系统为此驱动程序动态地分配一个主设备号。

name是设备名。

fops是该驱动各个的入口点的文件操作结构指针。

24,25,Linux下设备注册2,Linux驱动程序设计,此函数返回0表示成功。

返回-EINVAL表示申请的主设备号非法,一般来说是主设备号大于系统所允许的最大设备号。

返回-EBUSY表示所申请的主设备号正在被其它设备驱动程序使用。

如果是动态分配主设备号成功,此函数将返回所分配的主设备号。

如果register_chrdev操作成功,设备名就会出现在/proc/devices文件里。

初始化部分一般还负责给设备驱动程序申请系统资源,包括内存、中断、时钟、I/O端口等,这些资源也可以在open子程序或别的地方申请。

在这些资源不用的时候,应该释放它们,以利于资源的共享。

25,26,Linux下中断处理,Linux驱动程序设计,在Linux系统里,对中断的处理是属于系统核心的部分,因此如果设备与系统之间以中断方式进行数据交换的话,就必须把该设备的驱动程序作为系统核心的一部分。

设备驱动程序通过调用request_irq函数来申请中断,通过free_irq来释放中断。

26,27,Linux下内存分配、释放,Linux驱动程序设计,作为系统核心的一部分,设备驱动程序在申请和释放内存时不是调用malloc和free,而代之以调用kmalloc和kfree,它们被定义为:

#includevoid*kmalloc(unsignedintlen,intpriority);voidkfree(void*obj);参数len为希望申请的字节数,obj为要释放的内存指针。

priority为分配内存操作的优先级,即在没有足够空闲内存时如何操作,一般用GFP_KERNEL。

27,28,Linux下内存分配、释放,Linux驱动程序设计,使用一个没有申请的I/O端口不会使CPU产生异常,也就不会导致诸如“segmentationfault”一类的错误发生

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > IT认证

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1