1

我正在为 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

但是两个地址应该相同:/

4

1 回答 1

0

我找到了解决方法。当我声明 .NVdata 和 .NVdataInit 部分(就在上面)时,LMA 和 VMA 之间存在偏移,并且二进制代码不正确。

在接下来的部分中,我强制 LMA 和 VMA 相同:

SECTIONS {
    /* we make sure that both 
     * - VMA (virtual memory address) and 
     * - LMA (load memory address) 
     * are the same */
  .textInit __nvdata_load_end : AT(__nvdata_load_end) {
    KEEP(*(.init)) /* start here after reset */
  } > FRAM
}

它现在可以完美运行,即使我不明白为什么会出现这个偏移:/

于 2019-12-10T15:00:23.917 回答