MDK 連結指令碼 sct測試
main函式呼叫前
程式啟動時就是在片內的RAM上面跑。顯然,片內RAM不可能很大。所以在這裡就需要增加片外的SDRAM。說來就記憶體。
但是片外記憶體不可能一開始就能跑程式的。一沒初始化,二沒有設定時間引數,CPU怎麼可能知道片外SDRAM的訪問(s3c2440 nand啟動,是因為集成了一個nand IP核心,小。但是通吃所有Nand)。再者系統啟動時的程式碼地址和執行地址不見得是一樣。因此就會產生程式碼重定位了。怎麼解決了?
main函式呼叫前做好前面這些就ok了。
__main之前初始化SDRAM
以rt1052初始化為例子
//startup_MIMXRT1052.s Reset_Handler: ... LDRR0, =SystemInit BLXR0 ... LDRR0, =__main BXR0 ...
顯然是呼叫__main 函式之前呼叫了SystemInit 。
檢視連結指令碼以及*.map檔案。反彙編檔案
*.map檔案
__main0x60002401Thumb Code0entry.o(.ARM.Collect$$$$00000000) _main_stk0x60002401Thumb Code0entry4.o(.ARM.Collect$$$$00000003) _main_scatterload0x60002405Thumb Code0entry5.o(.ARM.Collect$$$$00000004) ... __scatterload0x60002861Thumb Code28init.o(.text) __scatterload_rt20x60002861Thumb Code0init.o(.text)
連線指令碼
//MIMXRT1052xxxxx_nor_txt_sdram.scf #define m_text_start0x60002400 #define m_text_size0x03FFDC00 #define m_data_start0x80000000 #define m_data_size0x01E00000 LR_m_text m_interrupts_start m_text_start+m_text_size-m_interrupts_size {; load region size_region ... ER_m_text m_text_start m_text_size { ; load address = execution address * (InRoot$$Sections) .ANY (+RO) } ... }
彙編檔案
** Section #4 'ER_m_text' (SHT_PROGBITS) [SHF_ALLOC + SHF_EXECINSTR] ... __main _main_stk 0x60002400:f8dfd00c....LDRsp,__lit__00000000 ; [0x60002410] = 0x20020000 _main_scatterload 0x60002404:f000fa2c..,.BL__scatterload ; 0x60002860
可以看到__main 地址為0x60002400。置放在ER_m_text 節區的。然後在彙編檔案中可以看,
_main_stk設定好SP指標。跳轉到__scatterload 。
有關 __scatterload 詳細內容。在這裡看,不細說。
__scatterload會將FLASH中的RW-data複製到RAM中。
- __scatterload此時在ER_m_text 節區。
怎麼進行重定位的
- 待續
參考資料
MDK的編譯過程及檔案型別全解 https://flash-rtd.readthedocs.io/zh_CN/latest/ STM32 _main 裡做了什麼http://elmagnifico.me/2017/04/01/STM32-Startup-_main/