资源预览内容
第1页 / 共6页
第2页 / 共6页
第3页 / 共6页
第4页 / 共6页
第5页 / 共6页
第6页 / 共6页
亲,该文档总共6页全部预览完了,如果喜欢就下载吧!
资源描述
使用AD1.2进行嵌入式软件开发(下)上期重要简介了基于ARM的嵌入式系统软件开发中,如何来对必要的C库函数进行移植和重定向,以及如何根据不同的目的存储器系统进行程序编译和连接设立。本期简介程序中的存储器分派和如何根据设立对的初始化系统。放置堆栈和heapctelan机制提供了一种指定代码和静态数据布局的措施。下面简介如何放置应用程序的堆栈和hap。* _user_inii_sackheap重定向应用程序的堆栈和hea是在C库函数初始化过程中建立起来的。可以通过重定向相应的子程序来变化堆栈和hea的位置,在S的库函数中,即_ser_niti_takep()函数。ur_initia_sackheap()可以用C或汇编来实现,它必须返回如下参数:r0:hep基地址;1:堆栈基地址;2:heap长度限制值(需要的话);r:堆栈长度限制值。当顾客使用分散装载功能的时候,必须重调用_ser_inti_tachep(),否则连接器会报错:rr: 621: Undefined symbo Iag$ZI$Limt(referre from sys_stackheap.o)*存储器模型AS提供了两种实时存储器模型。缺省时为on-reio,应用程序的堆栈和hp位于同一种存储器区块,使用的时候相向生长,当在heap辨别配一块存储器空间时需要检查堆栈指针。另一种状况是堆栈和heap使用两块独立的存储器区域。对于速度特别快的AM,可选择只用来作堆栈使用。为了使用这种wo-regin模型,顾客需要导入符号stwo_egin_my,hap使用需要检查hea的长度限制值。对这两种模型来说,缺省状况下对堆栈的生长都不进行检查。顾客可以在程序编译时使用-apcs/swst 编译器选项来进行软件堆栈检查。如果使用two-rgi模型,必须得在执行use_initialstackeap时指定一种堆栈限制值。 图9 重定向_user_nial_sackheap()图10 基本初始化过程图11ROM/RA重定向和映射表1系统复位和初始化目前状况,一般假设程序从C库函数的初始化入口_main开始执行。事实上,所有的嵌入式程序在启动时都要执行某些系统级的初始化操作。在此讨论这方面的内容。初始化过程图0中显示了一种基于ARM的嵌入式系统的基本初始化过程。可以看到,在_man之前加入了一种复位解决模块reet hndler,它在系统上电复位时立即启动。标记为u$in的新代码块在进入主程序之前执行。复位解决模块resthander一般是一小段汇编代码,在系统复位时执行。它至少完毕应用程序中使用到的所有解决器模式的堆栈初始化工作。对于具有本地存储器系统的内核(例如含ca的M内核),配备工作也必须在这一段初始化过程中完毕。当完毕系统初始化之后,一般程序会跳向_man,开始库函数的初始化过程。系统初始化过程一般还涉及此外某些内容,中断使能等,这些大多安排在C库函数的初始化完毕之后执行。$sub$min()完毕这部分功能。向量表(eor abe)所有的AM系统均有一张中断向量表当浮现异常需要解决时,必须调用向量表。向量表一般要位于0地址处。表2表3表4表5表表7表8表9表0存储器配备*RM/RAM重定向当系统启动的时候,为了保证0地址处有对的的启动代码存在,需要非易失性的存储器。一种简朴的措施,就是把系统0x00开始的一块地址分派给ROM。其缺陷是,由于ROM的访问速度比AM慢诸多,当执行中断响应需要从中断向量表跳转时,会给系统性能带来损失;同步,在O中的向量表内容也不能被顾客程序动态修改。此外一种可行的方案如图1所示。RO位于地址x100开始的地方,但是在系统复位时又被存储器控制器映射到0x00地址处。这样当系统启动之后,在地址000看到的是ROM,系统执行这块R中的启动代码,启动代码跳转到真正的RO的地址,并让存储器控制器移除对ROM的地址映射。这时0x0000地址处的存储器又恢复回了RM。_main中的代码把向量表coy到x000处的AM中去,使得异常时能被对的响应。表1为RM汇编中执行ROM/RAM重定向和映射的一种例子。它以R公司的Integato平台为基本的,该措施合用于类似ROMRAM重定向措施的所有平台。第一条指令完毕从RM的映射地址(0x00000)到真实地址的跳转。地址标号inuc是ROM的真实地址(18004)。然后通过设立Inerat平台上的相应控制寄存器,移除ROM的地址映射。代码在系统一启动就被执行。所有有关地址重定向/映射的操作必须在C库函数初始化之前完毕。*本地存储器配备许多ARM解决器均有片上存储器系统,如ace和紧密耦合存储器(CM)、存储器 tat_bak cass=ioextk管理单元(MM)或存储器保护单元(MP)。这些设备都要在系统初始化过程中对的配备,并且有某些特殊的规定需要考虑。由前文可知,_mai中的C库函数初始化代码负责程序运营时的存储器系统设立。因此,整个存储器系统自身必须得在_ain之前完毕初始化工作,如MU或PU必须在rethade里面完毕配备。紧密耦合存储器(TC)的初始化同样须在_main之前完毕(一般在MMU/MP之前),由于一般程序都需要把代码和数据分散装入TCM。需要注意的是当M被使能后,不再访问被CM屏蔽的存储器。有关ahe的一致性问题,如果cache在_main之前使能的话,那么当min里面进行从装载区到执行区的代码和数据拷贝时(由于在拷贝过程中指令和数据在本质上都是被当作数据解决),指令会出目前数据缓冲区。避免此问题的措施是在C库函数初始化完毕后再使能cache。*Scatr loaig与存储器配备无论是通过RO/RM重定向还是MMU配备的措施,如果系统在启动和运营时存储器分布不一致,scttroang文献中的定义就要按照系统重定向后的存储器分布状况进行。以上文RO/重定向为例:OA_OM 0x1000 0x00EXE_ROM0x1000 x800reetadlr. (+O, +FST).RAMx00 x000vectr.(+RO,+FRST).装载区LAD_O被放置在0x100处,代表了重定向之后裔码和数据的装载地址。堆栈的初始化程序中也许用到的解决器模式,都需要定义一种堆栈指针。在表2中,堆栈位于stack_be标记的地址中。这个符号可以是存储器系统中的一种直接地址,也可以在此外的汇编文献中定义,由caer文献来定义分派地址。表2代码为FIQ和R模式各分派了一种256字节的堆栈,顾客可以用同样的措施为其她模式也分派堆栈。最简朴的措施就是进入相应的模式,然后为SP寄存器指定相应的值。如果想使用软件堆栈检查,还必须指定一种堆栈长度限制值。堆栈指针和堆栈限制的数值会作为参数自动传递到C库函数的初始化代码_usr_iniia_stackeap中,在_uer_itiastackhep中不应当修改这些值。硬件初始化 $b$an()一般来说,应当把所有的系统初始化代码与主应用程序分离开来,但是有几种例外,例如cache和中断的使能,需要在C库函数初始化之后执行。表3代码显示了如何使用 $su和$supper 。连接器把呼喊mai()的函数替代成呼喊$su$min(),完毕cache和中断的使能,并最后跳向ain()。执行模式考虑为主应用程序选择一种解决器执行模式非常重要,这取决于系统的初始化代码。许多在启动过程中使用到的功能,如MMUMPU的配备、中断的使能等,只能在特权级模式下进行。如果需要在特权极模式下运营自己的应用程序,只要在退出初始化过程之前变化到相应的模式就行了,没有其她任何问题。
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号