日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ATJ2157内存篇【炬芯音频芯片】---sct语法

發布時間:2023/12/20 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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+
“}”

load_region_name: 加載域的名字,這個是區域中區分大小寫的base_address : 這個區域內被鏈接的地址,注意要滿足對齊的要求+offset:描述一個基地址,其偏移字節超出了前一個加載區域的結尾,offset必須是4字節對齊,如果這是第一個加載區域,那么+offset意味著基址從零開始偏移字節。如果使用+offset,則加載區域可能從以前的加載區域繼承某些屬性attribute_list: 待定補充max_size: 指定加載區域的最大大小。這是在執行任何解壓縮或零初始化之前加載區域的大小。如果指定了可選的max_size值,那么如果分配給armlink的區域超過max_size字節,則armlink將生成錯誤execution_region_description: 指定執行區域名稱、地址和內容 加載的屬性問題 PI 與地址無關方式存放; RELOC 重新部署,保留定位信息,以便重新定位該段到新的執行區; OVERLAY 覆蓋,允許多個可執行區域在同一個地址,ADS不支持; ABSOLUTE 絕對地址(默認);加載域的繼承問題一個加載域繼承另一個加載域的屬性,請使用+offset

RELOC屬性的繼承規則 如果顯性設置了一個加載域的屬性為RELOC,那么執行域只能承認,不能設置 如下: LR1 0x8000 RELOC { ER1 +0 ; inherits RELOC from LR1{}ER2 +0 ; inherits RELOC from ER1{}ER3 +0 RELOC ; Error cannot explicitly set RELOC on an execution region{} }

2. 執行域描述

執行區域描述的組件允許您唯一地標識每個執行區域及其在父加載區域中的位置,并控制ELF文件的哪些部分放置在該執行區域中

執行域的結構

一個執行域描述,應該包括哪些內容呢? 1:名字(被編譯器用來識別不同的加載域)
2:一個基地址(代碼或數據的開始地址)
3:屬性說明
4:大小
5:一個或者多個輸入的段

執行域的語法詳解 執行域其實就是在說明輸入段即代碼運行時的地址execution_region_description ::= exec_region_name (base_address | "+" offset) [attribute_list] [max_size | length]"{" input_section_description* "}"跟加載域的描述差不多,可以參考加載域的說明 PI 與地址無關,該區域的代碼可任意移動后執行; OVERLAY 覆蓋; ABSOLUTE 絕對地址(默認); FIXED 固定地址; UNINIT 不用初始化該區域的ZI段;

執行域的繼承問題

一個執行域使用+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

module_select_pattern: 就是文件名,當然實際是 1:object 文件包括的節中的名字 2:庫成員的名字(.lib) 3:帶有全路徑的庫中的名字特別說明,關于 module_select_pattern 我們可以使用通匹符, * 可以代替0個或者多個字符 ?可以代替一個字符

input_section_attr: 屬性選擇器,是與輸入節相匹配的。

每一個輸入節的屬性前必須加一個+號。屬性選擇器不區分大小寫

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语法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。