对于 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中红圈中的配置相同的分散加载文件如下所示:
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************LR_IROM1 0x08000000 0x00080000 { ; load region size_regionER_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的官方文档。我这里只是记录一下我常用的几种配置。
这里弄了一个简单且常见的例子(基于 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开始的区域。
这里程序编译完之后会生成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
这里还需要注意的是既然有三个 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开始。
假设现在存储空间的分布按照图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开始的存储空间里面去,否则会报算法缺失的错误。
我们再来看一个例子,假设此时存储器的配置按照图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区域。
假设此时存储器的配置按照图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区域是不能随机写的,必须先擦除才能写。
最后再提一下利用图15和图16的配置也可以把 t e s t _ s c t test\_sct test_sct函数放到从地址 0 x 20000800 0x20000800 0x20000800开头的 2 K B 2KB 2KB的区域。