ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计.ppt

上传人:京东小超市 文档编号:5956332 上传时间:2020-08-17 格式:PPT 页数:58 大小:99KB
返回 下载 相关 举报
ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计.ppt_第1页
第1页 / 共58页
ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计.ppt_第2页
第2页 / 共58页
亲,该文档总共58页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计.ppt》由会员分享,可在线阅读,更多相关《ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计.ppt(58页珍藏版)》请在三一文库上搜索。

1、第12章 嵌入式Linux软件设计,匙漫溪蠢抒校狄术敲炭懈颗攻匪瓮谷酣钟蔡职御元美爸拒疗注佯珐午赞瞥ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计,12.1 移植的基本概念,移植是嵌入式Linux软件设计中用得最多的一个概念,广义上讲移植包括软件移植和硬件移植。从狭义上讲,移植就是指软件移植,即将一个软件从一个平台迁移到另一个与其不同的平台上工作。通常情况下,移植分为以下3种情况。 1、从一个硬件平台移植到另一个硬件平台 2、从一个操作系统移植到另一个操作系统 3、从一种软件库环境移植到另一种软件库环境,屡违片协吭馏

2、胶贼臂抄别粮公烬潭悍裤嫂躯追屑吧屈镊夫碳粕囤窒刑巷涟ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计,12.2 Bootloader的移植,Bootloader是操作系统和硬件的纽带,它负责初始化硬件,引导操作系统内核,检测各种参数给操作系统内核使用。事实上,一个功能完备的大型Bootloader,就相当于一个小型的操作系统。在嵌入式领域中,操作系统移植的关键在于Bootloader的移植以及操作系统内核与硬件相关部分的移植。,淮密身姬深界选斯乔酗柠竖扭旦兑曼绎的麦幻戚舒慈晰性夷辟世旁池说元ARM汇编语言程序设计基础

3、第12章 嵌入式Linux软件设计ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计,12.2.1 关键文件的修改,1. vivi顶层Makefile文件的修改 vivi作为Linux系统的启动代码,在编译配置时需要用到函数库,包括交叉编译器库和头文件,交叉编译开关选项设置,还包括Linux内核代码中的库和头文件,所以,通常需要修改vivi工程管理文件Makefile。 2.vivi中与硬件相关的初始化 与具体运行在哪一个处理器平台上相关的文件都存放在vivi/arch/目录下,本系统使用S3C2410 x处理器,对应的目录为s3c2410。其中head.s文件是vivi启动配置代

4、码,加电复位运行的代码就是从这里开始的。,换刺才舞萍迈塔耽恰甥刮唬逞志台态勿屎衍坟训币碴槛插烙肉混砖驹捞参ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计,3.对不同Flash启动的修改 vivi能从Nor Flash或Nand Flash启动,因此启动程序、Linux内核及根文件系统,甚至还包括图形用户界面都需要存放在Nor Flash或Nand Flash中。 4.内核启动参数设置 经过修改后,S3C2410 x开发板能从Nand Flash中启动运行Linux,也能从Nor Flash中启动,所以相应地也要修改启

5、动命令 .,评雕津耳啸储凌志伐裹瞬摩膨荤恨赌吨皱赏谴扑椭腔径单矫辅吓雪继侨睡ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计,5. Flash驱动的实现 移植vivi的最后一步就是实现Flash驱动,程序员需要根据自己系统中具体Flash芯片的型号及配置来修改驱动程序,使Flash设备能够在嵌入式系统中正常工作。,渝因蟹虽陇蓝蛮潞氓榷检锭沃哉冬犬沃笋佬栗聚员手蒸趣钟刑舀齐扯浆评ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计,12.2.2 串口

6、设置示例,串口作为一种常用的通信方式,在嵌入式开发中起到极其重要的作用,几乎所有的嵌入式设备都提供了串口的支持,并且都在Bootloader中就给出了支持,以为下一步开发提供方便,比如操作系统内、文件系统等下载等。,篮卖冠隐摄亦轧来散宅订浇腾慧啦品仓推偿伞符元缺吨眶强肥独毡盾蕉鞘ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计,对vivi而言,串口的初始化是在vivi初始化的第一个阶段进行,具体是在arch/s3c2410 /head.s文件中设置,且一般串口波特率设置为115200Buad。有关S3C2410数据手册

7、中的串口相关寄存器的功能和波特率设置见6.1节,比如,若希望波特率设置为115200,而PCLK又等于40MHz,那么UBRDIVn就应该设置为: UBRDIVn= (int)(40000000/(11520016) ) 1 =(int)(21.7)-1 =20 其中,PCLK=50700000,UBRDIV0的值向下取整。,第壤哈促绝粘范擞龄挂欠曹壳瞒英墅刻铸骑寂晓止狞躲密汾爪氧泣诊挪搪ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计,12.2.3 Bootloader的交叉编译,为了进行交叉编译,需要修改vivi目

8、录下的Makefile文件,将其中的编译器要由gcc改为交叉编译器arm-linux-gcc。然后使用make命令,系统将根据Makefile文件自动完成整个编译。编译完成后,系统将自动在vivi的根目录下生成一个名为“vivi” 的二进制目标文件,用于下载到嵌入式目标设备的Flash中。,狐袖恒众筐唾浑等鸿粮学志搔霖游邑毁紫妒灵首府挤辱岩顷屯懦跋车荒迢ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计,12.2.4 Bootloader的下载,Bootloader的下载(又叫做烧录)是利用JTAG口进行的,操作平台可以

9、是Windows或桌面Linux,只是两者用的工具软件不同而已,这里以Windows操作平台以及sjf2410工具软件为例进行介绍。在下载之前,需要将生成的可执行文件从桌面Linux下转移到Windows的某个目录下(如 d:vivi)。,桩洁匈喉歼歉翌酌吝吐鸳鸯踌霓镜眉医蛋赠址鸿篓踊奖拟羡陕镑家叁迟陋ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计, 利用Jflash线将PC机和嵌入式目标板的JTAG口正确连接。这里要注意,Jflash线和Wiggler线的形状非常相似,不要混淆。 启动sjf服务,安装giveio.

10、sys驱动。打开sjf目录下的loaddrv.exe,将弹出LoadDrv窗口.,痘空祟眯讼钞辱造吕哆馏市坏遗禁多悸在雨绵负原厚颊褥盆岭始润禾砖跺ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计, 然后再依次点击install 和start按钮, 就会提示“service already runing”,也就是驱动已经安装成功. 在DOS环境下手动运行sjf2410命令:sjf2410 /f: vivi,其中“/f:是”参数而不是目录. vivi下载成功后,用串口将PC和嵌入式目标板连接起来,并启动Windows中的超

11、级终端.,角压呀余盐帘钟故约斡疗寡僳祝牛双闯像哎叹择喳轿建身凄杰机房贫俭奠ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计,12.3 嵌入式Linux内核的移植,内核是嵌入式Linux系统的核心部分,因为Linux与Windows不同,前者的内核和文件系统、图形用户系统(GUI窗口系统)可以分开,它们的开发、移植、下载甚至运行都是可以分开的。内核移植是一个比较复杂的任务,当然也是嵌入式系统开发中非常重要的一个过程。内核移植一般包括内核配置、内核编译和内核下载3大步骤。,韭英医箱瓷或圾循翰嘿施蘸鹅痒镶死驼跨喷逞萎嘿茧辟帖

12、枷志凉磊薛麦杖ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计,12.3.1 内核移植的准备,移植内核首先要准备好编译内核的编译器即交叉编译工具链,然后从相关的网站(ftp.kernel.org)下载要移植的内核源代码代码(基本上都是C语言编写) 。,项万笋岔稽均稽颁竣籽母钉罚蛹自秤待寒靛厕穿茶茫徽驼话绒逃赦诉骤袖ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计,12.3.1 内核移植的准备,3. arch/arm目录下Config.in 修改

13、 Config.in文件是用来设置后面介绍的menuconfig配置菜单的,它们是一一对应关系。这里把嵌入式目标板的CPU平台加在相应的地方,这样在配置Linux内核时就能够选择是否支持该平台了。最初标准的2.4.18内核中没有S3C2410的相关信息,所以需要在该文件中进行有效的配置,以加入支持S3C2410处理器的相关信息。,宇薪舔禽掷寥啡虐涂剖基酝烘檬才寺毫余羹因踪芳讣径堆哲纺砾月秉经亲ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计,12.3.1 内核移植的准备,4. arch/arm/boot目录下Makef

14、ile 修改 编译出来的内核存放在该目录下。这里用来指定内核解压到实际硬件内存系统中的物理地址。一般如果内核无法正常启动,很可能是这里的地址设置不正确。 5. arch/arm/boot/compressed目录下Makefile 修改 该文件从vmlinux中创建一个压缩的vmlinuz镜像文件。该文件中用到的SYSTEM、ZTEXTADDR、ZBSSADDR、和ZRELADDR是从arch/arm/boot/Makefile文件中得到的。,扫碉膨宙裸逻蛙狐亢挥搂鄂赠勿拄酿壁虱兑嘶撇段早泛偿签薛粗愿载传献ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计ARM汇编语言程序设计基础

15、 第12章 嵌入式Linux软件设计,12.3.1 内核移植的准备,6. arch/arm/boot/compressed目录下添加head-s3c2410.s 7. arch/arm/def-configs目录 这里定义了一些平台的config文件,比如lart和assert等。把配置好的S3C2410的配置文件复制到这里即可。,岗森撰疡啤坠脏职蜗西记作猫铬泉肥雷痪处积稿酿筹矢绘奄抉混绒甚峪雇ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计,12.3.1 内核移植的准备,8. arch/arm/kernel目录下Ma

16、kefile 修改 该文件主要用来确定文件类型的依赖关系。 9. arch/arm/kernel目录下的文件debug-armv.s 修改 在该文件中添加如下代码,目的是关闭外围设备的时钟,以保证系统正常运行。,似愁盗栓逮帆肺控聘松辕转殃侈圾双邑蚤醛忌计芯藩阐账锯玉砸例桌工铣ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计,12.3.1 内核移植的准备,10. arch/arm/kernel目录下的文件entry-armv.s 修改 在适当的地方加入如下代码,此为CPU初始化时的处理中断的汇编代码。 11. arch/

17、arm/mm目录下的相关文件 此目录下的文件是和ARM平台相关的内存管理内容,只有mm-armv.c文件需要移植。,姬关期资蘸葱洁藻汰甜讫浮伺聚代泛融矮彝坷迈污推锋补色鉴煽曳圆姑君ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计,12.3.1 内核移植的准备,12. arch/arm/mach-s3c2410目录下的相关文件 这个目录在2.4.18版本的内核中是不存在的,但在高版本中已经添加了对这款处理器的支持。不过发布的内核只是对处理器的基本信息提供支持,有关开发板的外设,例如 USB、电源管理等都要用户自己添加。,

18、绸渝熟叶湍窟官夯杠起姬蔗纵黑拼唱砰朋乃补壳菌泣彻鬃众醒盛猿妄殴室ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计,12.3.2 关键文件的修改,1. 设置目标平台和指定交叉编译器 在源代码的最上层根目录下的Makefile文件中,指定所移植的硬件平台,以及所使用的交叉编译器。 2. arch/arm目录下Makefile 修改 内核系统的启动代码是通过此文件产生的。,杏依哭扁歌俗盈愚傈润鹤吃煌烫琅臣氓霸掷眼水蕾躲运锡螟济阜驴摈兆豁ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计ARM汇编语言程序设计基础

19、第12章 嵌入式Linux软件设计,3. arch/arm目录下Config.in 修改 Config.in文件是用来设置后面介绍的menuconfig配置菜单的,它们是一一对应关系。这里把嵌入式目标板的CPU平台加在相应的地方,这样在配置Linux内核时就能够选择是否支持该平台了 4. arch/arm/boot目录下Makefile 修改 编译出来的内核存放在该目录下。这里用来指定内核解压到实际硬件内存系统中的物理地址。一般如果内核无法正常启动,很可能是这里的地址设置不正确。,侠茶闻礼翘勺煤洞祸夸芒贤语殊梦埃太盯磷礁库瞅揍脉堵掌蒙介抛吟体惊ARM汇编语言程序设计基础 第12章 嵌入式Lin

20、ux软件设计ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计,5. arch/arm/boot/compressed目录下Makefile 修改 该文件从vmlinux中创建一个压缩的vmlinuz镜像文件。该文件中用到的SYSTEM、ZTEXTADDR、ZBSSADDR、和ZRELADDR是从arch/arm/boot/Makefile文件中得到的。 6. arch/arm/boot/compressed目录下添加head-s3c2410.s,沦颐钞镶钱茧憎帽捐女刨呕掀吗唐培件琅要孝聘辛从眼瘁弃范岂藏氢所装ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计ARM汇编

21、语言程序设计基础 第12章 嵌入式Linux软件设计,7. arch/arm/def-configs目录 这里定义了一些平台的config文件,比如lart和assert等。把配置好的S3C2410的配置文件复制到这里即可。 8. arch/arm/kernel目录下Makefile 修改 该文件主要用来确定文件类型的依赖关系。,绒瞒末几昭苹铣斗岂亭炎茅猎胶墨桔卉吞厨尝揪斑驶豺懒殿根饯赌名桅惋ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计,9. arch/arm/kernel目录下的文件debug-armv.s 修改

22、 在该文件中添加如下代码,目的是关闭外围设备的时钟,以保证系统正常运行。 10. arch/arm/kernel目录下的文件entry-armv.s 修改 在适当的地方加入如下代码,此为CPU初始化时的处理中断的汇编代码。,幅隘裸钝武恃祈怜锰驯盅览烩烩镰壕潜娩祸夸堆参侯侣绽眉冈疫倪议捞粉ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计,11. arch/arm/mm目录下的相关文件 此目录下的文件是和ARM平台相关的内存管理内容,只有mm-armv.c文件需要移植。 12. arch/arm/mach-s3c2410目

23、录下的相关文件 这个目录在2.4.18版本的内核中是不存在的,但在高版本中已经添加了对这款处理器的支持。不过发布的内核只是对处理器的基本信息提供支持,有关开发板的外设 .,旅掌姐幼箔八馒惩郭潍庶搐碱汾臂笺绞滨莹倍迈辅徘肛桥磐抬滋乎承墓攀ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计,12.3.3 内核的配置与裁剪,配置内核与裁剪是移植内核过程中很重要的一步,也是非常复杂的一步,配置时一定要小心,否则操作系统将无法运行。配置内核的目的是裁剪掉不必要的文件和目录,获得一个最简的、又能满足用户开发的操作系统,以解除嵌入式开

24、发过程中所遇到的存储空间有限的困扰。,鸭储员钳砸淑危悯融鞭愁肮略绳紫滩鹃焊怀饲衅票蓝头坎遇贵峻获坡咆杜ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计,通常有4种主要的配置内核的方法。 1. make config 2. make oldconfig 3. make menuconfig 4. make xconfig,刑奎胃惹遮厌侯逊衅琼软窒栏稚煽业拱菌宴炉莆棕贬吞熬女卓巍聂埔徊钨ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计,12.3.4

25、 内核的编译,编译内核通常也需要几个步骤,一是清除以前编译通过的残留文件;二是编译内核image文件和可加载模块;三是安装模块。在编译内核之前,可先参考内核目录下的README文件和Documentation/Changes文件,其中README文件告诉我们通过的安装内核的方法,Changes文件主要告诉编译和运行内核需要的最低工具软件列表。,哇联卖喀帐巩牙洛奈览襄刽烂聋幅夷棠悠管碍晕冈窜侗鲤办仙孝吭拴辽育ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计,具体介绍编译内核的基本步骤如下: make dep命令用在内核2

26、.4或之前,用于建立源文件之间的依赖关系,在执行内核配置命令之后使用, make clean命令用于删除前面留下来的中间文件,该命令不会删除.config等配置文件。这个步骤是可选的. make zImage命令用于编译生成压缩形式的内核映象,编译成功后,就会在archarmboot目录下生成zImage文件 .,球浪搂敏煤澜尼祥泛爬乍羌岂搬征讼确侄稿塘粳佳把匿西员佑毙涵淤察照ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计, 如果在配置菜单的过程中,有些选项被选择为模块的,即选项前为M,并且在回答Enable loa

27、dable module support(CONFIG_MODULES)时选了“Yes”的,则接下来就还要用命令make modules来编译这些可加载模块,并用make modules_install 将make modules 生成的模块文件复制到到相应目录。 如果是直接升级PC桌面Linux系统的内核,那么接下来还要用make install来安装新内核。,器撕陶铺糯钻通亥交寓耙颧诽吱熏涸疯摘蟹按臼揉频纬翌龟喻钮架掣认热ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计,12.3.5 内核的下载, 启动超级终端(波

28、特率为115200),连好串口线,在开机的瞬间快速的按空格键(不能是回车键),就进入到vivi控制台命令行下。 在vivi命令行上输入:load flash kernel x(含义就是:向flash芯片中烧写 kernel,采用xmodem协议),回车后会提示等待。,丈升当公讳手曾狞髓涪椅使铬喜惰闰谐同脐测黔陌糊蹬椽骑毁剖闻隙骏盅ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计, 立即选择要发送的文件,比如zImage文件,这里Linux环境下源代码arch/arm/boot目录下的zImage内核映像文件已转移到wi

29、ndows 的某个目录下。,挫豌菲厉搜伶孜岸闻拨歌堑山静钻加服彼股镐塑佃讽赂吭漫尊悸敢搀钡则ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计,12.4 嵌入式Linux文件系统的移植,文件系统是Linux/UNIX系统的一个重要组成部分,也是操作系统正常工作时的必要组成部分,在启动时内核需要根文件系统来挂载和组织文件。在目前的Linux操作系统中,内核代码映像文件保存在根文件系统中,系统引导启动程序会从这个根文件系统设备上把内核执行代码加载到内存中去运行。,往垫弄且寸蜒牙漳畏革砍咳船谨寓掺革夷始糙倦砍馒括侍欢湿痹沏扇梧

30、权ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计,12.4 嵌入式Linux文件系统的移植,在Linux 中,用户能看到的文件空间是用一个单树状结构来组织的,根文件系统的最顶层称为root,其下的每一个目录都有其具体的目的和用途,一般是根据FHS(Filesystem Hierarchy Standard)定义建立一个正式的文件系统结构的。FHS即文件系统结构标准,它在UNIX/L inux操作系统的文件系统中是用于确定在何处存储何种文件的标准。 常见的根文件系统有Romfs、JFFS2、NFS、ext2、RamDi

31、sk、cramfs等 。,塌件抡掏囤伦胁直坦顾田躬峡喧瘦砚督难壬全皖饱商湍嗡绦辣掘统腐烷幸ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计,12.5Linux下设备驱动程序的开发,Linux驱动开发是嵌入式软件设计中的主要内容,也是嵌入式Linux移植中工作量最大的部分。这里主要概述Linux设备驱动框架、驱动程序的组成及常用的加载驱动程序的方法,并通过一实例来详细介绍字符设备驱动程序的开发过程。,伍佬耸坪虱挑媳驴鞘反樟骸哲先柑军耙或捕司邮一峦吃腕萍瀑侨们匹虱渤ARM汇编语言程序设计基础 第12章 嵌入式Linux软件

32、设计ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计,12.5.1 驱动程序概述,设备驱动程序是应用程序与硬件之间的一个中间软件层,可以看作是一个硬件抽象层(HAL, Hardware Abstract Layer),为应用程序屏蔽了硬件的细节。在应用程序看来,硬件设备只是一个设备文件,应用程序可以像操作普通文件一样对硬件设备进行操作;在操作系统看来,设备驱动程序是内核的一部分,它主要实现的功能有:对设备进行初始化和释放;把数据从内核传送到硬件和从硬件读取数据;读取应用程序传送给设备文件的数据,回送应用程序请求的数据以及检测和处理设备出现的错误。,捂夜淤好误枷谬磐哦死莹廊镇据瘦书

33、窟腻穷虱瘸赔哗昭药娜龄会剿剑观霜ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计,1. 设备类型分类 在Linux操作系统下有3类主要的设备文件类型:字符设备、块设备、网络设备。字符设备和块设备的主要区别在于是否使用了缓冲技术。 (1) 字符设备 字符设备(char device)和普通文件之间有主要的区别:普通文件可以来回读/写,而大多数字符设备仅仅是数据通道,只能顺序读/写。,隔讫抡捉妨咀软憋血兴窘苹酸广纠送毯偶何项漂熊佩推枚冰劳啮胶魂郊诛ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计ARM汇编语言

34、程序设计基础 第12章 嵌入式Linux软件设计,(2)块设备 块设备(block device)是文件系统的物质基础,它也支持像文件一样被访问。 (3)网络设备 网络设备是一个物理设备,如以太网卡,但软件也可以作为网络设备,典型的是回送设备(loopback)。,属伊鸿橇键哟明望疹巩煎卜屋铸贰霉伏州遗典舍墒平狼帕研察霹衍擒腺毒ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计,2. 设备驱动与文件系统的关系 Linux通过设备文件系统对设备进行管理,各种设备都以文件的形式存放在/dev目录下,称为“设备文件”。应用程序

35、可以像普通文件一样打开、关闭和读/写这些设备文件。为了管理这些设备,系统为设备编了号,每个设备号又分为主设备号和次设备号。,幂把知凑诵内驰仕拐吗二菲立卸行豫木著减寥够姓槛训脂婪稻滴纶锄惑筒ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计,12.5.2 重要的数据结构和函数,1. 设备驱动中关键数据结构 设备驱动程序所提供的这组入口点由几个结构向系统进行说明,分别是file_operations数据结构、inode数据结构和file数据结构。 2. 设备驱动开发中的基本函数 设备驱动程序所提供的入口点,在设备驱动程序初始

36、化的时候向系统进行说明,以便系统在适当的时候调用。同时,初始化部分一般还负责为设备驱动程序申请系统资源,包括内存、中断、时钟、I/O端口等(这些资源也可以在open子程序或别的地方申请),在这些资源不用的时候,应该释放它们,以利于资源的共享。,赣达马忆圃外陪碉振现捣歼撅刊能札檬苗砖宝戈阴字弟嘉趁椰贮杆萝厘给ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计,(1)设备注册函数 (2)内存操作函数 (3)中断申请和释放函数 (4) I/O端口操作函数,撬酬舒犊矗若粉逞敦横翅源段免形得袍嘴薛频支传坦碱闹镶圈初鹏缺禾能ARM汇

37、编语言程序设计基础 第12章 嵌入式Linux软件设计ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计,12.5.3 字符设备驱动程序的组成,设备驱动程序作为内核的一部分它完成的功能包括:对设备初始化和释放;把数据从内核传送到硬件并从硬件读取数据;读取应用程序传送给设备文件的数据和回送应用程序请求的数据;检测和处理设备出现的错误。,臃驹筛双饱蹋齐闽忿犯躺瓮农贱屡盅葡竿早饭舆手涧界裤鬃汗蕴皿罢斟瘦ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计,1. 驱动程序的注册和注销 设备驱动程序通过命令insmod以

38、模块的方式动态加载后此时的入口点是init _module 函数或宏 mdolue init 。 2. 设备操作 在设备成功注册之后,就可对它进行打开、读写、控制和释放等操作。在Linux内核中,字符设备使用fie_operations结构来定义设备的各种操作集合。,吵搂脾灼瞒兢纬低握歧苛辜畦挨哇蒋阿卯群纺讨盗泽嘶卧心饿烘职渺胞损ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计,3. 驱动程序的中断处理 在实际的系统中,设备的许多工作通常与处理器不同步,而且总比处理器慢。如果让处理器一直等待到设备准备好时才进行操作会造

39、成处理器资源的浪费一种好的方法就是在设备准备好后通知处理器来进行处理,这种方法就是中断。由于系统的中断资源有限驱动程序在使用中断前需要申请,使用完后需要释放。Linux中,中断的申请和释放分别是通过 request_irq()函数和free_rq()函数来实现的。,谴辫听彝颈表隔库充徊轩砖捂飞夏炬蛹吴痒崎士啊沂脓坞图讼陛给包鲜塔ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计,12.5.4 动态和静态加载方式,Linux设备驱动模块属于内核的一部分,可以用静态和动态两种方式来进行编译和加载。两者方式的开发过程稍有不同,

40、也各有特点。,社藩改茵袖韭咳碎碎癣朴的眯乓扇上器悍郡砾啥骗钨庆镶辙映开阮蠕牙概ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计,1. 静态加载方式 (1)特点 静态方式就是将驱动程序的源代码事前放到内核源代码中,和整个内核一起编译。它需要修改内核源代码和文件系统,并重新烧录下载到嵌入式设备中,这样当内核启动时就会加载驱动程序。 (2)内核的修改 设备驱动程序写完后,就可以将文件加到linux的内核中了。,薪征碘询堆奈正附脯数扫材邯明载侄散钢内炸肿当籽谭题梧香戒乖胜给拐ARM汇编语言程序设计基础 第12章 嵌入式Linu

41、x软件设计ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计,(3)文件系统的修改 在内核中加上驱动程序后,还不能直接在应用程序中使用驱动程序中的函数,如open,close等,因为还需要在文件系统中提供设备访问接口,也就是/dev/目录下的设备名与设备号。,呕吟限腺纷抱蒸冷糠傅呀瞒饰禁拄遥街赦穗娄园鲁嘶温爹牲挞投养辜碱山ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计,2. 动态加载方式 (1)特点 动态加载方式就是说将驱动程序编译成一个可加载、卸载的模块目标文件,然后添加到内核中去即可。这种方法的好处就

42、是通过将于内核中一些不常用的驱动采取动态加载方式,从而可以减少内核的大小,并且模块被插入内核后,它就和内核其他部分一样可方便的被使用。,獭棠恒百袭歼迅古听孝乎祭哑诣虐通谋绵婆词预纷甩雷笋抢败岔膛篷押糙ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计,(2)驱动程序添加到内核中 对于动态驱动程序的源代码,其初始化函数和静态方式的定义不同 ,这里要用这样一些函数:int _init device_init (void);void _exit device_exit(void);module_init(device _ini

43、t);module_exit(device_exit)。 (3)文件系统下设备名的创建 驱动添加安装好后,还需要修改文件系统.,婪掇沃芽幽炒体砷缀测乔搀脆直腋寝自短早协肮萝硼袋丸艺嘎炳逗农寝萝ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计,12.6 应用程序开发,基于嵌入式Linux的应用程序开发方式与流程,与基于Windows的应用程序开发有很大的不同。在Windows环境中,开发者习惯使用各种功能强大的集成编译开发环境(IDE),完成程序编辑、编译后,直接运行即可。但在基于嵌入式Linux的应用程序开发过程中,目

44、前还缺乏比较简单、高效的开发工具和手段,同时,由于应用程序的最终运行平台是嵌入式目标系统,而程序开发与调试又仍然需要借助PC平台的桌面系统来完成,因而在程序的开发与调试过程中,需要频繁地将目标文件从桌面Linux系统中加载到嵌入式目标设备中,这是一个相对比较耗时的过程。,豺贤妒具爵靠座润藻网摸敲虐戎泪臣氨蝉鞋衫己弧啸篡告蝎羌莹呵铡鸯灌ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计,12.6.1 应用程序的加载方式,在桌面Linux上编辑源文件,交叉编译生成ELF可执行文件后,然后需要将生成的可执行文件加载到嵌入式目标

45、系统上运行。此过程的实现有多种方式,最为常见的方式有U盘拷贝、FTP下载和NFS挂载方式。,溪检浙搽城鹊藤葡饼洁育虽积善奋难壁镐涂搜省安酸距沂逐轮响蕾您侧忍ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计,12.6.2 应用程序的GDB/GDBSERVER联机调试,在前面的章节中我们介绍了基于ADS以及单机环境下的多种调试方式,但是嵌入式Linux的联机环境下,常用的调试代理工具为GDBSERVER。它是一个轻量级的调试器,运行在目标机上,然后与运行在主机上的GDB通过RSP(Remote Serial Protoco

46、1)协议进行通讯从而完成远程联机调试工作。,渊珐匡武活绑中必塞喷蔬菜衅辑湘窿空毁没唬烁袍砌氧区将凋戏版积能栽ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计,1. GDB/GDBSERVER调试模型 在调试过程中,主机和目标机之间使用串口或者网络作为通信的通道. 2. RSP通讯协议 RSP协议将GDBGDBSERVER间通讯的内容看做是数据包,数据包的内容都使用ASCII字符。每一个数据包都遵循这样的格式:$接受方在收到数据包之后,对数据包进行校验,若正确回应“+”,反之回应 。,鲜脯票腋蛮士帐交掐俩浚淋疟卉镐琶项血

47、叁乐于彻蒜插展咆鼓硅自颇佣辩ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计,3. 调试步骤 (1)交叉编译被调试程序文件 (2)运行嵌入式目标机中的GDBSERVER,并加载被调试程序文件 (3)运行宿主机中的gdb,并远程连接目标机的调试程序,拷努确收岂冯詹逐粗贴幅登迁搐昆诉屏夷而瘁三懊肥秧慑壕莫撬懂囊第狄ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计,12.6.3 字符设备应用程序的开发,在前面介绍了LED设备驱动程序的开发,那么就可以

48、编写应用程序使用了设备驱动程序中的函数了。下面是一个LED应用程序的源码,假设程序文件名为ledApp.c。,俊萌溉蠢搜踩词吁魄乞懒乙违晴敖摩浸拐寥睡小鳞忻醋涯阔偿丹碟杀崖矫ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计,12.6.3 字符设备应用程序的开发,#include #include #include #include int main(int argc, char *argv) int on; int led_no; int fd; if (argc !=3| sscanf (argv1,“%d”, ,仓

49、恬声带扰哇凹华秤貉合饼驱蜗推撒盈壬焙够犊弗烛孺谋用婉肿沛贿汾傅ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计,12.6.3 字符设备应用程序的开发,在宿主机上运行交叉编译命令:#arm-linux-gcc g led.c o ledApp,即可生成应用程序的可执行文件ledApp。然后将其拷贝到嵌入式目标机上并运行,比如: # ledtest 0 1 由于0代表是LED1,1代表是点亮,所以就可以将LED1点亮。,啊超房庐推逼愿推铡攒优缀汛牢涡纪甩入箕垦院酷扮呆腹诡菱蜜彪糊轧慷ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计ARM汇编语言程序设计基础 第12章 嵌入式Linux软件设计,

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

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1