ATJ2157内存篇【炬芯音频芯片】---sct语法
ATJ2157 sct語(yǔ)法
- 公共知識(shí)篇
- BNF 簡(jiǎn)介
- Sct腳本
- Sct的作用
- Sct的語(yǔ)法規(guī)則
- 1. 加載域描述(Loadd region descriptions)
- 2. 執(zhí)行域描述
- 3. 輸入節(jié)的描述
- ATJ2157平臺(tái)使用的sct
- RO的等效寫(xiě)法
- ScatterAssert()函數(shù)
- LoadLength()函數(shù)
- LoadBase()函數(shù)
- ImageLimit()函數(shù)
- ATJ2157平臺(tái)什么數(shù)據(jù)編譯出來(lái)是.data,.constdata與.bss
- sct參考學(xué)習(xí)網(wǎng)站
公共知識(shí)篇
BNF 簡(jiǎn)介
巴科斯范式(BNF: Backus-Naur Form 的縮寫(xiě))是由 John Backus 和 Peter Naur,首次引入一種形式化符號(hào)來(lái)描述給定語(yǔ)言的語(yǔ)法。
簡(jiǎn)稱為:BNF符號(hào)。
現(xiàn)在,幾乎每一位新編程語(yǔ)言書(shū)籍的作者都使用巴科斯范式來(lái)定義編程語(yǔ)言的語(yǔ)法規(guī)則
巴科斯范式的內(nèi)容
在雙引號(hào)中的字(“word”)代表著這些字符本身。而double_quote用來(lái)代表雙引號(hào)。
在雙引號(hào)外的字(有可能有下劃線)代表著語(yǔ)法部分。
尖括號(hào)( < > )內(nèi)包含的為必選項(xiàng)。
方括號(hào)( [ ] )內(nèi)包含的為可選項(xiàng)。
大括號(hào)( { } )內(nèi)包含的為可重復(fù)0至無(wú)數(shù)次的項(xiàng)。
豎線( | )表示在其左右兩邊任選一項(xiàng),相當(dāng)于"OR"的意思。
::= 是“被定義為”的意思。
關(guān)于具體的例子可以上網(wǎng)搜索,網(wǎng)上資料比較齊全
Sct腳本
Sct 的全稱是 Scatter File Syntax,
Sct的作用
在學(xué)習(xí)一個(gè)東西之前,首先要明白,她是干什么的?那么sct腳本文件到底是什么東西?
其實(shí)吧,sct腳本文件是描述如何把輸入文件中的節(jié)(sections)映射到輸出文件中,并控制輸出文件的存儲(chǔ)布局的腳本文件。并且sct的語(yǔ)法是遵守BNF的語(yǔ)法規(guī)則的。
Sct的語(yǔ)法規(guī)則
一個(gè).sct文件,包括了一個(gè)或者多個(gè)加載域(load region),每個(gè)加載域也包括一個(gè)或者多個(gè)執(zhí)行域(execution region)
下面是一個(gè).sct文件的文件結(jié)構(gòu)圖
1. 加載域描述(Loadd region descriptions)
其實(shí)加載域就是用來(lái)描述下內(nèi)存的區(qū)域,這個(gè)區(qū)域是用來(lái)存放執(zhí)行域的
加載區(qū)域描述的組件允許您唯一標(biāo)識(shí)加載區(qū)域,并控制ELF文件的哪些部分放置在該區(qū)域中
加載域的具體結(jié)構(gòu)
一個(gè)加載域描述,應(yīng)該包括哪些內(nèi)容呢?
1:名字(被編譯器用來(lái)識(shí)別不同的加載域) 2:一個(gè)基地址(代碼或數(shù)據(jù)的開(kāi)始地址) 3:屬性說(shuō)明 4:大小 5:一個(gè)或者多個(gè)執(zhí)行域加載域的語(yǔ)法詳解
符合BNF的規(guī)則,對(duì)規(guī)則不了解的可以百度下
load_region_description ::= load_region_name (base_address | (“+”
offset)) [attribute_list] [max_size]
“{”
execution_region_description+
“}”
2. 執(zhí)行域描述
執(zhí)行區(qū)域描述的組件允許您唯一地標(biāo)識(shí)每個(gè)執(zhí)行區(qū)域及其在父加載區(qū)域中的位置,并控制ELF文件的哪些部分放置在該執(zhí)行區(qū)域中
執(zhí)行域的結(jié)構(gòu)
一個(gè)執(zhí)行域描述,應(yīng)該包括哪些內(nèi)容呢? 1:名字(被編譯器用來(lái)識(shí)別不同的加載域)
2:一個(gè)基地址(代碼或數(shù)據(jù)的開(kāi)始地址)
3:屬性說(shuō)明
4:大小
5:一個(gè)或者多個(gè)輸入的段
執(zhí)行域的繼承問(wèn)題
一個(gè)執(zhí)行域使用+offset屬性時(shí),能夠承認(rèn)前面一個(gè)執(zhí)行域的屬性,還有就是第一個(gè)使用+offset的執(zhí)行域會(huì)承認(rèn)她所在加載域的屬性
有兩種情況,即使使用了+offset時(shí)也不能繼承 1:顯性的設(shè)置了當(dāng)前執(zhí)行域的屬性 2:前一個(gè)執(zhí)行域的屬性使用了OVERLAY屬性 一個(gè)執(zhí)行域只能繼承RELOC屬性(這個(gè)屬性一定是加載域的) 如下例子 LR1 0x8000 PI {ER1 +0 ; ER1 inherits PI from LR1{…}ER2 +0 ; ER2 inherits PI from ER1{…}ER3 0x10000 ; ER3 does not inherit because it has no relative baseaddress and gets the default of ABSOLUTE{…}ER4 +0 ; ER4 inherits ABSOLUTE from ER3{…}ER5 +0 PI ; ER5 does not inherit, it explicitly sets PI{…}ER6 +0 OVERLAY ; ER6 does not inherit, an OVERLAY cannot inherit{…}ER7 +0 ; ER7 cannot inherit OVERLAY, gets the default of ABSOLUTE{…} }3. 輸入節(jié)的描述
輸入節(jié)的結(jié)構(gòu)
輸入節(jié)描述的組件允許您標(biāo)識(shí)ELF文件中要放置在執(zhí)行區(qū)域中的部分
可以看出輸入節(jié)有兩個(gè)部分 1:模塊名 (個(gè)人理解實(shí)際上是.o的文件名) 2:輸入節(jié)的名字,或者是輸入節(jié)的屬性,如READ-ONLY or CODE 這里面都可以使用通匹符輸入節(jié)的語(yǔ)法
input_section_description ::= module_select_pattern [ “(”
input_section_selector ( “,” input_section_selector )* “)” ]
input_section_selector ::= “+” input_section_attr
| input_section_pattern
| input_symbol_pattern
| section_properties
每一個(gè)輸入節(jié)的屬性前必須加一個(gè)+號(hào)。屬性選擇器不區(qū)分大小寫(xiě)
RO-CODE RO-DATA RO, selects both RO-CODE and RO-DATA.RW-DATA. RW-CODE. RW, selects both RW-CODE and RW-DATA. XO. ZI. ENTRY, that is, a section containing an ENTRY point.CODE for RO-CODE. CONST for RO-DATA. TEXT for RO. DATA for RW. BSS for ZIFIRST. LAST
舉例說(shuō)明
ATJ2157平臺(tái)使用的sct
US2157平臺(tái)使用的.sct
跟標(biāo)準(zhǔn)的一樣,
使用分號(hào);進(jìn)行一行的注解
Sct存放在MDK目錄下
最終會(huì)生成一個(gè)map文件,可以看到地址信息
使用+RO,實(shí)際上沒(méi)有必要在使用.rodata了
+RO 實(shí)際上已經(jīng)包含了.rodata
RO的等效寫(xiě)法
下面4種寫(xiě)法是等效的
至于原因可以參考input_section_attr的說(shuō)明
ScatterAssert()函數(shù)
ScatterAssert(exp)
如果exp為false則鏈接器就報(bào)錯(cuò)
在key.sct中有這樣一個(gè)例子
如果.data區(qū)與.bss區(qū)之后超過(guò)了限制的大小,鏈接器就會(huì)報(bào)錯(cuò)。如下圖:
LoadLength()函數(shù)
LoadLength(region_name) 返回region_name的大小 region_name 可以是加載視圖或者執(zhí)行視圖的名字LoadBase()函數(shù)
LoadLength(region_name) 返回region_name的基地址 region_name 可以是加載視圖或者執(zhí)行視圖的名字ImageLimit()函數(shù)
ImageLimit(region_name) 返回region_name的最后地址 region_name 可以是加載視圖或者執(zhí)行視圖的名字ATJ2157平臺(tái)什么數(shù)據(jù)編譯出來(lái)是.data,.constdata與.bss
.data: 1:基本的數(shù)據(jù)類型,整型,字符型,布爾型,uinon,枚舉,指針(不管有沒(méi)有初始化及初始化值為多少), 2:初始化不為0的數(shù)組,struct 結(jié)構(gòu)體 3:static 修飾的局部變量.constdat: const修飾的變量.bss: 1:初始化為0或者沒(méi)有初始化的數(shù)組,struct 結(jié)構(gòu)體sct參考學(xué)習(xí)網(wǎng)站
官方網(wǎng)站
https://www.keil.com/support/man/docs/armlink/armlink_pge1362075650322.htm
CSDN相關(guān)網(wǎng)站:
https://blog.csdn.net/xiaowanbiao123/category_9827056.html
總結(jié)
以上是生活随笔為你收集整理的ATJ2157内存篇【炬芯音频芯片】---sct语法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: HTML---基础篇
- 下一篇: 电阻器的检测方法——唯样商城