簡體   English   中英

linker 腳本中定義的變量未通過 c++ 啟動文件

[英]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

所以相關的要點:

  • flash memory 從 0x600000000 開始
  • 一些 XIP 引導字節被寫入以 flash 開頭的專用位置,然后是“我自己的東西”。
  • 我將向量表放在 0x60002000(或者更准確地說,nxp sdk 需要一些 xip 字節並跳轉到 0x60002000,我可以在其中放置我自己的東西)。
  • 我正在使用當前位置創建一些變量,以便我可以在我的啟動腳本中使用它們
  • 當我查看反匯編代碼時,我可以清楚地看到我的向量表描述了 0x45 個單詞,因此對於上面的 linker 腳本,我希望我的__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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM