[英]variables defined in linker script not coming through in c++ startup file
我有以下 linker 腳本(省略了不相關的部分)
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
所以相關的要點:
__vector_table_size__
至少是 0x45 在我的 startup.cpp 中,我添加了一些extern
,以便我可以讀取由 linker 創建的 memory 信息。
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
時
多變的 | 預期的 | 實際的 |
---|---|---|
vector_table_flash_start | 0x6002000 | 0x20010000 |
vector_table_dtc_start | 0x6002000 | 0x20010000 |
向量表大小 | 0x45 | 0xffffffff |
我在這里做錯了什么?
作為參考,反匯編的相關部分( arm-none-eabi-objdump --disassemble-all eclipse/MIMXRT1024_Project/Debug/MIMXRT1024_Project.axf > disassemble_pic
)
您需要檢查 linker 腳本變量的地址,而不是它們的值。 地址是 linker 腳本設置的。 該值恰好位於該地址 - 大概是向量表中的第一個向量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.