![μClinux嵌入系统外部硬件设备快速调试_第1页](http://file3.renrendoc.com/fileroot_temp3/2022-1/31/894c31ab-0f05-4eb8-8805-701d94192f6a/894c31ab-0f05-4eb8-8805-701d94192f6a1.gif)
![μClinux嵌入系统外部硬件设备快速调试_第2页](http://file3.renrendoc.com/fileroot_temp3/2022-1/31/894c31ab-0f05-4eb8-8805-701d94192f6a/894c31ab-0f05-4eb8-8805-701d94192f6a2.gif)
![μClinux嵌入系统外部硬件设备快速调试_第3页](http://file3.renrendoc.com/fileroot_temp3/2022-1/31/894c31ab-0f05-4eb8-8805-701d94192f6a/894c31ab-0f05-4eb8-8805-701d94192f6a3.gif)
![μClinux嵌入系统外部硬件设备快速调试_第4页](http://file3.renrendoc.com/fileroot_temp3/2022-1/31/894c31ab-0f05-4eb8-8805-701d94192f6a/894c31ab-0f05-4eb8-8805-701d94192f6a4.gif)
![μClinux嵌入系统外部硬件设备快速调试_第5页](http://file3.renrendoc.com/fileroot_temp3/2022-1/31/894c31ab-0f05-4eb8-8805-701d94192f6a/894c31ab-0f05-4eb8-8805-701d94192f6a5.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 Clinux嵌入系统外部硬件设备快速调试 Clinux嵌入系统外部硬件设备快速调试 类别:嵌入式系统 摘要:为了加快开发调试Clinux嵌入式系统的外部硬件设备,采用直接物理地址的设备访问方法,在Clinux嵌入式系统中实现了外部硬件设备的快速访问。使用地址映像,将设备的寄存器映像到处理器的内存空间统一编址,通过指针定义的地址操作函数对外设备进行访问。该方法可以在Clinux操作系统支持
2、的嵌入式系统的硬件环境中进行硬件外部设备的快速调试,避免了因等待外部硬件设备驱动程序的编写而耽误外部硬件调试的时间,从而加快外部硬件设备调试速度,提高硬件开发调试效率。 d" T">Og) Pt/dH+r'% 关键词:方法 Clinux硬件 调试 快速 JXG%Cx!2 8IErLu 在传感器网络节点中,采用了基于Linux的嵌入式操作系统。开发基于Linux操作系统的嵌入式微处理器应用系统,关键是Linux能够访问嵌入式处理器上扩展连接的外部设备。一旦能够访问连接的外部芯片设备,就可以灵活地在Linux上运行对嵌入式系统外部设备的有关访问控制应用。 6,nw
3、s5dh FLT4:B7 Linux在个人PC机上的设备驱动框架作了介绍。介绍了Clinux中访问嵌入式系统外部设备的设备驱动方式的框架。不过对于设备驱动程序的操作函数的实现由于与具体的外设备硬件有关,没有实现的具体统一方案。设备驱动方式采用通用的文件访问方式操作设备,这给对硬件底层不了解的高层用户的程序设计带来了方便。但对于硬件的设计和调试人员来说,不了解底层硬件的操作就无法实现设备的访问。硬件设计人员必须实现访问函数的具体操作过程,以达到对外部扩展设备的访问测试和灵活控制。也就是说,先要完成设备驱动程序,然后才能进行下一步的硬件设备调试。 i%jti6z$Hr ZT*RD2, 编写和实现设
4、备驱动程序必须先了解和实现对设备底层的访问,这是个复杂的过程。先要掌握处理器如何寻址外部设备、如何配置外部设备;再实现底层的地址访问函数;然后再编写设备驱动程序的实现函数,进而编写设备驱动程序;将驱动程序编译进Linux操作系统内核;最后在Linux系统中通过标准的设备访问方式访问外部设备。 huj 6Ysr b.Cs 采用设备驱动方式需要很多时间,以至于耽误硬件设计调试的进程。另一方面,由于应用于嵌入式的Linux不支持动态的加载设备驱动模块,只能将设备的模块编译进Linux内部,也就是要将设备驱动程序重新编译进用于嵌入式的Linux内核中,为此采用驱动方式又增加了内核的代码。 2g>
5、4fZ c&!EsMsU 在Clinux操作系统中,可以采用直接物理地址访问外部扩展设备,针对设备寄存器的地址单元进行读写操作,直接与硬件接触,而且便于从最底层了解设备的操作,直接与硬件接触,而且便于从最底层了解设备的工作方式,加快开发调试产品的速度。该方法仅仅修改少量的代码,采用直接地址的访问方式能够快速完成对外设备的访问测试。与设备驱动方式相比,重新编译后使内核代码增加较少。而在Clinux中要采用直接物理地址的外部设备访问,需要修改启动代码,建立设备访问函数,需要一定技巧。本文以Motorola的ColdFire MCF5272嵌入式微处理器平台为例,介绍了Clinux对外部设备
6、的快速访问方法。 gIGyY7(s8 1C,=1bY =700) window.open(' src=" onload="if(this.width'700')this.width='700'if(this.height'700')this.height='700'" border=0 相关贴图 uLbPk =700) window.open(' src=" onload="if(this.width'700')this.width='700
7、'if(this.height'700')this.height='700'" border=0 l|x*JTq 1 存储空间编址 s L; T(v4'7 对于Clinux来说,其设计是针对没有MMU(Memory ManageUnit)的处理器,即Clinux不能使用处理器的虚拟内存管理技术,Clinux采用存储器的分页管理,系统在启动时把实际存储器进行分页。在加载应用程序时程序分页加载。但由于没有MMU管理,实际上Clinux采用实存储器管理策略。 Wq 5Nc '7.(dn>WL0 Clinux系统对于内存的访问是直
8、接的,它对地址的访问不需要经过MMU,而是直接送到地址线上输出,所有程序中访问的地址都是实际的物理地址。操作系统对内存空间没有保护,各个进程实际上共享一个运行空间。 s&>U-7fx" B,2oAW"S Clinux采用了实内存模式,各个内部段在物理内存(没有虚存)层面都是连续的,其内存空间的地址映像如图1。 MST_s% M/!5r 根据内存空间是否独立,可以将I/O空间的配置分为两种:一种是I/O空间与内存空间相互独立,这样I/O空间的访问需要使用专门的I/O函数如inb和outb等。IntelCPU就使用这种方法。另一种是将I/O寄存器作为内存的一部分,
9、即I/O寄存器与内存统一编址,这样使用普通的内存访问语句即可读写I/O寄存器。Motorola68K处理器就采用这种体系结构,处理器MCF5272也统一编址。即其RAM、FLASH和外设I/O均统一编址,没有地址变换和内存保护。 S,I|8 YE 1? xU:;9 2 快速设备访问 <1,cI2 zB/)_AW 在C语言中,用指针可以对内存地址单元进行直接访问,因此在设计中可以采用指针对外部设备进行快速操作。 0$saDmED F9N/_H*+ 21 地址映像 <B3v4 f tf:46P1 为了访问外部设备,首先应将外设的寄存器映像到MCF5272的内存,与内存统一编址。为此,需
10、要修改相应代码。 L'iC?< YtQsS U 用于COLDFIRE MCF5272的嵌入式Clinux启动代码由两部分组成: s#nd:$p3 Z6N&s#6 Clinux/linux/arch/m68knommu/platform/5272/MOTOROLA/crt0_rom.S +W xZB ;WoMN Clinux/linux/arch/m68knommu/platform/5272/sysinit.c tB,1+I= GfG!CG % 其中crt0_rom.S由汇编写成,完成CPU的初始化设置,这是整个软件体系的最开始执行的代码入口,CPU一加电就跳到这里执行;
11、sysinit.c为C语言代码,完成MCF5272的集成模块SIM(如串口、时钟、通用I/O等)、SDRAM、FLASH和其它外设接口、片选等的初始化设置。 m4 :| ne=IRB MCF5272的片选CS0CS7的寄存器CSBR0CSBR7和CSOR0CSOR7可将外设备寄存器的地址映像到内存储空间,这样可以采用对内存空间的访问来达到访问外部设备。其中寄存器CSBR指明了映像的内存起始地址、映像的内存容量、总线宽度等;寄存器CSOR用于配置访问控制。片选CS0用于启动存储器ROM(FLASH)。 $e!|.1q a$741Fs 在C语言文件sysinit.c中修改代码以实现外设的寄存器映像
12、功能。应用片选CS2实现的代码如下: %GY U$aA V>Zw" #Q MCF5272_WR_CS_CSBR2(imm,0xffa00001);/寄存器内存开始地址:0xffa00000 k9''<82Y 3=)!9;uY MCF5272_WR_CS_CSOR2(imm,0xfff00014);/片选2 5C! ':f =:5o"g 其中imm为无符号字符指针,代表了MCF5272系统集成模块(SIM)中的寄存器地址。 5V> 82 ?Ji nX'z 22 实现访问函数 _tJm0z! & t1Uk 通过修改启动代
13、码,将外部设备的寄存器单元映像到内存单元后,就可以使用访问内存的宏和指针快速访问外部设备的寄存器。有两类实现设备快速访问的函数。 Jw b'5R OX r%b 221 使用宏定义 vp oYb 9 :ubPqt (1)对设备的该函数read_register()实现 k,kr7'Q (9phRo)> #define read_register(IMM,OFFSET,SIZE)Mcf5272iord(IMMP,OFFSET,SIZE) eL'j9 GlPd)m' (2)对设备的写函数write_register()实现 v"K # vK10p)ZV
14、 #define write_register(IMM,OFFSET,SIZE,DAT)Mcf5272iowr(IMMP,OFFSET,SIZE,DATA) WQH"Sq 6rO( 其中Mcf5272_iord和Mcf5272_iowr为宏。在sysinit.h中有下列宏定义: Ne=o+ $.( 6iZ:0y0t+6 (a)用于计算地址的宏 jO9w7u6 dm/U7B: #define Mcf5272_addr(IMM,OFFSET)(void *)&(unsigned char *)IMMPOFFSET) D rMGYiu *n)KK7aT 表示基地址为IMM,偏移地址
15、为OFFSET的内存地址。宏返回物理地址。 CL%+'c0 r'GD (b)访问内存的宏 CQ( _$ 'H7V' #define Mcf5272_iord(IMMP,OFFSET,SIZE) xwm-)L4T !6 kv (*(volatile uint # SIZE *)(Mcf5272_addr)(IMMP,OFFSET))) FV1!IE- ?d? cD #define Mcf5272_iowr(IMMP,OFFSET,SIZE,DATA) ;44?'oP FQ72VY (*(volatile uint # SIZE *)(Mcf5272_add
16、r(IMMP,OFFSET)=(DATA) BUozpqN "E><:_, 分别表示读内存地址单元内容、将数据DATA写入内存地址单元。地址单元的基地址为IMM,偏移地址为OFFSET。SIZE表示每次读写操作的数据度,取值可为8、16、32,分别表示每次操作8位、16位、32位的总线数据。 -XSu;'4q k-rOi'jL /wj L< =700) window.open(' src=" onload="if(this.width'700')this.width='700'if(this
17、.height'700')this.height='700'" border=0 相关贴图 EfrMkv =700) window.open(' src=" onload="if(this.width'700')this.width='700'if(this.height'700')this.height='700'" border=0 !7:"kk 2 快速设备访问 /W'C IX /r 在C语言中,用指针可以对内存地址单元进行直接
18、访问,因此在设计中可以采用指针对外部设备进行快速操作。 CVi3nS5Yl ,UdTUwF 21 地址映像 r:)-'b LWb5C 为了访问外部设备,首先应将外设的寄存器映像到MCF5272的内存,与内存统一编址。为此,需要修改相应代码。 |WiK* WO'&3d 用于COLDFIRE MCF5272的嵌入式Clinux启动代码由两部分组成: r )cG ee ,$,6%"'" Clinux/linux/arch/m68knommu/platform/5272/MOTOROLA/crt0_rom.S 5PPV'7Xm9 Rld1pX
19、2v Clinux/linux/arch/m68knommu/platform/5272/sysinit.c 21$YZlhJ Qwn/ , 其中crt0_rom.S由汇编写成,完成CPU的初始化设置,这是整个软件体系的最开始执行的代码入口,CPU一加电就跳到这里执行;sysinit.c为C语言代码,完成MCF5272的集成模块SIM(如串口、时钟、通用I/O等)、SDRAM、FLASH和其它外设接口、片选等的初始化设置。 NJny y!SElKj MCF5272的片选CS0CS7的寄存器CSBR0CSBR7和CSOR0CSOR7可将外设备寄存器的地址映像到内存储空间,这样可以采用对内存空间的
20、访问来达到访问外部设备。其中寄存器CSBR指明了映像的内存起始地址、映像的内存容量、总线宽度等;寄存器CSOR用于配置访问控制。片选CS0用于启动存储器ROM(FLASH)。 (P b,Q dnVl;L8L3 在C语言文件sysinit.c中修改代码以实现外设的寄存器映像功能。应用片选CS2实现的代码如下: 3 Y)o|D3 < 9p|! MCF5272_WR_CS_CSBR2(imm,0xffa00001);/寄存器内存开始地址:0xffa00000 %D|27gh 0FfBDE: MCF5272_WR_CS_CSOR2(imm,0xfff00014);/片选2 .%7#o 9Q:l0
21、| 其中imm为无符号字符指针,代表了MCF5272系统集成模块(SIM)中的寄存器地址。 h VC|*A $:kG>Rt 22 实现访问函数 ">v'h(s !uLW-F, 通过修改启动代码,将外部设备的寄存器单元映像到内存单元后,就可以使用访问内存的宏和指针快速访问外部设备的寄存器。有两类实现设备快速访问的函数。 &o$E1;og Ym+k h 221 使用宏定义 l$D*_ jc, 'T2RaWR4= (1)对设备的该函数read_register()实现 y6ntGrZ$ hM#X,7 #define read_register(IMM,O
22、FFSET,SIZE)Mcf5272iord(IMMP,OFFSET,SIZE) B Jpa7' s!DRcln (2)对设备的写函数write_register()实现 $,Y)"mI LfVV5? #define write_register(IMM,OFFSET,SIZE,DAT)Mcf5272iowr(IMMP,OFFSET,SIZE,DATA) P3 se"pP O_aZ28;C 其中Mcf5272_iord和Mcf5272_iowr为宏。在sysinit.h中有下列宏定义: |SCH56+ FOiwB$ > (a)用于计算地址的宏 9 lEoAC
23、ogQY"c8 #define Mcf5272_addr(IMM,OFFSET)(void *)&(unsigned char *)IMMPOFFSET) xrDHXqH UN#XP$u tY 表示基地址为IMM,偏移地址为OFFSET的内存地址。宏返回物理地址。 x o2PxUO Ag=>F5 (b)访问内存的宏 m' o<V& 9nozR,I #define Mcf5272_iord(IMMP,OFFSET,SIZE) &:'YK*X 3D L7 (*(volatile uint # SIZE *)(Mcf5272_addr)(
24、IMMP,OFFSET))) CYlQ .vsrZ_y? #define Mcf5272_iowr(IMMP,OFFSET,SIZE,DATA) C+arVi ,aOi:aaZRT (*(volatile uint # SIZE *)(Mcf5272_addr(IMMP,OFFSET)=(DATA) GaV6h|6_ MLwh&I9) 分别表示读内存地址单元内容、将数据DATA写入内存地址单元。地址单元的基地址为IMM,偏移地址为OFFSET。SIZE表示每次读写操作的数据度,取值可为8、16、32,分别表示每次操作8位、16位、32位的总线数据。 N$>.V7H& j&
25、lt;:hD QP 3 应用实验 8;|x2=y iFG$rbU 在笔者的传感器网络节点中(见图2),外部设备芯片采用W99200F,它包含100多个寄存器。在芯片上电复位后,芯片寄存器的复位初始值在手册中是已知的。根据访问方式,它包含三类寄存器:只读、只写、可读写。W99200F芯片部分寄存器偏移地址及其复位初始化值如表1所示。 |v,%!p s Zo$ ,rl 表1 W99200F芯片中部分寄存器及其初始化值 S #Mc /QuuBtp 寄存器名 偏移地址 访问方式 数据宽度 复位值 Kc|v i_D Vint_source 0x0d 只读 8 0x40 >O0z +tj Vbv_i
26、nitial 0x18 读写 8 0x13 KDTG9KC Vquality 0x19 读写 8 0x08 #B_Em$ Vin_cntl 0x21 读写 8 0x0c YoC t&rY Vsize_h 0x24 读写 8 0x2c a4a/q4T K5#4k 修改启动代码和实现访问函数,其中寄存器CSBR2指明了映像的内存起始地址、映像的内存容量、总线宽度等。重新编译Clinux内核,并将生成的下载文件烧写到FLASH中,重新上电在内核运行起来后(或者mount上宿主机硬盘手动启动Clinux内核),通过编制一段C语言的测试程序,调用设备访问函数,即可对外部设备芯片的寄存器进行读写。
27、下面是一段测试程序test.c。 4c)LAwd& m!'moumL; #include 4O I''i "c+j2f'f #include "io.h" /包含定义的设备访问函数 O hM 0B31=N( int main(void) pxGDzU )2pOCAjL2 W5)Rw0'GD Q *d printf("Vint_source:0x%x",inb(0xffa00000+0x0d)); Tr6J+hS HL'=zB% /读寄存器Vint_source初始值 &s" Vc9 IG(1h+5 R( printf("Vbv_initial:0x%x",inb(0xffa00000+0x18); W"meHCp n OQvBc /向寄存器Vbv_initial写入值0x7f vVy XZZ svWQk9d outb(ox1f,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年微电波按摩器行业深度研究分析报告
- 科学馆项目概述
- 房地产行业的投资与资本流动
- 2025年度建筑劳务施工合同及竣工资料编制合同
- 创新德育工作模式中的教师角色与培训实施方案
- 车联网技术与数据服务行业分析
- 2025年度办公楼智能化装修工程合同规范文本
- 2025年车载DVD项目投资可行性研究分析报告
- 2025年度消防设施远程监控与数据分析合同
- 2025年度建筑工程地下空间开发与利用合同
- 医院感染及其危害
- 2025年三人合伙投资合作开店合同模板(三篇)
- 安徽省招生考试数学试卷
- 2024全国各省高考诗歌鉴赏真题及解析
- 高考日语阅读理解练习2篇-高考日语复习
- 印刷基础知识培训资料
- NB/T 11536-2024煤矿带压开采底板井下注浆加固改造技术规范
- 2024-2025学年人教版五年级(上)英语寒假作业(一)
- 【课件】九年级化学下册(人教版2024)-【新教材解读】义务教育教材内容解读课件
- GA/T 761-2024停车库(场)安全管理系统技术要求
- 2025届贵州省六盘水市第二中学高三适应性调研考试数学试题含解析
评论
0/150
提交评论