




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、2021-11-17 武汉创维特武汉创维特Linux运用程序Linux运用程序设计q编写程序编写程序q编写编写MakefileMakefile文件文件q编译编译q运转运转编写helloworld文件qHelloworldHelloworld程序是一个只在输出控制台上打印出程序是一个只在输出控制台上打印出“hellohello,worldworld字串的程序字串的程序q#include #include qint main()int main()q qprintf(printf(“hello,world!nhello,world!n););q 编写Makefile文件Linux运用程序设计指定编
2、译器生成的执行文件和链接过程中的目的文件 编译和链接的参数 编译命令 拷贝helloworld映像文件到/tftpboot/examples中去除编译器q 编译x86平台采用的gcc编译器q #gcc o helloworld helloworld.cq 编译ARM平台采用的arm-linux-gcc编译器q #arm-linux-gcc o helloworld helloworld.c编译q #/usr/local/arm/2.95.3/bin/arm-linux-gcc o helloworld helloworld.cq 假设有Makefile文件q #makeLinux运用程序运转1
3、Linux运用程序设计q运用程序运转可以采用如下两种方式:运用程序运转可以采用如下两种方式:q在在LinuxLinux内核启动起来,并且有方法从主机获取文件时,内核启动起来,并且有方法从主机获取文件时,可以在可以在LinuxLinux控制台直接从主机获取编译后的运用程序。可以控制台直接从主机获取编译后的运用程序。可以经过经过ftpftp、nfsnfs、sshssh等方式到达。等方式到达。q也可以在编译运用程序后将该运用程序拷贝到也可以在编译运用程序后将该运用程序拷贝到ramdiskramdisk中,中,然后重新制造然后重新制造ramdiskramdisk,并更新,并更新ramdiskramdi
4、sk文件系统,此时新的程文件系统,此时新的程序将在文件系统中。序将在文件系统中。Linux运用程序运转2q JXARM9-2410经过NFS将主机的/tftpboot/目录挂接到目的机的/mnt/nfs目录下q #mount 80:/tftpboot/ /mnt/nfsq #cd /mnt/nfs/examplesq #./helloworldLinux运用程序运转3Linux运用程序设计q重新编译内核时,通常将运用程序添加到重新编译内核时,通常将运用程序添加到LinuxLinux文件系统文件系统的的binbin目录,该目录有全局途径。且该文件应该具有执行属性,目录,该目
5、录有全局途径。且该文件应该具有执行属性,可以经过如下命令修正:可以经过如下命令修正:qchmod 777 leddemochmod 777 leddemoq在新内核启动后,直接在命令行输入文件名即可运转。在新内核启动后,直接在命令行输入文件名即可运转。q当直接在当直接在LinuxLinux控制台中从主机上获取运用程序时,必需控制台中从主机上获取运用程序时,必需保管到可写的位置,且经过如下命令执行该程序:保管到可写的位置,且经过如下命令执行该程序:q./leddemo./leddemo配置Linux运用程序启动后自动运转Linux运用程序设计q假设需求在系统启动以后自动运转假设需求在系统启动以后
6、自动运转helloworldhelloworld程序,需求程序,需求编辑编辑ramdiskramdisk中的启动脚本文件,该文件为中的启动脚本文件,该文件为qroot/rd/etc/init.d/rcSroot/rd/etc/init.d/rcSq运用运用vivi编辑器编辑,在该文件最后添加如下脚本:编辑器编辑,在该文件最后添加如下脚本:q/bin/helloworld/bin/helloworldq该脚本将启动后运转该脚本将启动后运转helloworld helloworld ,直到程序退出。或,直到程序退出。或q/bin/ helloworld &/bin/ helloworld
7、&q它将在后台运转它将在后台运转helloworldhelloworld,不影响其他的程序运转。,不影响其他的程序运转。linux驱动程序Linux驱动程序设计qLinuxLinux下对外设的访问只能经过驱动程序进展下对外设的访问只能经过驱动程序进展qLinuxLinux具有一致的驱动程序接口,以文件操作的方式管理驱具有一致的驱动程序接口,以文件操作的方式管理驱动程序,如:动程序,如:openopen、readread、writewrite、ioctlioctlq驱动程序是内核的一部分,可以运用中断、驱动程序是内核的一部分,可以运用中断、DMADMA等操作等操作q驱动程序需求在用户态和
8、内核态之间传送数据驱动程序需求在用户态和内核态之间传送数据设备驱动程序的概念q 对硬件的控制涉及存放器中各位的操作,通常这些操作与设备直接相关并且对时序的要求非常严厉,假设这些任务都交由运用程序员来担任,那么对硬件设备的编程将变得异常复杂而困难。q 驱动程序的作用正是要屏蔽硬件的这些底层细节,从而简化运用程序的编写。q 操作系统普通提供设备驱动程序来完成对特定硬件的控制,以建立运用程序和设备之间的笼统接口,而不是运用程序直接操作硬件。设备驱动程序的概念q 设备驱动程序实践是处置和操作硬件控制器的软件,从本质上讲,是内核中具有最高特权级的、驻留内存的、可共享的底层硬件处置例程。q Linux 操
9、作系统将一切的设备全部看成文件,都纳入文件系统的范畴,并经过文件的操作界面进展操作。q 普通来说,是把设备映射为一个特殊的设备文件,用户程序可以像对其他文件一样对此设备文件进展操作。q 设备文件的属性由三部分信息组成:文件的类型,主设备号,次设备号设备驱动程序的概念q 驱动程序是内核的一部分,是操作系统内核与硬件设备的直接接口,驱动程序屏蔽了硬件的细节,完成以下功能:q 对设备初始化和释放q 对设备进展管理,包括实时参数设置,以及提供对设备的操作接口q 读取运用程序传送给设备文件的数据或回送运用程序恳求的数据q 检测和处置设备出现的错误Linux驱动程序Linux驱动程序设计qLinuxLin
10、ux屏蔽了运用层对外设的直接访问,不能在用户态直屏蔽了运用层对外设的直接访问,不能在用户态直接进展如下操作:接进展如下操作:q* *(unsigned char (unsigned char * *)0 x02000006) =0 x3e;)0 x02000006) =0 x3e;qLinuxLinux下用户态无法处置中断下用户态无法处置中断qLinuxLinux下对外设的访问引荐采用驱动程序进展,在内核态下对外设的访问引荐采用驱动程序进展,在内核态编写驱动程序包括直接对外设操作、处置中断等,用户编写驱动程序包括直接对外设操作、处置中断等,用户态经过规范驱动程序调用方法进展操作。态经过规范驱动
11、程序调用方法进展操作。Linux驱动程序编译方式Linux驱动程序设计qLinuxLinux中驱动程序的运用可以按照两种方式编译:中驱动程序的运用可以按照两种方式编译:q一种是静态编译进内核一种是静态编译进内核q另一种是编译成模块以供动态加载另一种是编译成模块以供动态加载q由于由于LinuxLinux不支持模块动态加载,而且嵌入式不支持模块动态加载,而且嵌入式LinuxLinux不可不可以象桌面以象桌面LinuxLinux那样灵敏的运用那样灵敏的运用insmod/rmmodinsmod/rmmod加载卸载设备驱加载卸载设备驱动程序,因此通常在动程序,因此通常在LinuxLinux中将设备驱动程
12、序静态编译进内核。中将设备驱动程序静态编译进内核。Linux下设备驱动程序分类Linux驱动程序设计q字符设备:是指存取时没有缓存的设备。典型的字符设字符设备:是指存取时没有缓存的设备。典型的字符设备包括鼠标,键盘,串行口等。备包括鼠标,键盘,串行口等。q块设备:块设备的读写都有缓存来支持,并且块设备必块设备:块设备的读写都有缓存来支持,并且块设备必需可以随机存取需可以随机存取(random(randomaccess) access) 。典型的块设备主要包括。典型的块设备主要包括硬盘软盘设备,硬盘软盘设备,CD-ROMCD-ROM等。等。q网络设备:网络设备:LinuxLinux的网络系统主要
13、是基于的网络系统主要是基于BSDBSDunixunix的的socketsocket机制。在系统和驱动程序之间定义有专门的数据构造机制。在系统和驱动程序之间定义有专门的数据构造(sk_buff)(sk_buff)进展数据的传送。系统里支持对发送数据和接纳数进展数据的传送。系统里支持对发送数据和接纳数据的缓存,提供流量控制机制,提供对多协议的支持。据的缓存,提供流量控制机制,提供对多协议的支持。Linux下设备驱动程序组成Linux驱动程序设计q自动配置和初始化子程序:自动配置和初始化子程序:q担任检测所要驱动的硬件设备能否存在和能否能正常任担任检测所要驱动的硬件设备能否存在和能否能正常任务。假设
14、该设备正常,那么对这个设备及其相关的、设备驱务。假设该设备正常,那么对这个设备及其相关的、设备驱动程序需求的软件形状进展初始化。这部分驱动程序仅在初动程序需求的软件形状进展初始化。这部分驱动程序仅在初始化的时候被调用一次。始化的时候被调用一次。q效力于效力于I/OI/O恳求的子程序:恳求的子程序:q调用这部分是由于系统调用的结果。这部分程序在执行调用这部分是由于系统调用的结果。这部分程序在执行的时候,系统仍以为是和进展调用的进程属于同一个进程,的时候,系统仍以为是和进展调用的进程属于同一个进程,只是由用户态变成了中心态,具有进展此系统调用的用户程只是由用户态变成了中心态,具有进展此系统调用的用
15、户程序的运转环境,因此可以在其中调用序的运转环境,因此可以在其中调用sleep()sleep()等与进程运转环等与进程运转环境有关的函数。境有关的函数。q中断效力子程序:中断效力子程序:Linux下设备驱动程序I/O设备入口点1Linux驱动程序设计q在系统内部,在系统内部,I/OI/O设备的存取经过一组固定的入口点来进设备的存取经过一组固定的入口点来进展,这组入口点是由每个设备的设备驱动程序提供的。而入展,这组入口点是由每个设备的设备驱动程序提供的。而入口点由一个文件操作构造口点由一个文件操作构造(file_operations)(file_operations)向系统进展阐明。向系统进展阐
16、明。普通来说,字符型设备驱动程序可以提供如下几个入口点:普通来说,字符型设备驱动程序可以提供如下几个入口点:qopenopen:翻开设备预备:翻开设备预备I/OI/O操作。对字符特别设备文件进展操作。对字符特别设备文件进展翻开操作,都会调用设备的翻开操作,都会调用设备的openopen入口点。入口点。openopen子程序必需对子程序必需对将要进展的将要进展的I/OI/O操作做好必要的预备任务,如去除缓冲区等。操作做好必要的预备任务,如去除缓冲区等。假设设备是独占的,即同一时辰只能有一个程序访问此设备,假设设备是独占的,即同一时辰只能有一个程序访问此设备,那么那么openopen子程序必需设置
17、一些标志以表示设备处于忙形状。子程序必需设置一些标志以表示设备处于忙形状。qcloseclose:封锁一个设备。当最后一次运用设备终结后,调:封锁一个设备。当最后一次运用设备终结后,调用用closeclose子程序。独占设备必需标志设备可再次运用。子程序。独占设备必需标志设备可再次运用。Linux下设备驱动程序I/O设备入口点2Linux驱动程序设计qwritewrite:往设备上写数据。对于有缓冲区的:往设备上写数据。对于有缓冲区的I/OI/O操作,普操作,普通是把数据写入缓冲区里。对字符特别设备文件进展写操作通是把数据写入缓冲区里。对字符特别设备文件进展写操作将调用将调用writewrit
18、e子程序。子程序。qioctlioctl:执行读、写之外的操作。:执行读、写之外的操作。qselectselect:检查设备,看数据能否可读或设备能否可用于:检查设备,看数据能否可读或设备能否可用于写数据。写数据。selectselect系统调用在检查与设备特别文件相关的文件系统调用在检查与设备特别文件相关的文件描画符时运用描画符时运用selectselect入口点。假设设备驱动程序没有提供上入口点。假设设备驱动程序没有提供上述入口点中的某一个,系统会用缺省的子程序来替代。对于述入口点中的某一个,系统会用缺省的子程序来替代。对于不同的系统,也还有一些其它的入口点。不同的系统,也还有一些其它的入
19、口点。qReadRead:从设备上读数据。对于有缓冲区的:从设备上读数据。对于有缓冲区的I/OI/O操作,普通操作,普通是从缓冲区里读数据。对字符特别设备文件进展读操作将调是从缓冲区里读数据。对字符特别设备文件进展读操作将调用用readread子程序。子程序。Linux下设备驱动程序I/O设备入口点3q 在用户本人的驱动程序中,首先要根据驱动程序的功能,完成 file_operations 构造中的函数的实现q 不需求的函数接口可以直接在 file_operations 构造中初始化为 NULLq 每个进程对设备的操作,都会根据主次设备号,转换成对 file_operations 构造的访问设
20、备驱动程序的开发过程q 查看原理图,了解设备的任务原理。q 定义设备号。设备由一个主设备号和一个次设备号来标识。主设备号独一标识了设备类型,即设备驱动程序类型,它是块设备表或字符设备表项的索引q 实现初始化函数。在驱动程序中实现驱动的注册和卸载q 设计所要实现的文件操作,定义 file_operations 构造设备驱动程序的开发过程q实现所需的文件操作调用,如 read、write 等q实现中断效力,并用 request_irq 向内核注册,中断并不是每个设备驱动所必需的。q编译该驱动程序到内核中,或者用insmod命令加载模块q测试该设备,编写运用程序,对驱动程序进展测试Linux下设备注
21、册1Linux驱动程序设计q设备驱动程序所提供的入口点,在设备驱动程序初始化设备驱动程序所提供的入口点,在设备驱动程序初始化的时候向系统进展登记,以便系统在适当的时候调用。的时候向系统进展登记,以便系统在适当的时候调用。LinuxLinux系统里,经过调用系统里,经过调用register_chrdevregister_chrdev向系统注册字符型设备驱向系统注册字符型设备驱动程序。动程序。register_chrdevregister_chrdev定义为:定义为:q#include #include q#include #include qint register_chrdev(unsigne
22、d int major, const int register_chrdev(unsigned int major, const char char * *name,name,q struct file_operations struct file_operations * *fops);fops);q其中,其中,majormajor是为设备驱动程序向系统恳求的主设备号,是为设备驱动程序向系统恳求的主设备号,假设为假设为0 0那么系统为此驱动程序动态地分配一个主设备号。那么系统为此驱动程序动态地分配一个主设备号。namename是设备名。是设备名。fopsfops是该驱动各个的入口点的文件操作
23、构造是该驱动各个的入口点的文件操作构造指针。指针。Linux下设备注册2Linux驱动程序设计q此函数前往此函数前往0 0表示胜利。前往表示胜利。前往-EINVAL-EINVAL表示恳求的主设备表示恳求的主设备号非法,普通来说是主设备号大于系统所允许的最大设备号。号非法,普通来说是主设备号大于系统所允许的最大设备号。前往前往-EBUSY-EBUSY表示所恳求的主设备号正在被其它设备驱动程序表示所恳求的主设备号正在被其它设备驱动程序运用。假设是动态分配主设备号胜利,此函数将前往所分配运用。假设是动态分配主设备号胜利,此函数将前往所分配的主设备号。假设的主设备号。假设register_chrdev
24、register_chrdev操作胜利,设备名就会出操作胜利,设备名就会出如今如今/proc/devices/proc/devices文件里。文件里。q初始化部分普通还担任给设备驱动程序恳求系统资源,初始化部分普通还担任给设备驱动程序恳求系统资源,包括内存、中断、时钟、包括内存、中断、时钟、I/OI/O端口等,这些资源也可以在端口等,这些资源也可以在openopen子程序或别的地方恳求。在这些资源不用的时候,应该释放子程序或别的地方恳求。在这些资源不用的时候,应该释放它们,以利于资源的共享。它们,以利于资源的共享。Linux下中断处置Linux驱动程序设计q在在LinuxLinux系统里,对中
25、断的处置是属于系统中心的部分,系统里,对中断的处置是属于系统中心的部分,因此假设设备与系统之间以中断方式进展数据交换的话,就因此假设设备与系统之间以中断方式进展数据交换的话,就必需把该设备的驱动程序作为系统中心的一部分。设备驱动必需把该设备的驱动程序作为系统中心的一部分。设备驱动程序经过调用程序经过调用request_irqrequest_irq函数来恳求中断,经过函数来恳求中断,经过free_irqfree_irq来来释放中断。释放中断。Linux下内存分配、释放Linux驱动程序设计q作为系统中心的一部分,设备驱动程序在恳求和释放内作为系统中心的一部分,设备驱动程序在恳求和释放内存时不是调
26、用存时不是调用mallocmalloc和和freefree,而代之以调用,而代之以调用kmallockmalloc和和kfreekfree,它们被定义为:它们被定义为:q#include #include qvoid void * * kmalloc(unsigned int len, int priority); kmalloc(unsigned int len, int priority);qvoid kfree(void void kfree(void * * obj); obj);q参数参数lenlen为希望恳求的字节数,为希望恳求的字节数,objobj为要释放的内存指针。为要释放的内
27、存指针。prioritypriority为分配内存操作的优先级,即在没有足够空闲内存为分配内存操作的优先级,即在没有足够空闲内存时如何操作,普通用时如何操作,普通用GFP_KERNELGFP_KERNEL。Linux下内存分配、释放Linux驱动程序设计q运用一个没有恳求的运用一个没有恳求的I/OI/O端口不会使端口不会使CPUCPU产生异常,也就产生异常,也就不会导致诸如不会导致诸如“segmentation faultsegmentation fault一类的错误发生。任何一类的错误发生。任何进程都可以访问任何一个进程都可以访问任何一个I/OI/O端口。此时系统无法保证对端口。此时系统无法
28、保证对I/OI/O端口的操作不会发生冲突,甚至会因此而使系统解体。端口的操作不会发生冲突,甚至会因此而使系统解体。q因此,在运用因此,在运用I/OI/O端口前,应该检查此端口前,应该检查此I/OI/O端口能否已有端口能否已有别的程序在运用,假设没有,再把此端口标志为正在运用,别的程序在运用,假设没有,再把此端口标志为正在运用,在运用完以后释放它。在运用完以后释放它。qint check_region(unsigned int from, unsigned int int check_region(unsigned int from, unsigned int extent);extent);q
29、void request_region(unsigned int from, unsigned void request_region(unsigned int from, unsigned int extent,int extent,q const char const char * *name);name);qvoid release_region(unsigned int from, unsigned void release_region(unsigned int from, unsigned int extent);int extent);Linux下开关中断函数Linux驱动程序设计q在设备驱动程序里,经过如下函数实现翻开和封锁中断在设备驱动程序里,经过如下函数实现翻开和封锁中断功能:功能:q#include #include q#define cli() _asm_ _volatile_ (cli:)#define cli() _asm_ _volatile_ (cli:)q#def
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 上海长宁金杯出租合同样本
- 农村商品房买房合同样本
- 2025关于医疗服务机构医疗器械集中采购议标合同书
- 人工制作合同标准文本
- vi设计个人合同样本
- 2025国内货物买卖合同模板(正式)
- 冷库改造安装合同样本
- 信贷资产信托合同样本
- 冷库改造租赁合同标准文本
- 假冒伪劣合同样本
- 16J914-1 公用建筑卫生间
- 重庆市事业单位专业技术二级岗位管理试行办法
- 信息技术2.0微能力:小学五年级道德与法治上(第四单元) 民族瑰宝-中小学作业设计大赛获奖优秀作品模板-《义务教育道德与法治课程标准(2022年版)》
- 全球松子分析预测报告
- 英国FBA超重标签
- JJF1101-2019环境试验设备温度、湿度校准规范-(高清现行)
- 环境艺术与室内设计专业室内设计手绘表现技法教学课件(图文)
- 混凝土缝之宅
- TSG11-2020 锅炉安全技术规程
- 警察查缉战术讲义
- 人教版八年级物理下册 第八章 运动和力 练习题(含答案)
评论
0/150
提交评论