实验二Linux基本应用程序编写
发布时间:2023-02-10 14:50:48 所属栏目:应用 来源:
导读: 实验二Linux应用程序编写一、实验目的1、熟悉Linux开发环境2、掌握简单的Helloworld的编译3、掌握教学系统中的Linux应用程序的调试编写程序编写Makefile文件编译运行二实验内容三、预备知识C语言的基础知识VI的使
实验二Linux应用程序编写一、实验目的1、熟悉Linux开发环境2、掌握简单的Helloworld的编译3、掌握教学系统中的Linux应用程序的调试编写程序编写Makefile文件编译运行二实验内容三、预备知识C语言的基础知识VI的使用Linux的基本操作3.1C语言的基础知识#includeintmain(){printf(“Hello,world!\n”);}3.2Vi的使用1、VI编辑器---REDHAT缺省文本编辑器2、VI的操作(1)启动vi$vi.*如果当前目录下的文件存在,打开该文件第一页;若不存在,将创建该文件,同时有黑屏出现后缀名.c请加上!3.2Vi的使用2、VI的操作(2)vi的基本模式命令模式文本输入模式i/a:命令模式文本模式ESC:文本模式命令模式一般进入VI后,默认为命令模式。可以观察窗口左下方的提示。3.2Vi的使用3、VI的操作(3)命令模式下常用的操作:w保存,不退出:wq保存,退出:q!不保存,退出:w用其他文件名保存:w!在现有文件中保存并覆盖文件3.3Linux的基础知识1.mkdir(1)作用:建立子目录(2)格式:mkdir[option]目录名(3)实例:$cd/home/cvtech/cvtpxa270/examples$mkdirhelloworld$cdhelloworld3.3Linux的基础知识2.ls(1)作用:显示目录内容(2)格式:ls[option]目录名(3)实例:$cd/home/cvtech/cvtpxa270/examples$mkdirhelloworld$cdhelloworld$ls3.3Linux的基础知识3.cp(1)作用:复制文件(2)格式:cp/源目录名/源文件名/新目录/新文件名4.mv(1)作用:移动文件(2)格式:mv/源目录名/源文件名/新目录/新文件名3.3Linux的基础知识5.删除(1)文件删除----rm格式:rm/目录名/文件名(2)文件夹删除----rmdir格式:rmdir/目录名rmdir-rf/目录名强制删除所有文件3.3Linux的基础知识6.目录切换(1)cd/回根目录(2)cd..回上层目录(3)cd回登录用户主目录7.执行命令./可执行文件名四、实验步骤(1)关机接上串口后,网线,重新打开计算机(2)开虚拟机,进入RedHat,打开一个终端窗口 (3)检查实验箱串口,网线,电源线是否接好。接好后,修改PC机的IP地址,打开桌面DNW终端。配置完成DNW后,打开实验箱电源,等待DNW终端的U-BOOT信息。(4)成功后,首先进入Linux系统(实验一)0、实验准备四、实验步骤$cd/home/cvtech/cvtpxa270/examples$mkdirhelloworld$cdhelloworld1、建立工作目录2、进入vi,编写源代码,文件名务必以.c结尾$gcc–ohelloworldhelloworld.c$./helloworld正确的话,在主机显示窗口打印Hello,world!3、主机端编译运行helloworld程序4、编译目标机运行的程序$/usr/local/arm-linux/bin/arm-linux-gcc-ohelloworldhelloworld.c$cphelloworld/t目标机操作(DNW窗口下)#mount-onolock192.168.1.180:/t/mnt/nfs#cd/mnt/nfs/examples/#./helloworld正确的话:在DNW窗口输出Hello,world!5、下载到实验箱(1)与编写源代码一样,通过vi编写#viMakefile*和源代码文件在同一个文件夹下(2)定义编译规则,类似于一个批处理命令。 makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。6、编写Makefile文件编写Makefile文件指定编译器生成的执行文件和链接过程中的目标文件编译和链接的参数编译命令拷贝helloworld映像文件到/t中清除(3)用make命令编译$makeclean$make(4)下载参照5、下载到实验箱$cphelloworld/t目标机操作(DNW窗口下)#mount-onolock192.168.1.180:/t/mnt/nfs#cd/mnt/nfs/examples/#./helloworld正确的话:在DNW窗口输出Hello,world!6、编写Makefile文件Linux应用程序运行1应用程序运行可以采用如下两种方式:在Linux内核启动起来,并且有办法从主机获取文件时,可以在Linux控制台直接从主机获取编译后的应用程序。可以通过ftp、nfs、ssh等方式达到。也可以 在编译应用程序后将该应用程序拷贝到ramdisk中,然后重新制作ramdisk,并更新ramdisk文件系统,此时新的程序将在文件系统中。Linux应用程序运行3重新编译内核时,通常将应用程序添加到Linux文件系统的bin目录,该目录有全局路径。且该文件应该具有执行属性,可以通过如下命令修改:chmod777leddemo在新内核启动后,直接在命令行输入文件名即可运行。当直接在Linux控制台中从主机上获取应用程序时,必须保存到可写的位置,且通过如下命令执行该程序:./leddemo配置Linux应用程序启动后自动运行如果需要在系统启动以后自动运行helloworld程序,需要编辑ramdisk中的启动脚本文件,该文件为root/rd/etc/init.d/rcS使用vi编辑器编辑,在该文件最后添加如下脚本:/bin/helloworld该脚本将启动后运行helloworld,直到程序退出。或/bin/helloworld&它将在后台运行helloworld,不影响其他的程序运行。8.6Linux驱动程序Linux下对外设的访问只能通过驱动程序进行Linux具有统一的驱动程序接口,以文件操作的方式管理驱动程序应用程序编写,如:open、read、write、ioctl…驱动程序是内核的一部分,可以使用中断、DMA等操作驱动程序需要在用户态和内核态之间传递数据Linux驱动程序Linux屏蔽了应用层对外设的直接访问,不能在用户态直接进行如下操作:*((unsignedchar*)0x02000006)=0x3e;Linux下用户态无法处理中断Linux下对外设的访问推荐采用驱动程序进行,在内核态编写驱动程序(包括直接对外设操作、处理中断等),用户态通过标准驱动程序调用方法进行操作。 Linux驱动程序编译方式Linux中驱动程序的使用可以按照两种方式编译:静态编译进内核编译成模块以供动态加载由于Linux不支持模块动态加载,而且嵌入式Linux不能够象桌面Linux那样灵活的使用insmod/rmmod加载卸载设备驱动程序,因而通常在Linux中将设备驱动程序静态编译进内核。Linux下设备驱动程序分类字符设备:是指存取时没有缓存的设备。典型的字符设备包括鼠标,键盘,串行口等。块设备:块设备的读写都有缓存来支持,并且块设备必须能够随机存取(randomaccess)。典型的块设备主要包括硬盘软盘 设备,CD-ROM等。网络设备:Linux的网络系统主要是基于BSDunix的socket机制。在系统和驱动程序之间定义有专门的数据结构(sk_buff)进行数据的传递。系统里支持对发送数据和接收数据的缓存,提供流量控制机制,提供对多协议离婚协议书模板免费下载离婚协议模板下载离婚协议书范本免费下载合伙人协议 下载渠道分销协议免费下载的支持。Linux下设备驱动程序组成自动配置和初始化子程序:负责检测所要驱动的硬件设备是否存在和是否能正常工作。如果该设备正常,则对这个设备及其相关的、设备驱动程序需要的软件状态进行初始化。这部分驱动程序仅在初始化的时候被调用一次。服务于I/O请求的子程序:调用这部分是由于系统调用的结果。这部分程序在执行的时候,系统仍认为是和进行调用的进程属于同一个进程,只是由用户态变成了核心态,具有进行此系统调用的用户程序的运行环境,因此可以在其中调用sleep()等与进程运行环境有关的函数。中断服务子程序:Linux下设备驱动程序I/O设备入口点1在系统内部,I/O设备的存取通过一组固定的入口点来进行,这组入口点是由每个设备的设备驱动程序提供的。一般来说,字符型设备驱动程序能够提供如下几个入口点:open:打开设备准备I/O操作。 对字符特别设备文件进行打开操作,都会调用设备的open入口点。open子程序必须对将要进行的I/O操作做好必要的准备工作,如清除缓冲区等。如果设备是独占的,即同一时刻只能有一个程序访问此设备,则open子程序必须设置一些标志以表关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf示设备处于忙状态。close:关闭一个设备。当最后一次使用设备终结后,调用close子程序。独占设备必须标记设备可再次使用。Read:从设备上读数据。对于有缓冲区的I/O操作,一般是从缓冲区里读数据。对字符特别设备文件进行读操作将调用read子程序。Linux下设备驱动程序I/O设备入口点2write:往设备上写数据。对于有缓冲区的I/O操作,一般是把数据写入缓冲区里。对字符特别设备文件进行写操作将调用write子程序。ioctl:执行读、写之外的操作。select:检查设备,看数据是否可读或设备是否可用于写数据。select系统调用在检查与设备特别文件相关的文件描述符时使用select入口点。如果设备驱动程序没有提供上述入口点中的某一个,系统会用缺省的子程序来代替。对于不同的系统,也还有一些其它的入口点。Linux下设备注册1设备驱动程序所提供的入口点,在设备驱动程序初始化的时候向系统进行登记,以便系统在适当 的时候调用。Linux系统里,通过调用register_chrdev向系统注册字符型设备驱动程序。register_chrdev定义为:#include#includeintregister_chrdev(unsignedintmajor,constchar*name,struct*fops);其中,major是为设备驱动程序向系统申请的主设备号,如果为0则系统为此驱动程序动态地分配一个主设备号。name是设备名。fops是该驱动各个的入口点的文件操作结构指针。Linux下设备注册2此函数返回0表示成功。返回-EINVAL表示申请的主设备号非法,一般来说是主设备号大于系统所允许的最大设备号。返回-EBUSY表示所申请的主设备号正在被其它设备驱动程序使用。如果是动态分配主设备号成功,此函数将返回所分配的主设备号。如果register_chrdev操作成功,设备名就会出现在/proc/devices文件里。初始化部分一般还负责给设备驱动程序申请系统资源,包括内存、中断、时钟、I/O端口等,这些资源也可以在open子程序或别的地方申请。在这些资源不用的时候,应该释放它们,以利于资源的共享。Linux下中断处理在Linux系统里,对中断的处理是属于系统核心的部分,因此如果设备与系统之间以中断方式进行数据交换的话,就必须把该设备的驱动程序作为系统核心的一部分。设备驱动程序通过调用request_irq函数来申请中断,通过free_irq来释放中断。Linux下内存分配、释放作为系统核心的一部分,设备驱动程序在申请和释放内存时不是调用malloc和free,而代之以调用kmalloc和kfree,它们被定义为:#includevoid*kmalloc(unsignedintlen,intpriority);voidkfree(void*obj);参数len为希望申请的字节数,obj为要释放的内存指针。priority为分配内存操作的优先级,即在没有足够空闲内存时如何操作,一般用GFP_KERNEL。Linux下内存分配、释放使用一个没有申请的I/O端口不会使CPU产生异常,也就不会导致诸如“segmentationfault”一类的错误发生。任何进程都可以访问任何一个I/O端口。此时系统无法保证对I/O端口的操 作不会发生冲突,甚至会因此而使系统崩溃。因此,在使用I/O端口前,应该检查此I/O端口是否已有别的程序在使用,若没有,再把此端口标记为正在使用,在使用完以后释放它。intcheck_region(unsignedintfrom,unsignedintextent);voidrequest_region(unsignedintfrom,unsignedintextent,constchar*name);voidrelease_region(unsignedintfrom,unsignedintextent);Linux下开关中断函数在设备驱动程序里,通过如下函数实现打开和关闭中断功能:#include#definecli()__asm____volatile__("cli"::)#definesti()__asm____volatile__("sti"::)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下设备驱动程序举例模块加载设备初始化设备入口点实现静态编译驱动程序进内核模块初始化函数设备初始化文件操作结构声明结束语当你尽了自己的最大努力时,失败也是伟大的,所以不要放弃,坚持就是正确的。WhenYouDoYourBest,FailureIsGreat,SoDon'TGiveUp,StickToTheEnd感谢聆听不足之处请大家批评指导PleaseCriticizeAndGuideTheShortcomings演讲人:XXXXXX时间:XX年XX月XX日 (编辑:应用网_阳江站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
站长推荐