欢迎来到天天文库
浏览记录
ID:52254954
大小:407.94 KB
页数:15页
时间:2020-04-03
《嵌入式开发教程之ARM处理器的分散加载及特殊应用研究(2).ppt》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、嵌入式开发教程之ARM处理器的分散加载及特殊应用研究(2)5重新实现_user_initial_stEickheap()函数使用两个存储区6特殊应用6.1定位目标外设6.2定义超大型结构体数组结语分散加载机制提供了一种指定代码和静态数据布局的方法。使用分散加载时,必须重新放置堆栈和堆。应用程序的堆栈(stack)和堆(heap)是在C库函数初始化过程中建立起来的,在ADSl.2或更新版本中,在缺省状态下C库函数初始化代码会将连接器生成的符号Image$$ZI$$Limit地址作为堆的基地址。在分散加载时,连接器会将用户的__user_initidl_stackheap()函数代替C库函
2、数默认的堆栈和堆初始化函数,并将其连接到用户的镜像文件中,用户可通过重新实现__user_initial_stackheap()函数来改变堆栈和堆的位置,从而适合自己的目标硬件。5重新实现_user_initial_stEickheap()函数__user_initial_stackheap()可以用C或汇编语言来实现。它必须返回如下参数:r0—堆基地址;r1—堆栈基地址;r2—堆长度限制值(需要的话);r3—堆栈长度限制值(需要的话)。当用户使用分散加载功能的时候,必须重新实现一user_initial_staacklaeap(),否则连接器会报错:Error:L6218E:Unde
3、finedsymbolImager$$ZI$$一Limit(referredfromsys_stackheap.o)。嵌入式开发教程注:Image$$ZI$$Limit变量为零初始化段(ZI段)的末地址。未使用分散加载时,堆默认就定位在ZI段的末地址,如图2所示。嵌入式开发教程__user_initial_stackheap()函数的实现有两种方法。(1)共用一个存储区汇编语言如下:嵌入式开发教程这种方式定义的堆栈和堆共用一个存储区,采用相向的增长方向,如图3所示。嵌入式开发教程汇编语言如下:嵌入式开发教程之使用两个存储区这种方式定义的堆栈和堆分别采用两个不同存储区。堆栈采用向下增长,
4、从地址Ox40000到地址Ox20000;堆采用向上增长,从地址0x28000000到地址0x28080000,如图4所示。嵌入式开发教程6.1定位目标外设使用分散加载,可以将用户定义的结构体或代码定位到指定物理地址上的外设,这种外设可以是定时器、实时时钟、静态SRAM或者是两个处理器间用于数据和指令通信的双端口存储器等。在程序中不必直接访问相应外设,只需访问相应的内存变量即可实现对指定外设的操作,因为相应的内存变量定位在指定的外设上。这样,对外设的访问看不到相应的指针操作,对结构体成员的访问即可实现对外设相应存储单元的访问,让程序员感觉到仿佛没有外设,只有内存。6特殊应用例如,一个带
5、有两个32位寄存器的定时器外设,在系统中的物理地址为Ox04000000,其C语言结构描述如下:嵌入式开发教程要使用分散加载将上述结构体定位到Ox04000000的物理地址,可以将上述结构体放在一个文件名为timer_regs.c中,并在分散加载文件中指定即可,如下:嵌入式开发教程属性UNINIT是避免在应用程序启动时对该执行段的ZI数据段初始化为零。在程序连接后,通过Imagemap文件可查看该ZI数据段的存储器分配情况:ExecutionRegionTIMER(Base:Ox04000000,Size:0x00000008,Max:0xffffffff,ABSOLUTE,UNINI
6、T)BaseAddrSizeTypeAttrIdxESectionName0biectOx040000000x00000008ZeroRW32.bsstlmer_regs.o从Imagemap文件可以看出,该TIMER执行区定位在物理地址0x04000000,即结构体timer_regs定位在Ox04000000,因此,在程序中对结构体的操作即是对定时器的操作。嵌入式开发教程分散加载机制在提供将指定代码和数据定位在指定物理地址的能力的同时,也提供了一种代码分割机制——可以将指定的零初始化段(ZI段)从可执行代码中分离出来。这样最终生成的烧入ROM或Flash中的镜像文件就不包括那部分分
7、割了的零初始化段,即使该零初始化段再大,也不影响最终生成的镜像文件的大小。但不采用分散加载机制,零初始化段在编译连接后是直接生成到镜像文件中的。它的大小直接影响最终要烧写的文件的大小,且零初始化段的大小还取决于内存的大小,它不能大到超过内存的大小;而采用分散加载机制,可以将某个零初始化段定位到非内存地址的一个存储器外设上,如NVRAM(非易失性随机存储器)。6.2定义超大型结构体数组笔者曾在一个实际工程中采用这种分散加载机制,将一个2MB的结构
此文档下载收益归作者所有