当前位置:首页 >> 技术频道 >> 嵌入式开发

ARM处理器的分散加载及特殊应用研究

来源:单片机与嵌入式系统应用 作者:夏爽 发布时间:2009-06-22 09:21:47 发表评论

摘要:从ARM ELF目标文件主要构成出发,详细介绍了分散加载的基本原理、分散加载文件的语法、分散加载时连接器生成的预定义符号及要重新实现的函数等。

关键词:ARM处理器

 

  6 特殊应用

  6. 1 定位目标外设

  使用分散加载,可以将用户定义的结构体或代码定位到指定物理地址上的外设,这种外设可以是定时器、实时时钟、静态SRAM或者是两个处理器间用于数据和指令通信的双端口存储器等。在程序中不必直接访问相应外设,只需访问相应的内存变量即可实现对指定外设的操作,因为相应的内存变量定位在指定的外设上。这样,对外设的访问看不到相应的指针操作,对结构体成员的访问即可实现对外设相应存储单元的访问,让程序员感觉到仿佛没有外设,只有内存。

  例如,一个带有两个32位寄存器的定时器外设,在系统中的物理地址为Ox04000000,其C语言结构描述如下:

  

 

  要使用分散加载将上述结构体定位到Ox04000000的物理地址,可以将上述结构体放在一个文件名为timer_regs.c中,并在分散加载文件中指定即可,如下:

  

 

  属性UNINIT是避免在应用程序启动时对该执行段的ZI数据段初始化为零。

  在程序连接后,通过Image map文件可查看该ZI数据段的存储器分配情况:

  Execution Region TIMER(Base:Ox04000000,Size:0x00000008,Max:0xffffffff,ABSOLUTE,UNINIT)Base Addr Size Type Attr Idx E Section Name 0bi ectOx04000000 0x00000008 Zero RW 32.bss tlmer_regs.o从Image map文件可以看出,该TIMER执行区定位在物理地址0x04000000,即结构体timer_regs定位在Ox04000000,因此,在程序中对结构体的操作即是对定时器的操作。

  6.2 定义超大型结构体数组

  分散加载机制在提供将指定代码和数据定位在指定物理地址的能力的同时,也提供了一种代码分割机制——可以将指定的零初始化段(ZI段)从可执行代码中分离出来。这样最终生成的烧入ROM或Flash中的镜像文件就不包括那部分分割了的零初始化段,即使该零初始化段再大,也不影响最终生成的镜像文件的大小。但不采用分散加载机制,零初始化段在编译连接后是直接生成到镜像文件中的。它的大小直接影响最终要烧写的文件的大小,且零初始化段的大小还取决于内存的大小,它不能大到超过内存的大小;而采用分散加载机制,可以将某个零初始化段定位到非内存地址的一个存储器外设上,如NVRAM(非易失性随机存储器)。

  笔者曾在一个实际工程中采用这种分散加载机制,将一个2MB的结构体数组定位到外部NVRAM中,用于记录设备在工作过程中采集到的数据;而在本系统中,ARM处理器的内存只有256 KB,Flash存储器也只有2 MB。如果不采用分散加载,程序根本无法运行,也不能烧写到Flash中。

  采用分散加载,把对复杂外设的访问变成对结构体数组的访问,使程序代码精简易懂。对程序员来说,对结构体数组的操作还是和内存变量的操作一样的。

  编者注:本文为期刊缩略版,全文见本刊网站www.mesnet.com.cn。

  结 语

  分散加载是嵌入式系统应用中不可或缺的一种加载方式,ARM、DSP、PowerPC和MIPS等嵌入式处理器,都离不开分散加载。这种分散加载的思想是通用的,只是不同处理器的实现方式不同。

  本文详细阐述了基于ARM处理器的分散加载方法及其特殊应用,并以实际工程为例来说明怎样实现分散加载及使用分散加载的好处。它是笔者在实际工程应用中的心得体会,同时也是笔者工作经验的总结,希望本文对从事嵌入式系统设计和应用的工程技术人员能有所帮助。

0
顶一下
0
踩一下

相关文章

发表评论

请自觉遵守互联网相关政策法规,作者管理后台可以删除恶意评论、广告和违禁词语。