我正在为 TI 的 MSP430 MCU 开发裸机应用程序。该 MCU 使用非易失性存储器 FRAM。以下 SRAM 脚本运行良好:
SECTIONS {
__data_load_start = .;
.data : AT ( __data_load_start )
{
. = ALIGN(2);
__data_start = .;
*(.data*)
__data_end = .;
} >RAM
}
__data_load_start 获取闪存中的加载内存地址(隐式?),并在 RAM 中保留一些空间。
现在,我想将它用于非易失性存储器。这个内存区域,在某些情况下会被重新初始化为它们的初始值,因此加载地址(LMA)和虚拟地址(VMA)会不同,如ld 文档中所述。
SECTIONS {
__nvdata_load_start = .;
.NVdata : AT ( __nvdata_load_start ) {
. = ALIGN(2);
__nvdata_start = .;
*(.nvdata*)
__nvdata_end = .;
} >FRAM
但是,它不起作用。查看 .map 输出文件显示加载地址已设置在任何内存部分之外:/
.NVdata 0x0000000000004400 0x4 load address 0x0000000000010000
我想明确指定这个内存区域的初始值的位置。有人可以帮忙吗?
编辑:
我试图更新脚本没有任何隐式规则:
SECTIONS {
.NVdata : AT ( __nvdata_load_start ) {
. = ALIGN(2);
__nvdata_start = .;
*(.nvdata*)
__nvdata_end = .;
} >FRAM
.NVdataInit : {
. = ALIGN(2);
__nvdata_load_start = .;
/* reserve space for non volatile data init value */
. += SIZEOF(.NVdata);
} >FRAM
}
但在这种情况下,之后声明的每个部分都会在 VMA 和 LMA 之间获得一个偏移量。例如,下面的部分给出(.map 文件):
.textInit 0x0000000000004408 0x416 load address 0x000000000000440c
但是两个地址应该相同:/