ATJ2157内存篇【炬芯音频芯片】---sct语法
ATJ2157 sct語法
- 公共知識篇
- BNF 簡介
- Sct腳本
- Sct的作用
- Sct的語法規則
- 1. 加載域描述(Loadd region descriptions)
- 2. 執行域描述
- 3. 輸入節的描述
- ATJ2157平臺使用的sct
- RO的等效寫法
- ScatterAssert()函數
- LoadLength()函數
- LoadBase()函數
- ImageLimit()函數
- ATJ2157平臺什么數據編譯出來是.data,.constdata與.bss
- sct參考學習網站
公共知識篇
BNF 簡介
巴科斯范式(BNF: Backus-Naur Form 的縮寫)是由 John Backus 和 Peter Naur,首次引入一種形式化符號來描述給定語言的語法。
簡稱為:BNF符號。
現在,幾乎每一位新編程語言書籍的作者都使用巴科斯范式來定義編程語言的語法規則
巴科斯范式的內容
在雙引號中的字(“word”)代表著這些字符本身。而double_quote用來代表雙引號。
在雙引號外的字(有可能有下劃線)代表著語法部分。
尖括號( < > )內包含的為必選項。
方括號( [ ] )內包含的為可選項。
大括號( { } )內包含的為可重復0至無數次的項。
豎線( | )表示在其左右兩邊任選一項,相當于"OR"的意思。
::= 是“被定義為”的意思。
關于具體的例子可以上網搜索,網上資料比較齊全
Sct腳本
Sct 的全稱是 Scatter File Syntax,
Sct的作用
在學習一個東西之前,首先要明白,她是干什么的?那么sct腳本文件到底是什么東西?
其實吧,sct腳本文件是描述如何把輸入文件中的節(sections)映射到輸出文件中,并控制輸出文件的存儲布局的腳本文件。并且sct的語法是遵守BNF的語法規則的。
Sct的語法規則
一個.sct文件,包括了一個或者多個加載域(load region),每個加載域也包括一個或者多個執行域(execution region)
下面是一個.sct文件的文件結構圖
1. 加載域描述(Loadd region descriptions)
其實加載域就是用來描述下內存的區域,這個區域是用來存放執行域的
加載區域描述的組件允許您唯一標識加載區域,并控制ELF文件的哪些部分放置在該區域中
加載域的具體結構
一個加載域描述,應該包括哪些內容呢?
1:名字(被編譯器用來識別不同的加載域) 2:一個基地址(代碼或數據的開始地址) 3:屬性說明 4:大小 5:一個或者多個執行域加載域的語法詳解
符合BNF的規則,對規則不了解的可以百度下
load_region_description ::= load_region_name (base_address | (“+”
offset)) [attribute_list] [max_size]
“{”
execution_region_description+
“}”
2. 執行域描述
執行區域描述的組件允許您唯一地標識每個執行區域及其在父加載區域中的位置,并控制ELF文件的哪些部分放置在該執行區域中
執行域的結構
一個執行域描述,應該包括哪些內容呢? 1:名字(被編譯器用來識別不同的加載域)
2:一個基地址(代碼或數據的開始地址)
3:屬性說明
4:大小
5:一個或者多個輸入的段
執行域的繼承問題
一個執行域使用+offset屬性時,能夠承認前面一個執行域的屬性,還有就是第一個使用+offset的執行域會承認她所在加載域的屬性
有兩種情況,即使使用了+offset時也不能繼承 1:顯性的設置了當前執行域的屬性 2:前一個執行域的屬性使用了OVERLAY屬性 一個執行域只能繼承RELOC屬性(這個屬性一定是加載域的) 如下例子 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. 輸入節的描述
輸入節的結構
輸入節描述的組件允許您標識ELF文件中要放置在執行區域中的部分
可以看出輸入節有兩個部分 1:模塊名 (個人理解實際上是.o的文件名) 2:輸入節的名字,或者是輸入節的屬性,如READ-ONLY or CODE 這里面都可以使用通匹符輸入節的語法
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
每一個輸入節的屬性前必須加一個+號。屬性選擇器不區分大小寫
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
舉例說明
ATJ2157平臺使用的sct
US2157平臺使用的.sct
跟標準的一樣,
使用分號;進行一行的注解
Sct存放在MDK目錄下
最終會生成一個map文件,可以看到地址信息
使用+RO,實際上沒有必要在使用.rodata了
+RO 實際上已經包含了.rodata
RO的等效寫法
下面4種寫法是等效的
至于原因可以參考input_section_attr的說明
ScatterAssert()函數
ScatterAssert(exp)
如果exp為false則鏈接器就報錯
在key.sct中有這樣一個例子
如果.data區與.bss區之后超過了限制的大小,鏈接器就會報錯。如下圖:
LoadLength()函數
LoadLength(region_name) 返回region_name的大小 region_name 可以是加載視圖或者執行視圖的名字LoadBase()函數
LoadLength(region_name) 返回region_name的基地址 region_name 可以是加載視圖或者執行視圖的名字ImageLimit()函數
ImageLimit(region_name) 返回region_name的最后地址 region_name 可以是加載視圖或者執行視圖的名字ATJ2157平臺什么數據編譯出來是.data,.constdata與.bss
.data: 1:基本的數據類型,整型,字符型,布爾型,uinon,枚舉,指針(不管有沒有初始化及初始化值為多少), 2:初始化不為0的數組,struct 結構體 3:static 修飾的局部變量.constdat: const修飾的變量.bss: 1:初始化為0或者沒有初始化的數組,struct 結構體sct參考學習網站
官方網站
https://www.keil.com/support/man/docs/armlink/armlink_pge1362075650322.htm
CSDN相關網站:
https://blog.csdn.net/xiaowanbiao123/category_9827056.html
總結
以上是生活随笔為你收集整理的ATJ2157内存篇【炬芯音频芯片】---sct语法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HTML---基础篇
- 下一篇: 电阻器的检测方法——唯样商城