TM32之sct分散加載描述文件
在 STM32嵌入式開發 中,分散加載文件(.sct或.ld文件)是ARM編譯器用來定義代碼和數據在存儲空間的布局的鏈接腳本。它告訴編譯器如何將代碼和數據分配到不同的存儲區域(如Flash、RAM、TCM等)。合理使用分散加載文件可以優化性能、提高實時性,甚至增強系統穩定性。
STM32的sct分散加載描述文件如下:
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************
LR_IROM1 0x08000000 0x00020000 { ; load region size_region
ER_IROM1 0x08000000 0x00020000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
.ANY (+XO)
}
RW_IRAM1 0x20000000 0x00020000 { ; RW data
.ANY (+RW +ZI)
}
}
對上述分散加載文件逐行解析如下:
一、定義加載區域(Load Region)
LR_IROM1 0x08000000 0x00020000 { ; load region size_region
LR_IROM1:加載區域名稱(自定義)。0x08000000:加載區域起始地址(STM32 程序運行 起始地址,可以重映射)。0x00020000:區域大?。?28KB, 加載區容量)。- 作用:定義 Flash 或其他內存的存儲范圍,代碼和常量在此區域存放。
2)定義執行區域(Execution Region)
ER_IROM1 0x08000000 0x00020000 { ; load address = execution address
ER_IROM1:執行區域名稱(與加載區域名稱可以不同)。0x08000000:執行地址(與加載地址相同,表示代碼在 Flash 中原地執行)。0x00020000:區域大?。ㄐ?≤ 加載區域大?。?。- 作用:代碼實際運行時仍位于 Flash 中。
(3)指定復位向量和啟動代碼
*.o (RESET, +First)
*.o (RESET, +First)*.o:匹配所有目標文件。(RESET):選擇所有名為RESET的段(通常包含中斷向量表)。+First:強制將該段放在該區域的起始地址。- 作用:確保中斷向量表位于
0x08000000(STM32 上電將從此處加載SP和PC指針)。
(4)C 庫初始化段
*(InRoot$$Sections)
InRoot$$Sections:ARM 編譯器的內置命名,包含 C 庫初始化所需的代碼和數據(如__main的堆棧初始化代碼)。- 作用:處理 C 運行時環境的初始化。
(5)所有只讀代碼和常量
.ANY (+RO)
.ANY:匹配所有未被分配的目標文件。+RO:選擇只讀(Read-Only)段(包括代碼.text和常量.constdata)。- 作用:將程序代碼和常量放入 Flash。
(6)所有可執行的只讀代碼
.ANY (+XO)
+XO:選擇可執行(eXecute Only)段(某些安全芯片需要代碼加密后執行)。- 注意:STM32 通常不使用此屬性,代碼默認可讀可執行(
+RO已包含)。
(7)定義 RAM 區域
RW_IRAM1 0x20000000 0x00020000 { ; RW data
RW_IRAM1:RAM 執行區域名稱。0x20000000:STM32 內置 RAM 起始地址。0x00020000:區域大小(128KB,取決于具體型號)。- 作用:定義讀寫變量的存儲位置。
(8)分配讀寫數據和零初始化數據
.ANY (+RW +ZI)
+RW:選擇已初始化的讀寫數據(如全局變量int a = 5;)。+ZI:選擇零初始化數據(如全局變量int b;)。- 關鍵流程:
- 上電時,
+RW數據從 Flash 拷貝到 RAM。 +ZI數據由啟動代碼在 RAM 中清零。
- 上電時,

浙公網安備 33010602011771號