链接器脚本中定义的变量未在 C++ 启动文件中通过

variables defined in linker script not coming through in c++ startup file

我有以下链接描述文件(省略了不相关的部分)

MEMORY
{
  PROGRAM_FLASH (rx) : ORIGIN = 0x60000000, LENGTH = 0x40000 
  SRAM_DTC (rwx) : ORIGIN = 0x20000000, LENGTH = 0x10000 
  SRAM_ITC (rwx) : ORIGIN = 0x0, LENGTH = 0x10000
  SRAM_OC (rwx) : ORIGIN = 0x20200000, LENGTH = 0x20000 
}

ENTRY(ResetISR)

SECTIONS
{
     /* Image Vector Table and Boot Data for booting from external flash */
.boot_hdr : ALIGN(4)
{
    FILL(0xff)
    __boot_hdr_start__ = ABSOLUTE(.) ;
    KEEP(*(.boot_hdr.conf))
    . = 0x1000 ;
    KEEP(*(.boot_hdr.ivt))
    . = 0x1020 ;
    KEEP(*(.boot_hdr.boot_data))
    . = 0x1030 ;
    KEEP(*(.boot_hdr.dcd_data))
    __boot_hdr_end__ = ABSOLUTE(.) ;
    . = 0x2000 ;
} >PROGRAM_FLASH

.vector : ALIGN(4)
{
    FILL(0xff)
    __vector_table_flash_start__ = . ;
    __vector_table_dtc_start__ = LOADADDR(.vector) ;
    
    KEEP(*(.isr_vector))
    
    . = ALIGN(4) ;
    
    __vector_table_size__ = . ;
     
} >PROGRAM_FLASH

相关要点:

在我的启动 .cpp 中,我添加了一些 externs 以便我可以读取链接器创建的内存信息。

extern unsigned int __vector_table_flash_start__;
extern unsigned int __vector_table_dtc_start__;
extern unsigned int __vector_table_size__;
    
/* some temp vars so that my assignments don't get optimized out */
volatile unsigned int i;
volatile unsigned int ii;
volatile unsigned int iii;

__attribute__ ((naked, section(".after_vectors.reset")))
void ResetISR(void) {
    // Disable interrupts
    __asm volatile ("cpsid i");
    __asm volatile ("MSR MSP, %0" : : "r" (&_vStackTop) : );
    //__asm volatile ("LDR r9, = __global_offset_table_flash_start__");
    
    i = __vector_table_flash_start__;
    ii = __vector_table_dtc_start__;
    iii = __vector_table_size__;
}

同样,没有什么有趣的,只是一些代码来确保没有任何优化,而且我可以在调试器中看到变量的实际值。

当我们知道我的 flash 从 0x60000000 开始并且我的 .vector 部分的偏移量为 0x2000

Variable Expected Actual
vector_table_flash_start 0x6002000 0x20010000
vector_table_dtc_start 0x6002000 0x20010000
vector_table_size 0x45 0xffffffff

我这里哪里做错了??

供参考,反汇编的相关部分(arm-none-eabi-objdump --disassemble-all eclipse/MIMXRT1024_Project/Debug/MIMXRT1024_Project.axf > disassemble_pic)

您需要检查链接描述文件变量的地址,而不是它们的值。地址是链接描述文件设置的。该值恰好位于该地址 - 大概是向量 table.

中的第一个向量