sct文件编写与使用
sct文件的編寫與使用
參考資源
1. 分散加載文件淺釋.pdf。(周立功工程技術(shù)筆記)
1. DUI0377G_02_mdk_armlink_user_guide.pdf(在keil的幫助文檔中可以找到)
我們都知道,編譯器在生成可執(zhí)行文件時,先將每個.c文件編譯成.o文件(此過程叫編譯),然后將很多個.o文件鏈接成可執(zhí)行文件(此過程叫鏈接)。在鏈接的過程中,會用到一個描述文件,用來指定鏈接時的行為。這個描述文件叫做鏈接文件,如linux下的.ld文件,keil中的分散加載文件(.sct文件)。這篇文章就是介紹.sct文件的使用。
keil 中使用自定義的.sct文件
默認(rèn)的,在keil中編譯程序時,會自動的生成.sct文件(默認(rèn)在生成.o、.hex文件的目錄下)。但是,默認(rèn)的.sct文件很多時候不能滿足我們的編程需求。比如在STM32F429上,有兩個RAM區(qū)域。其中0x10000000起始的64k是CCM內(nèi)存,DMA不能訪問。如果直接使用這片區(qū)域(也就是在魔術(shù)棒->target選項(xiàng)->IRAM中勾選了它),當(dāng)DMA訪問的內(nèi)存在這片區(qū)域時,那么會遇到程序進(jìn)入硬件錯誤中斷。這時候就應(yīng)該使用自定義的.sct文件進(jìn)行鏈接修飾,從而達(dá)到目的。
魔術(shù)棒(option for target)->linker選項(xiàng)
去掉Use Memory Layout from Target Dialog選項(xiàng)。
此時下面的Scatter File部分便可以操作。選擇自己的.sct文件或者點(diǎn)擊Edit對已有文件進(jìn)行操作。
編輯完此文件,需要重新編譯程序。
下面是筆者的sct文件
分散加載文件.sct語法
一個分散加載文件由一個或者多個加載域(load regions)組成。每個加載域由一個或者多個執(zhí)行域(execution regions)組成。執(zhí)行域中又包含很多個輸入段描述(Input section description)。關(guān)系圖如下
?
上圖中的sct文件包含兩個加載域。每個加載域中又都包含兩個執(zhí)行域。每個執(zhí)行域中包含一個輸入段描述。
分散加載文件使用;作為注釋符。
什么是加載域
加載域的組成如下:
語法格式
load_region_name (base_address | (+offset)) [attribute_list] [max_size] {execution_region }
名稱(name): 加載域的名稱,用戶自定義。
起始地址: 本加載域的起始地址。分兩種表達(dá)格式
base_address:直接指明本加載域的起始地址。
+offset:表示此加載域的起始地址為前一個加載域的結(jié)束地址+offset字節(jié)。offset必須字對齊。
屬性(attribute_list)(可選): 用于指定加載域的特征。具體值如下
ABSOLUTE:? ? ? ? ? ?絕對地址。默認(rèn)屬性。
PI:? ? ? ? ? ? ? ? ? ? ? ? ? 與位置無關(guān)。
RELOC:? ? ? ? ? ? ? ? ?可重定位。
OVERLAY:? ? ? ? ? ? ?覆蓋。
NOCOMPRESS:? ?不能進(jìn)行壓縮。
加載域大小(max_size)(可選)
指定加載域的最大范圍。默認(rèn)取值0xFFFFFFFF.
一個或者多個執(zhí)行域.
執(zhí)行域的組成見執(zhí)行域的介紹。
example
什么是執(zhí)行域
執(zhí)行域描述了可執(zhí)行文件在執(zhí)行時內(nèi)存(RAM+ROM)的分配。
執(zhí)行域的組成類似加載域,如下:
語法格式
exec_region_name (base_address | (+offset)) [attribute_list] [max_size | Length] {input section descriptions }
名稱(name):? 執(zhí)行域的名稱,用戶自定義。
起始地址:? ? ? 本執(zhí)行域的起始地址。分兩種表達(dá)格式
base_address:直接指明本執(zhí)行域的起始地址。
+offset:表示此執(zhí)行域的起始地址為前一個執(zhí)行域的結(jié)束地址+offset字節(jié)。offset必須字對齊。
屬性(attribute_list)(可選): 用于指定加載域的特征。具體值如下
ABSOLUTE:? ? ? ? ? ?絕對地址。默認(rèn)屬性。
PI:? ? ? ? ? ? ? ? ? ? ? ? ? 與位置無關(guān)。
RELOC:? ? ? ? ? ? ? ? ?可重定位。
OVERLAY:? ? ? ? ? ? ?覆蓋。
NOCOMPRESS:? ?不能進(jìn)行壓縮。
加載域大小(max_size)(可選)
指定加載域的最大范圍。默認(rèn)取值0xFFFFFFFF.
一個或者多個輸入段描述.
輸入段描述的組成見輸入段描述的介紹。
什么是輸入段描述
語法格式
輸入段描述的組成如下:
目標(biāo)文件過濾器。支持通配符*、?。不區(qū)分大小寫。如main.o,user*.o等。可匹配的文件可以為目標(biāo)文件名、庫名(不帶前導(dǎo)路徑名)、庫完整路徑名。
可以使用*.o匹配所有的目標(biāo)文件。用*匹配所有文件,包括目標(biāo)文件和庫。
可以使用.ANY進(jìn)行任意的匹配。它的優(yōu)先級低于*.
屬性,不區(qū)分大小寫:
RO-CODE,? ? 同義詞有CODE
RO-DATA,? ? ?同義詞有CONST
RO? ? ? ? ? ? ? ? 即RO-CODE + RO-DATA,同義詞有TEXT
RW-DATA
RW-CODE
RW? ? ? ? ? ? ? ?即RW-DATA + RW-CODE,同義詞有DATA
ZI,? ? ? ? ? ? ? ? 同義詞有BSS
ENTRY? ? ? ? 即包含ENTRY的段。
FIRST
LAST
example:
*.o (RESET, +First)??任何目標(biāo)文件中的RESET段放在起始位置。
.ANY (+RW +ZI) 匹配任意文件的數(shù)據(jù)段。
.ANY (+RO)? 匹配任意文件的代碼段。
總結(jié)
以上是生活随笔為你收集整理的sct文件编写与使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。