基于ARM和linux的开发*上海海信特Linux应用程序Linux应用程序设计领导形象设计圆作业设计ao工艺废水处理厂设计附属工程施工组织设计清扫机器人结构设计编撰程序编撰Makefile文件编译运行编撰helloworld文件Helloworld程序是一个只在输出控制台上复印出“hello,world”字串的程序#includeintmain(){printf(“hello,world!n”);}编撰Makefile文件Linux应用程序设计指定编译器生成的执行文件和链接过程中的目标文件编译和链接的参数编译命令拷贝helloworld映像文件到/t中去除编译器编译x86平台采用的gcc编译器#gcc–ohelloworldhelloworld.c编译ARM平台采用的arm-linux-gcc编译器#arm-linux-gcc–ohelloworldhelloworld.c编译#/usr/local/arm/2.95.3/bin/arm-linux-gcc–ohelloworldhelloworld.c假如有Makefile文件#makeLinux应用程序运行1Linux应用程序设计应用程序运行可以采用如下两种形式:在Linux内核启动上去,但是有办法从主机获取文件时,可以在Linux控制台直接从主机获取编译后的应用程序。
可以通过ftp、nfs、ssh等方法达到。也可以在编译应用程序后将该应用程序拷贝到ramdisk中,之后重新制做ramdisk,并更新ramdisk文件系统,此时新的程序将在文件系统中。Linux应用程序运行2JXARM9-2410通过NFS将主机的/t目录挂接到目标机的/mnt/nfs目录下#mount192.168.1.180:/t/mnt/nfs#cd/mnt/nfs/examples#./helloworldLinux应用程序运行3Linux应用程序设计重新编译内核时,一般将应用程序添加到Linux文件系统的bin目录,该目录有全局路径。且该文件应当具有执行属性,可以通过如下命令更改:chmod777leddemo在新内核启动后,直接在命令行输入文件名即可运行。当直接在Linux控制台北从主机上获取应用程序时,必须保存到可写的位置,且通过如下命令执行该程序:./leddemo配置Linux应用程序启动后手动运行Linux应用程序设计假如须要在系统启动之后手动运行hellowo
rld程序,须要编辑ramdisk中的启动脚本文件嵌入式linux应用层开发,该文件为root/rd/etc/init.d/rcS使用vi编辑器编辑,在该文件最后添加如下脚本:/bin/helloworld该脚本将启动后运行helloworld,直至程序退出。或/bin/helloworld&它将在后台运行helloworld,不影响其他的程序运行。linux驱动程序Linux驱动程序设计Linux下对外设的访问只能通过驱动程序进行Linux具有统一的驱动程序插口,以文件操作的方法管理驱动程序,如:open、read、write、ioctl…驱动程序是内核的一部份,可以使用中断、DMA等操作驱动程序须要在用户态和内核态之间传递数据设备驱动程序的概念对硬件的控制涉及寄存器中诸位的操作嵌入式linux应用层开发,一般这种操作与设备直接相关但是对时序的要求十分严格,倘若这种工作都交由应用程序员来负责,这么对硬件设备的编程将显得异常复杂而困难。驱动程序的作用正是要屏蔽硬件的那些底层细节,进而简化应用程序的编撰。操作系统通常提供设备驱动程序来完成对特定硬件的控制,以构建应用程序和设备之间的具象插口,而不是应用程序直接操作硬件。设备驱动程序的概念设备驱动程序实际是处理和操作硬件控制器的软件,从本质上讲,是内核中具有最高特权级的、驻留显存的、可共享的底层硬件处理类库。
Linux操作系统将所有的设备全部看成文件,都列入文件系统的范畴,并通过文件的操作界面进行操作。通常来说,是把设备映射为一个特殊的设备文件,用户程序可以像对其他文件一样对此设备文件进行操作。设备文件的属性由三部份信息组成:文件的类型,主设备号,次设备号设备驱动程序的概念驱动程序是内核的一部份,是操作系统内核与硬件设备的直接插口,驱动程序屏蔽了硬件的细节,完成以下功能:对设备初始化和释放对设备进行管理,包括实时参数设置,以及提供对设备的操作插口读取应用程序传送给设备文件的数据或回送应用程序恳求的数据测量和处理设备出现的错误Linux驱动程序Linux驱动程序设计Linux屏蔽了应用层对外设的直接访问,不能在用户态直接进行如下操作:*((unsignedchar*)0x02000006)=0x3e;Linux下用户态未能处理中断Linux下对外设的访问推荐采用驱动程序进行,在内核态编撰驱动程序(包括直接对外设操作、处理中断等),用户态通过标准excel标准误差excel标准误差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载驱动程
序调用方式进行操作。Linux驱动程序编译方法Linux驱动程序设计Linux中驱动程序的使用可以根据两种形式编译:一种是静态编译进内核另一种是编译成模块以供动态加载因为Linux不支持模块动态加载,但是嵌入式Linux不能否象桌面Linux那样灵活的使用insmod/rmmod加载卸载设备驱动程序,因此一般在Linux上将设备驱动程序静态编译进内核。Linux下设备驱动程序分类Linux驱动程序设计字符设备:是指存取时没有缓存的设备。典型的字符设备包括键盘,鼠标,串行口等。块设备:块设备的读写都有缓存来支持,但是块设备必须才能随机存取(randomaccess)。典型的块设备主要包括硬碟软驱设备,CD-ROM等。网路设备:Linux的网路系统主要是基于BSDunix的socket机制。在系统和驱动程序之间定义有专门的数据结构(sk_buff)进行数据的传递。系统里支持对发送数据和接收数据的缓存,提供流量控制机制,提供对多合同结婚合同模板下载合伙人合同下载渠道分销合同免费下载讲课合同下载敬业合同下载的支持。Linux下设备驱动程序组成Linux驱动程序设计手动配置和初始化子程序:负责检查所要驱动的硬件设备是否存在和是否能正常工作。
假如该设备正常,则对这个设备及其相关的、设备驱动程序须要的软件状态进行初始化。这部份驱动程序仅在初始化的时侯被调用一次。服务于I/O恳求的子程序:调用这部份是因为系统调用的结果。这部份程序在执行的时侯,系统仍觉得是和进行调用的进程属于同一个进程,只是由用户态弄成了核态度,具有进行此系统调用的用户程序的运行环境,因而可以在其中调用sleep()等与进程运行环境有关的函数。中断服务子程序:Linux下设备驱动程序I/O设备入口点1Linux驱动程序设计在系统内部,I/O设备的存取通过一组固定的入口点来进行,这组入口点是由每位设备的设备驱动程序提供的。而入口点由一个文件操作结构()向系统进行说明。通常来说,字符型设备驱动程序才能提供如下几个入口点:open:打开设备打算I/O操作。对字符非常设备文件进行打开操作linux安全加固,还会调用设备的open入口点。open子程序必须对即将进行的I/O操作做好必要的打算工作,如消除缓冲区等。假如设备是独占的,即同一时刻只能有一个程序访问此设备,则open子程序必须设置一些标志以表示设备处于忙状态。close:关掉一个设备。当最后一次使用设备终结后,调用close子程
序。独占设备必须标记设备可再度使用。Linux下设备驱动程序I/O设备入口点2Linux驱动程序设计write:往设备上写数据。对于有缓冲区的I/O操作,通常是把数据写入缓冲区里。对字符非常设备文件进行写操作将调用write子程序。ioctl:执行读、写之外的操作。select:检测设备,看数据是否可读或设备是否可用于写数据。select系统调用在检测与设备非常文件相关的文件描述符时使用select入口点。假如设备驱动程序没有提供上述入口点中的某一个,系统会用缺省的子程序来替代。对于不同的系统,也还有一些其它的入口点。Read:从设备上读数据。对于有缓冲区的I/O操作,通常是从缓冲区里读数据。对字符非常设备文件进行读操作将调用read子程序。Linux下设备驱动程序I/O设备入口点3在用户自己的驱动程序中,首先要依照驱动程序的功能,完成结构中的函数的实现不须要的函数插口可以直接在结构中初始化为NULL每位进程对设备的操作,就会按照主次设备号,转换成对结构的访问设备驱动程序的开发过程查看原理图,理解设备的工作原理。定义设备号。设备由一个主设备号和一个次设备号来标示。主设备号唯一标示了设备类型,即设备驱动程序类型,它是块设备表或字符设备表项的索引实现初始化函数。在驱动程序中实现驱动的注册和卸载设计所要实现的文件操作,定义结构设备驱动程序的开发过程实现所需的文件操作调用,如read、write等实现中断服务,并用request_irq向内核注册,中断并不是每位设备驱动所必需的。编译该驱动程序到内核中,或则用insmod命令加载模块测试该设备,编撰应用程序,对驱动程序进行测试Linux下设备注册1Linux驱动程序设计设备驱动程序所提供的入口点,在设备驱动程序初始化的时侯向系统进行登记,便于系统在适当的时侯调用。Linux系统里,通过调用register_chrdev向系统注册字符型设备驱动程序。register_chrdev定义为:#include#includeintregister_chrdev(unsignedintmajor,constchar*name,struct*fops);其中,major是为设备驱动程序向系统申请的主设备号,倘若为0则系统因此驱动程序动态地分配一个主设备号。na
me是设备名。fops是该驱动各个的入口点的文件操作结构表针。Linux下设备注册2Linux驱动程序设计此函数返回0表示成功。返回-EINVAL表示申请的主设备号非法,通常来说是主设备号小于系统所容许的最大设备号。返回-EBUSY表示所申请的主设备号正在被其它设备驱动程序使用。若果是动态分配主设备号成功,此函数将返回所分配的主设备号。假如register_chrdev操作成功,设备名都会出现在/proc/devices文件里。初始化部份通常还负责给设备驱动程序申请系统资源,包括显存、中断、时钟、I/O端口等,这种资源也可以在open子程序或别的地方申请。在这种资源不用的时侯,应当释放它们,以利于资源的共享。Linux下中断处理Linux驱动程序设计在Linux系统里,对中断的处理是属于系统核心的部份,因而假如设备与系统之间以中断方法进行数据交换的话,就必须把该设备的驱动程序作为系统核心的一部份。设备驱动程序通过调用request_irq函数来申请中断,通过free_irq来释放中断。Linux下显存分配、释放Linux驱动程序设计作为系统核心的一部份,设备驱动程序在申请和释放显存时不是调用malloc和free,而代之以调用kmalloc和kfree,它们被定义为:#includevoid*kmalloc(unsignedintlen,intpriority);voidkfree(void*obj);参数len为希望申请的字节数,obj为要释放的显存表针。priority为分配显存操作的优先级,即在没有足够空闲显存时怎么操作,通常用GFP_KERNEL。Linux下显存分配、释放Linux驱动程序设计使用一个没有申请的I/O端口不会使CPU形成异常,也就不会引起例如“segmentationfault”一类的错误发生。任何进程都可以访问任何一个I/O端口。此时系统难以保证对I/O端口的操作不会发生冲突,甚至会为此而使系统崩溃。为此,在使用I/O端口前,应当检测此I/O端口是否已有别的程序在使用,若没有,再把此端口标记为正在使用linux操作系统简介,在使用完之后释放它。intcheck_region(unsignedintfrom,unsignedintextent);voidrequest_region(unsignedintf
rom,unsignedintextent,constchar*name);voidrelease_region(unsignedintfrom,unsignedintextent);Linux下开关中断函数Linux驱动程序设计在设备驱动程序里,通过如下函数实现打开和关掉中断功能:#include#definecli()__asm____volatile__("cli"::)#definesti()__asm____volatile__("sti"::)Linux下用户态和核态度数据访问Linux驱动程序设计在设备驱动程序里,还可能会用到如下的一些系统函数:#includevoidmemcpy_fromfs(void*to,constvoid*from,unsignedlongn);voidmemcpy_tofs(void*to,constvoid*from,unsignedlongn);在用户程序调用read、write时,由于进程的运行状态由用户态变为核态度,地址空间也变为核心地址空间。而read、write中参数buf是指向用户程序的私有地址空间的,所以不能直接访问,必须通过上述两个系统函数来访问用户程序的私有地址空间。memcpy_fromfs由用户程序地址空间往核心地址空间复制,memcpy_tofs则反之。参数to为复制的目的表针,from为源表针,n为要复制的字节数。Linux下设备驱动程序举例Linux驱动程序设计模块加载设备初始化设备入口点实现静态编译驱动程序进内核Linux驱动程序设计模块初始化函数设备初始化Linux驱动程序设计文件操作结构申明设备入口点实现Linux驱动程序设计readwrite常常不断地学习,你就哪些都晓得。你晓得得越多,你就越有力量StudyConstantly,AndYouWillKnowEverything.TheMoreYouKnow,TheMorePowerfulYouWillBe学习总结结束语当你尽了自己的最大努力时,失败也是伟大的,所以不要舍弃,坚持就是正确的。WhenYouDoYourBest,FailureIsGreat,SoDon'TGiveUp,StickToTheEnd讲演人:XXXXXX时间:XX年XX月XX日