keil STM32中sct 分散加载文件学习
sct 分散加載文件簡介
MDK 生成一個以工程名命名的后綴為 *.sct 的分散加載文件 (Linker Control File,scatter loading),鏈接器根據該文件的配置分配各個節區地址,生成分散加載代碼,因此我們通過修改該文件可以定制具體節區的存儲位置。
一、芯片選型
工程構建時, MDK 會根據我們選擇的芯片型號,獲知芯片的內部 FLASH 及內部SRAM 存儲器概況。這里我選擇的是STM32F407VET6型號, 這款單片機有高達 192+4 KB 的 SRAM,包括 64 KB 的 CCM(內核耦合存儲器)數據 RAM以及512 字節的 ROM 內存。 這一點可以在官網看到。
STM32F407VE高性能基礎系列,帶 DSP 和 FPU 的 Arm Cortex-M4 內核,512 KB 閃存,168 MHz CPU。
二、.sct分散加載文件的格式
在keil中可以在linker中取消勾選Usw Menory Layout from Target Dialog,然后點擊下方的編輯按鍵,就可以在keil中查看文件了。但是需要注意如果你需要自己去更改sct文件去自己分配地址空間,也需要取消勾選,不然keil會默認生成sct文件然后覆蓋你寫的文件。
sct 文件中主要包含描述加載域及執行域的部分,一個文件中可包含有多個加載域,而一個加載域可由多個部分的執行域組成。同等級的域之間使用花括號“{}”分隔開,最外層的是加載域(LR_IROM1),第二層“{}”內的是執行域 (ER_IROM1 RW_IRAM1 RW_IRAM2)
2-1 加載域
LR_IROM1 0x08000000 0x00080000 { ; load region size_region ...... }? 加載域名: 在 map 文件中的描述會使用該名稱LR_IROM1來標識空間。
? 基地址 + 地址偏移:
基地址為 STM32 內部 FLASH 的基地址 0x08000000,地址偏移可選
? 屬性列表: 屬性列表說明了加載域的是否為絕對地址 N 字節對齊等屬性
? 最大容量: 最大容量說明了這個加載域可使用的最大空間,STM32 內部 FLASH的大小0x00080000(512KB)
2-2 執行域
執行域的格式與加載域是類似的,區別只是輸入節區的描述有所不同。
包含了 ER_IROM1 及 RW_IRAM1及 RW_IRAM2三個執行域,它們分別對應描述了 STM32 的內部 FLASH及內部 SRAM 的基地址及空間大小。
而它們內部的“輸入節區描述”說明了哪些節區要存儲到這些空間,鏈接器會根據它來處理編排這些節區。
三 輸入節區描述
ER_IROM1 0x08000000 0x00080000 { ; load address = execution address*.o (RESET, +First)*(InRoot$$Sections).ANY (+RO)}RW_IRAM1 0x20000000 0x00020000 { ; RW data.ANY (+RW +ZI)}RW_IRAM2 0x10000000 0x00010000 {.ANY (+RW +ZI)}? 模塊選擇樣式: 模塊選擇樣式可用于選擇 o 及 lib 目標文件作為輸入節區,它可以直接使用目標文件名或“”通配符,也可以使用“.ANY”。
使用語句“.o”可以選擇所有 o 文件,使用“.lib”可以選擇所有 lib 文件,使用“”或“.ANY”可以選擇所有的 o 文件及 lib 文件。
其中“.ANY”選擇語句的優先級是最低的,所有其它選擇語句選擇完剩下的數據才會被“.ANY”語句選中。
? 輸入節區樣式: 通過輸入節區樣式可以選擇要控制的節區。“(RESET, +First)” 語句的 RESET 就是輸入節區樣式,它選擇RESET 的節區,并使用后面介紹的節區特性控制字“+First”表示它要存儲到本區域的第一個地址。
“(InRoot$$Sections)” 是一個鏈接器支持的特殊選擇符號,它可以選擇所有標準庫里要求存儲到 root 區域的節區。
? 輸入符號樣式: 可以選擇要控制的符號,符號樣式需要使用“:gdef:”來修飾。例如可以使用“*(:gdef:Value_Test)”來控制選擇符號“Value_Test”。
? 輸入節區屬性: 通過在模塊選擇樣式后面加入輸入節區屬性,可以選擇樣式中不同的內容,每個節區屬性描述符前要寫一個“+”號,使用空格或“,”號分隔開,可以使用的節區屬性描述符見表屬性描述符及其意義。
這里我想說明一下要把RW-DATA數據放到RAM中,大家都應該知道RW-DATA叫做初值非零可讀寫的全局變量,存儲的時候在ROM中。
SCT文件描述的是程序加載的時候,這時候RW-DATA要從ROM中復制到SRAM中。
四、控制文件分配到指定的存儲空間
設定好存儲器的信息后,可以控制各個源文件定制到哪個部分存儲器。
在 MDK 的工程文件欄中,選中要配置的文件,右鍵,并在彈出的菜單中選擇“Options for File xxxx”即可彈出一個文件配置對話框,在該對話框中進行存儲器定制,見圖使用右鍵打開文件配置并把它的 RW 區配置成使IRAM2。
類似地,設置某些文件的代碼段被存儲到特定的 ROM 中,
設置某些文件使用的ZI-data 或 RW-data 存儲到外部 SRAM 中。
(控制 ZI-data 到外部 SRAM 時注意還需要修改啟動文件設置堆棧對應的地址,原啟動文件中的地址是指向內部 SRAM 的)。
總結
以上是生活随笔為你收集整理的keil STM32中sct 分散加载文件学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php解压7z,linux解压7z文件命
- 下一篇: Nature作图也出错 单细胞UMAP/