强制链接器脚本部分

时间:2016-09-07 11:29:59

标签: c embedded ld msp430 linker-scripts

我有一组中断向量表的链接描述文件部分。这些部分将位于RAM中,并将通过我的代码加载到RAM中。由于每个向量必须位于绝对位置,因此每个向量都有一个单独的部分(和一个单独的存储区域)。

应用程序可能不会使用某些向量,而其他向量则会使用。为了确保复制代码仍然有效,我需要确保,如果不存在向量,则填充ROM中的等效空间(两个字节)。我尝试通过推进位置指针来做到这一点,但当然这只会影响VMA,因此对我没有任何帮助。

如何确保某个部分始终占用ROM中所需的空间量?即如果该部分中没有数据,我该如何移动LMA?

非常感谢任何提示或提示。

我在下面删除了我当前的链接描述文件:

OUTPUT_ARCH(msp430)
ENTRY(_start)

MEMORY {
  ROM (rx)         : ORIGIN = 0x9C02, LENGTH = 0x61FE
  VECT1            : ORIGIN = 0x5B80, LENGTH = 0x0002
  VECT2            : ORIGIN = 0x5B82, LENGTH = 0x0002
  ...
  VECT63           : ORIGIN = 0x5BFC, LENGTH = 0x0002
}

SECTIONS
{
  __interrupt_vector_1 : 
  { 
    __vectable_load__ = LOADADDR(__interrupt_vector_1);
    __vectable_start__ = .;
    __interrupt_vector_1__ = .;
    KEEP (*(__interrupt_vector_1))
    . = __interrupt_vector_1__ + 2;
  } > VECT1 AT> ROM
  __interrupt_vector_2 : 
  { 
    __interrupt_vector_2__ = .;
    KEEP (*(__interrupt_vector_2)) 
    . = __interrupt_vector_2__ + 2;
  } > VECT2 AT> ROM

  ...

  { 
    __interrupt_vector_63__ = .;
    KEEP (*(__interrupt_vector_63))
    KEEP (*(__interrupt_vector_sysnmi))
    . = __interrupt_vector_63__ + 2;
    __vectable_end__ = .;
  } > VECT63 AT> ROM
}

1 个答案:

答案 0 :(得分:0)

我创造了一个解决方案。回想起来很明显,但如果这有助于其他任何人,我会在这里描述一下。

我的位置指针前进没有帮助,因为如果输入部分中没有数据,则链接器会丢弃输出部分。这意味着没有数据会被添加到ROM中。我需要在那里添加填充到ROM,因为我需要向量表总是相同的大小。我通过使用位置指针前进来解决这个问题,但是将所有中断向量放在一个部分中:

OUTPUT_ARCH(msp430)
ENTRY(_start)

MEMORY {
  ROM (rx)         : ORIGIN = 0x9C02, LENGTH = 0x61FE
  VECTABLE         : ORIGIN = 0x5B80, LENGTH = 0x007E
}

SECTIONS
{
  .vector_table :
  {
    __vectable_load__ = LOADADDR(.vector_table);
    __vectable_start__ = .;
    __interrupt_vector_1__ = .;
    KEEP (*(__interrupt_vector_1))
    . = __interrupt_vector_1__ + 2;
    __interrupt_vector_2__ = .;
    KEEP (*(__interrupt_vector_2)) 
    . = __interrupt_vector_2__ + 2;
    ...
    __interrupt_vector_63__ = .;
    KEEP (*(__interrupt_vector_63))
    KEEP (*(__interrupt_vector_sysnmi))
    . = __interrupt_vector_63__ + 2;
    __vectable_end__ = .;
  } > VECTABLE AT> ROM
}

现在必要的填充将添加到RAM和ROM中,前提是向量表不是完全空的。如果它不打扰我,它只是没有被复制,主要的是矢量不会在错误的地方结束。