ARM单片机中程序在ROM空间和RAM空间的分布(分散加载文件,Scatter-Loading Description File)

     对于 K e i l u V i s i o n I D E Keil\quad uVision\quad IDE KeiluVisionIDE,程序编译好之后,代码的下载位置( R O M ROM ROM空间)以及代码运行的时候使用的 R A M RAM RAM空间( R A M RAM RAM空间)默认在图1所示的红圈中的位置进行配置,但是这里的配置对于比较复杂的情况可能就不是太友好了,比如要配置从 S R A M SRAM SRAM启动(那么中断向量表就要放在地址 0 x 20000000 0x20000000 0x20000000开头的位置,图1所示的红圈中的配置大部分默认是从内部 F L A S H FLASH FLASH启动)。这时就可以利用分散加载文件来代替图1中红圈中的配置。如果要使用分散加载文件来代替图1中红圈中的配置的话需要将图2中红圈处的勾选取消并且蓝色圈的位置是分散加载文件的目录。

 
图1.
 
图2.

     和图1中红圈中的配置相同的分散加载文件如下所示:

; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

LR_IROM1 0x08000000 0x00080000  {    ; load region size_region
  ER_IROM1 0x08000000 0x00080000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
   .ANY (+XO)
  }
  RW_IRAM1 0x20000000 0x00010000  {  ; RW data
   .ANY (+RW +ZI)
  }
}

     需要注意的是我这里不会详细的去讲解分散加载文件,对于这部分的内容我也没有详细的看,因为这部分内容似乎还挺多的,需要详细了解的可以去看一下图3的 A R M ARM ARM的官方文档。我这里只是记录一下我常用的几种配置。

 
图3.

     这里弄了一个简单且常见的例子(基于 S T M 32 F 103 Z E T 6 STM32F103ZET6 STM32F103ZET6芯片,片上 F L A S H FLASH FLASH为512 K B KB KB S R A M SRAM SRAM为64 K B KB KB),这里图4中的配置是基于从 S R A M SRAM SRAM启动的。这里只是简单的将中断向量表放在 S R A M SRAM SRAM区域从地址 0 x 20000000 0x20000000 0x20000000开头的 2 K B 2KB 2KB的区域, t e s t . c test.c test.c放在 S R A M SRAM SRAM区域从地址 0 x 20000800 0x20000800 0x20000800区域开头的 2 K B 2KB 2KB的区域,然后其它的代码都放在片上 F L A S H FLASH FLASH从地址 0 x 80000000 0x80000000 0x80000000开始的区域。

 
图4.

     这里程序编译完之后会生成3个 b i n bin bin文件,如图5和图6所示所示,这3个 b i n bin bin文件和图4中3个 l o a d r e g i o n load\quad region loadregion对应,这里生成 b i n bin bin文件的命令如图7所示。

fromelf --bin --output=..\bin\sct.bin  ..\obj\sct.axf
 
图5.
 
图6.
 
图7.

     这里还需要注意的是既然有三个 b i n bin bin文件,那可能就需要三部分的下载算法配置和这三个 b i n bin bin文件相对应(其实 b i n bin bin文件 E R _ I R O M 2 ER\_IROM2 ER_IROM2 b i n bin bin文件 E R _ I R O M 3 ER\_IROM3 ER_IROM3的地址区域是连续的,因此只用一个部分的下载算法配置也是可以了),如图8所示。如果有针对 S R A M SRAM SRAM区域的下载算法的话, b i n bin bin文件 E R _ I R O M 2 ER\_IROM2 ER_IROM2 b i n bin bin文件 E R _ I R O M 3 ER\_IROM3 ER_IROM3应该用针对 S R A M SRAM SRAM区域的下载算法。还有就是这里地址区域从 0 x 20000000 0x20000000 0x20000000 0 x 20000 F F F 0x20000FFF 0x20000FFF已经被 b i n bin bin文件 E R _ I R O M 2 ER\_IROM2 ER_IROM2 b i n bin bin文件 E R _ I R O M 3 ER\_IROM3 ER_IROM3占用了,因此提供给程序运行的 R A M RAM RAM区域以及下载算法用到的 R A M RAM RAM区域都不能用到这块区域,因此图8中 R A M f o r A l g o r i t h m RAM\quad for\quad Algorithm RAMforAlgorithm的配置以及图4中提供给程序运行的 R A M RAM RAM区域的配置都是从地址 0 x 20001000 0x20001000 0x20001000开始。

 
图8.

     假设现在存储空间的分布按照图9的配置,则还有方法来指定变量或函数存储在指定的地址开始的存储空间,如图10和图11所示。图10将数组 g l o b a l _ a r r a y global\_array global_array放在从地址 0 x 20001000 0x20001000 0x20001000开始的存储空间,将数组 g l o b a l _ a r r a y _ e x t r a global\_array\_extra global_array_extra放在从地址 0 x 20009000 0x20009000 0x20009000开始的存储空间,但是从图9可以看出,这里配置的不论是 R O M ROM ROM区域还是 R A M RAM RAM区域都没有包含地址 0 x 20009000 0x20009000 0x20009000开始的存储空间,因此这里会对数组 g l o b a l _ a r r a y _ e x t r a global\_array\_extra global_array_extra专门生成一个 B I N BIN BIN文件,如图12所示,如果图8中下载算法的配置的 A d d r e s s R a n g e Address\quad Range AddressRange覆盖了地址 0 x 20009000 0x20009000 0x20009000开始的存储空间,则下载算法还是会把数组 g l o b a l _ a r r a y _ e x t r a global\_array\_extra global_array_extra下载到地址 0 x 20009000 0x20009000 0x20009000开始的存储空间里面去,否则会报算法缺失的错误。

 
图9.
 
图10.
 
图11.
 
图12.

     我们再来看一个例子,假设此时存储器的配置按照图1的配置,第一种情况如图13所示,这种情况我们在这里已经讲过了,这里数组 g l o b a l _ a r r a y global\_array global_array会被编译器自动分配到 S R A M SRAM SRAM区域(地址 0 x 20000000 0x20000000 0x20000000开始),属于全局区,打印出来的地址值也确实是在 S R A M SRAM SRAM区域。

 
图13.

     假设此时存储器的配置按照图1的配置,第2种情况如图14所示,这时数组 g l o b a l _ a r r a y global\_array global_array被指定存放到片上 F L A S H FLASH FLASH区域(地址 0 x 08001000 0x08001000 0x08001000开始),打印出来的地址值也确实是在 F L A S H FLASH FLASH区域。在上一种情况中,数组 g l o b a l _ a r r a y global\_array global_array在程序运行中是可读可写的,但是这里数组 g l o b a l _ a r r a y global\_array global_array在程序运行中就变成只读的了,这一点需要注意。因为此时数组 g l o b a l _ a r r a y global\_array global_array被放到了片上 F L A S H FLASH FLASH区域,而片上 F L A S H FLASH FLASH区域是不能随机写的,必须先擦除才能写。

 
图14.

     最后再提一下利用图15和图16的配置也可以把 t e s t _ s c t test\_sct test_sct函数放到从地址 0 x 20000800 0x20000800 0x20000800开头的 2 K B 2KB 2KB的区域。

 
图15.
 
图16.
  • 29
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qqssss121dfd

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值