链接器脚本中定义的变量未在 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
相关要点:
- 闪存从 0x600000000 开始
- 一些 XIP 引导字节被写入闪存开头的专用位置,后面是“我自己的东西”。
- 我将向量表放在 0x60002000(或者更准确地说,nxp sdk 需要一些 xip 字节并跳转到 0x60002000,我可以在其中放置我自己的东西)。
- 我正在用当前位置创建一些变量,以便我可以在我的启动脚本中使用它们
- 当我查看反汇编代码时,我可以清楚地看到我的向量表描述了 0x45 个字,所以使用上面的链接器脚本我希望我的
__vector_table_size__
至少是 0x45
在我的启动 .cpp 中,我添加了一些 extern
s 以便我可以读取链接器创建的内存信息。
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.
中的第一个向量
我有以下链接描述文件(省略了不相关的部分)
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
相关要点:
- 闪存从 0x600000000 开始
- 一些 XIP 引导字节被写入闪存开头的专用位置,后面是“我自己的东西”。
- 我将向量表放在 0x60002000(或者更准确地说,nxp sdk 需要一些 xip 字节并跳转到 0x60002000,我可以在其中放置我自己的东西)。
- 我正在用当前位置创建一些变量,以便我可以在我的启动脚本中使用它们
- 当我查看反汇编代码时,我可以清楚地看到我的向量表描述了 0x45 个字,所以使用上面的链接器脚本我希望我的
__vector_table_size__
至少是 0x45
在我的启动 .cpp 中,我添加了一些 extern
s 以便我可以读取链接器创建的内存信息。
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.
中的第一个向量