新闻中心

EEPW首页>嵌入式系统>设计应用> 基于ARM的嵌入式系统程序开发要点

基于ARM的嵌入式系统程序开发要点

作者: 时间:2016-12-02 来源:网络 收藏


2.堆栈的分配

在图-3 中,横坐标上还有一种情况,就是 16 位的存储器宽度,但是堆栈空间是 32 位的。这种情况下无论 ARM 还是 Thumb,其性能表现都比单纯的 16 位存储器系统情况下要好。这是因为 ARM 和 Thumb 其指令集虽然分 32 位和 16位,但是堆栈全部是采用32 位的。因此在 16 位堆栈和 32 位堆栈的不同环境下,其性能当然都会相差很多。这种差别还跟具体的应用程序密切相关,如果一个程
序堆栈的使用频率相当高,则这种性能差异很大;反之则要小一些。

在基于 ARM 的系统中,堆栈不仅仅被用来进行诸如函数调用、中断响应等时候的现场保护,还是程序局部变量和函数参数传递(如果大于4个)的存储空间。所以出于系统整体性能考虑,要给堆栈分配相对访问速度最快、数据宽度最大的存储器空间。

一个嵌入式系统通常存在多种多样的存储器类型。设计的时候一定要先清楚每一种存储器的访问速度,地址分配和数据线宽度。然后根据不同程序和目标模块对存储器的不同要求进行合理分配,以期达到最佳配置状态。

3.ROM 还是 RAM 在 0 地址处?

显然当系统刚启动的时候,0 地址处肯定是某种类型的 ROM,里面存储了系统的启动代码。 但是很多灵活的系统设计中, 0 地址处的存储器类型是可映射的。也就是说,可以通过软件的方法,把别的存储器(主要是快速的 RAM)分配以0 起始的地址。

这种做法的最主要目的之一是提高系统对中断的反应速度。因为每一个中断发生的时候,ARM 都需要从 0 地址处的中断向量表开始其中断响应流程,显然把中断向量表放在 RAM 里,比放在 ROM 里有更快的访问速度。因此,如果系统提供了这一类的地址重映射功能,软件设计者一定要加以利用。

下面是一个典型的经过 0 地址重映射之后的存储空间分布图,注意尽可能把速度要求最高的部分放置在系统里面访问速度最快、带宽最宽的 RAM 里面。


图-4 系统存储器分布的实例

4.存储器地址重映射(memory remap)

存储器地址重映射是当前很多先进控制器所具有的功能。在上一节中已经提到了 0 地址处存储器重映射的例子,简而言之,地址重映射就是可以通过软件配置来改变一块存储器物理地址的一种机制或方法。

当一段程序对运行自己的存储器进行重映射的时候,需要特别注意保证程序执行流程在重映射前后的承接关系。下面是一种典型的存储器地址重映射情况:


图-5 存储器重映射举例 1

系统上电后的缺省状态是 0地址上放有 ROM,这块 ROM 有两个地址:从0起始和从0x10000 起始,里面存储了初始化代码。当进行地址 remap以后,从 0起始的地址被定向到了 RAM 上,ROM 则只保留有唯一的从 0x10000 起始的地址了。

如果存储在 ROM 里的 Reset_Handler 一直在0 – 0x4000的地址上运行,则当执行完remap以后,下面的指令将从RAM 里预取,必然会导致程序执行流程的中断。根据系统特点,可以用下面的办法来解决这个问题:
(1) 上电后系统从 0 地址开始自动执行,设计跳转指令在 remap 发生前使 PC指针指向0x10000 开始的 ROM 地址中去,因为不同地址
指向的是同一块ROM,所以程序能够顺利执行。
(2) 这时候 0 - 0x4000的地址空间空闲, 不被程序引用, 执行remap后把 RAM引进。因为程序一直在 0x10000 起始的 ROM 空间里
运行,remap 对运行流程没有任何影响。
(3) 通过在 ROM 里运行的程序,对 RAM 进行相应的代码和数据拷贝,完成应用程序运行的初始化。


评论


技术专区

关闭