STM32引入RO,RW存储信息

在Keil启动文件 startup.s中加入以下代码,将信息先导入,在DCD命名空间,将该信息导出到其他文件使用,如BaseOfROM可以在NVIC重定位的函数中可以自动适配。


IMPORT|Image$$ER_IROM1$$RO$$Base| ; ROM code start
IMPORT |Image$$ER_IROM1$$RO$$Limit|; RAM data starts after ROM program
IMPORT|Image$$RW_IRAM1$$RW$$Base| ; Pre-initialised variables
IMPORT|Image$$ER_IRAM1$$RW$$Limit|; End of variable RW space
IMPORT |Image$$RW_IRAM1$$ZI$$Base|; uninitialised variables
IMPORT |Image$$RW_IRAM1$$ZI$$Limit|; End of variable RAM space


BaseOfROM DCD |Image$$ER_IROM1$$RO$$Base|
TopOfROM DCD |Image$$ER_IROM1$$RO$$Limit|
BaseOfBSS DCD |Image$$RW_IRAM1$$RW$$Base|
EndOfBSSDCD|Image$$RW_IRAM1$$RW$$Limit|
BaseOfZeroDCD|Image$$RW_IRAM1$$ZI$$Base|
EndOfZeroDCD |Image$$RW_IRAM1$$ZI$$Limit|


EXPORT BaseOfROM
EXPORT TopOfROM
EXPORT BaseOfBSS
EXPORTEndOfBSS
EXPORT BaseOfZero
EXPORT EndOfZero


TopOfROM只是RO(Code+RO代码Limit,实际TopOfROM应该是TopOfROM+(EndOfBSS-BaseOfBSS),即Code+RO+RW);

EndOfBSS=BaseOfZero,EndOfZero实际为RAM使用的大小,不包含Stack,Heap。

附:

在ADS 中一般要在工程的链接控制选项中设置RO BASE 和RW BASE,这样就在编译链接

产生的映象文件中指定了RO 、RW 和ZI 所在的区域位置,并用Image$$RW$$Base、
Image$$RW$$Limit 、Image$$RO$$Base 、Image$$RO$$Limit 、Image$$ZI$$Base 和
Image$$ZI$$Limit 等6 个段地址描述符表示,用户可以在程序中引用。而Realview MDK 链
接程序使用了链接控制命令选项(类似于ADS,但最终还是会生成链接脚本文件*.sct)和
分散加载链接脚本文件*.sct 两种方式控制程序的链接。在链接脚本文件中 段地址描述符
格式为:Image$$段名$$区域名$$Base 和Image$$段名$$区域名$$Limit。 下面是由下一节
的LED 实例中如图6.20 所示的控制选项生成的分散加载链接脚本文件LED.sct。
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************
LR_ROM1 0x30000000 0x01000000 { ; load region size_region
ER_ROM1 0x30000000 0x01000000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
RW_RAM1 0x31000000 0x01000000 { ; RW data
.ANY (+RW +ZI)
}
RW_IRAM1 0x40000000 0x00001000 {
.ANY (+RW +ZI)
}
}
我们可以在汇编文件中引入这些段描述符,在该脚本中:|Image$$ER_ROM1$$RO$$Base|
值为0x30000000,对应ADS1.2 中的|Image$$RO$$Base|;|Image$$ER_ROM1$$RO$$Limit|值
为与实践编译的Code 有关, 如果Code=1000 , 十六进制值为0x3e8 , 则
|Image$$ER_ROM1$$RO$$Limit|值就为0x300003e8,对应ADS1.2 中的|Image$$RO$$Limit|;
|Image$$RW_RAM1$$RW$$Base|值为0x31000000,对应ADS1.2 中的|Image$$RW$$Base|;如
果代码中的RW-data=8,则|Image$$RW_RAM1$$RW$$Limit|和|Image$$RW_RAM1$$ZI$$Base|
值为0x31000008, 分别对应ADS1.2 中的|Image$$RW$$Limit| 和|Image$$ZI$$Base| ;
|Image$$RW_RAM1$$ZI$$Limit| 值为|Image$$RW_RAM1$$ZI$$Base| 加上代码实践中的
ZI-data 数,对应ADS1.2 中的|Image$$ZI$$Limit|。另外在该脚本中还有RW_IRAM1 段,它
和RW_RAM1 一样也有RW 和ZI 区域。

你可能感兴趣的:(STM32)