一种ARMv7m架构下可执行代码的存储方法

文档序号:8543550阅读:1288来源:国知局
一种ARMv7m架构下可执行代码的存储方法
【技术领域】
[0001]本发明涉及一种ARMv7m架构下可执行代码的存储方法,特别涉及一种在ARMv7m架构下将可执行代码存储于片外无XIP的Flash上的方法。
【背景技术】
[0002]在计算机系统中,CPU需要先提取到机器指令、然后译码、最后才能执行机器指令。机器指令需要存储在CPU可直接寻址的存储器上,才能被CPU提取出来。CPU可直接寻址的存储器一般是片内RAM、片外并行总线的RAM、或者并行总线的支持XIP (片上执行)功能的Flash存储器。这样的存储器的单位存储空间价格都比较高,所以嵌入式MCU上一般不会配置大容量的可供存储执行代码的存储器。这使得嵌入式MCU上可提供的软件功能受到限制。如果通过外扩并行总线的存储器来扩展存储执行代码的空间,则会占用CPU的PIN脚资源,使可用1资源变少。目前市面上有一种带有XIP功能的SPI总线的Flash,在特定的支持SPI XIP Flash的CPU上可以用来存储执行代码。但这使得产品方案的选型受限于特定的Flash和CPU器件。
[0003]ARM v7m是ARM公司发布第7版MCU内核架构。这种架构下,又因为CPU选配件的差异,衍生出Cortex-M3、Cortex_M4等子型号。基于这种架构的MCU其芯片效能相对与之前的ARM9/ARM11等处理器有明显提高,在工业控制、通讯设备、智能外设等领域有着广泛的应用。然而,ARM v7m架构的MCU,受上述提到的可直接存储可执行代码的空间大小的限制,难以被应用于复杂应用场景的设备中。这使得复杂应用场景的设备不得不使用芯片效能低的ARM9/ARM11处理器,或者ARM v7r、ARM v7a等高成本的处理器,进而影响到产品的性价。
[0004]而ARM v7m架构中存在一个CPU选配组件,称为FPB (Flash补丁及断点模块),该组件一般用于在ARM v7m架构的处理器中实现在线调试功能。虽然FPB是选配组件,但目前大部分的ARM v7m的MCU实现都带有FPB组件。FPB的运行机制是临时性接管CPU内核对某些地址的Flash存储器的访问,将对应地址上的Flash内容替换成断点代码或者指定的RAM中存储的指令代码返回给CPU内核,让CPU内核因为执行到断点指令而停止运行,或执行被替换过的目标指令代码。ARM v7m架构中同时约定,0x00000000?OxlFFFFFFF地址的512MB空间为可存储执行代码的Flash空间。即使CPU上仅具备16KB的Flash空间,0x4000?OxlFFFFFFF的地址空间仍然被CPU内核作为Flash地址空间处理对待,且FPB同样可以在这片没有实际关联物理Flash的地址上生效,也就是说,可以通过FPB将一片RAM空间关联到一处未和物理Flash关联的地址上,将其作为存储了可执行代码的存储空间,供CPU内核获取和执行机器指令使用;同时,这片RAM空间可以动态被更新为新的值,且可以被FPB重新设置关联到新的Flash地址上。RAM上的执行代码不被使用时,还可以存放于片外的无XIP功能的SPI Nor Flash上或者Nand Flash上,对存储设备无太大的要求。
[0005]因此,若能使用一小片片内的Flash存储FPB管理代码,就可以利用不大的RAM空间和廉价的片外Flash,将CPU的可执行代码的存储空间扩大到512MB。有鉴于此,本发明人特潜心研宄该思想的实现方法而才有本发明问世。

【发明内容】

[0006]本发明要解决的技术问题,在于提供一种ARMv7m架构下可执行代码的存储方法,消耗内存小、不依赖于特定的Flash器件,可将程序代码的执行空间扩大到512MB。
[0007]本发明是这样实现的:一种ARMv7m架构下可执行代码的存储方法,在编译和烧录程序中,通过编译器的参数配置,将启动程序、FPB关联程序、执行程序、总线异常处理程序和系统及驱动程序定位于CPU片内物理存储器关联的Flash地址空间上,而将其他程序定位于CPU没有物理存储器关联的Flash地址空间上;编译生成目标可执行代码的二进制镜像文件;然后,软件开发人员将该启动程序、FPB关联程序、执行程序、总线异常处理程序和系统及驱动程序烧录到其编译时指定地址的CPU物理存储器上,并将所述其他程序烧录到片外Flash上;在设备上电启动后的第一阶段,所述启动程序先依次初始化系统和设备驱动、初始化FPB组件以及软件全局变量这些基本运行环境,然后启动程序提取出后续程序的第一条指令代码的Flash执行地址,送入所述FPB关联程序进行FPB关联处理,所述FPB关联程序能被所述启动程序和所述执行程序调用;所述FPB关联程序传入地址皇数为本次需要关联执行的第一条指令代码的Flash执行地址,执行“加载被执行代码并对其进行FPB关联的过程”;在得到调用者传入的代码的Flash执行地址后,检查对应地址的代码是否已经被加载到RAM缓冲中,如果代码未被加载到RAM缓冲中,则通过Flash驱动程序从片外的Flash中将对应代码载入RAM缓冲中,加载完成后,计算出程序指令地址对应的代码在RAM中的存储地址,设FPB组件一共有η个单元可供使用,每个单元关联m个字节的Flash地址空间,该RAM缓冲的大小定义为k字节,则k字节应该至少等于n*m字节,通过设置FPB,将该地址开始n*m字节的RAM地址与代码的Flash执行地址实现关联;所述执行程序在所述FPB关联程序之后被调用,所述执行程序的传入地址参数和所述FPB关联程序传入的地址参数相同,所述执行程序将传入的地址参数送入CPU的PC寄存器,然后CPU将自动完成后续的代码执行过程;当所述执行程序执行过程引发总线异常时,所述总线异常处理程序被调用执行,通过查询CPU的异常状态寄存器,从而获知异常是由CPU取指令引发还是由CPU数据访问引发,若异常由CPU取指令引发,则将异常地址作为参数调用所述FPB关联程序进行重关联处理,若异常由CPU数据访问引发,则所述总线异常处理程序继续检查引发异常的指令是否为LDM多寄存器加载指令,若是,则由所述总线异常处理程序代替CPU完成LDM指令的功能,然后返回下一条指令代码地址让CPU继续执行,若不是,则将要访问的数据地址为参数调用所述FPB关联程序进行重关联处理。
[0008]进一步的,若CPU具备DMA功能,则所述FPB关联程序在执行所述“加载被执行代码并对其进行FPB关联的过程”之后还执行“加载预判为即将被执行的代码段的过程”,该“加载预判为即将被执行的代码段的过程”开辟一片与所述“加载被执行代码并对其进行FPB关联的过程”的RAM缓冲大小k字节相等的RAM空间作为辅助RAM缓冲,然后将片外的Flash上紧随所述“加载被执行代码并对其进行FPB关联的过程”所加载的代码之后的k字节代码加载到辅助RAM缓冲中,该加载过程通过DMA实现;且该“加载预判为即将被执行的代码段的过程”执行的结果用于加速下一次“加载被执行代码并对其进行FPB关联的过程”。
[0009]本发明具有如下优点:
[0010]本发明提供了一种在常见的ARM v7m处理器上可以实现的将执行代码存储与片外廉价存储器上的方法,该方法可将程序代码的执行空间扩大到512MB,消耗内存小、不依赖于特定的Flash器件,实现代价小、实现收益明显,且有利于将复杂的应用场景实现在基于ARM v7m的MCU上,扩大ARM v7m的MCU的应用场景,并降低对应产品的成本。
【附图说明】
[0011]下面参照附图结合实施例对本发明作进一步的说明。
[0012]图1为本发明方法执行流程图。
【具体实施方式】
[0013]如图1所示,本发明方法主要由五个逻辑单元参与,分别是:编译和烧录程序1、启动程序2、FPB关联程序3、执行程序4以及总线异常处理程序5。这五个逻辑单元在整体过程中的配合关系如图1所示。所述启动程序2、FPB关联程序3、执行程序4以及总线异常处理程序5这四个逻辑单元的软件实现均存储于CPU原生支持的代码存储器中,例如存储于片内的Flash或ROM中。
[0014]在所述编译和烧录程序I中,通过编译器的参数配置,将启动程序2、FPB关联程序3、执行程序4、总线异常处理程序5和系统及驱动程序定位于CPU片内物理存储器关联的Flash地址空间上,而将其他程序定位于CPU没有物理存储器关联的Flash地址空间上;编译生成目标可执行代码的二进制镜像文件;然后,软件开发人员将该启动程序2、FPB关联程序3、执行程序4、总线异常处理程序5和系统及驱动
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1