我有一组中断向量表的链接描述文件部分。这些部分将位于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
}
答案 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中,前提是向量表不是完全空的。如果它不打扰我,它只是没有被复制,主要的是矢量不会在错误的地方结束。