奶头挺立呻吟高潮av全片,成人试看120秒体验区,性欧美极品v,A片高潮抽搐揉捏奶头视频

C語言

C言語KEIL的ARM編譯器對RW和ZI段的處理

時間:2024-07-30 21:46:10 飛宇 C語言 我要投稿
  • 相關推薦

C言語KEIL的ARM編譯器對RW和ZI段的處理

  按照C編譯器編譯的結果,一般會產生RO段,RW段,ZI段。RO是程序中的指令和常量,RW是程序中的已初始化全局變量,ZI是程序中的未初始化或初始化為零的全局變量。下面是小編為大家帶來的C言語KEIL的ARM編譯器對RW和ZI段的處理的知識,歡迎閱讀。

  按照C編譯器編譯的結果,一般會產生RO段,RW段,ZI段。RO是程序中的指令和常量,RW是程序中的已初始化全局變量,ZI是程序中的未初始化或初始化為零的全局變量。

  那么如下的代碼

  int aaa;

  int bbb;

  int main()

  {

  aaa = 7;

  bbb = 8;

  return 0;

  }

  應該產生的是八個字節的ZI段,但很奇怪,--bss_threshold=0

  Program Size: Code=464 RO-data=268 RW-data=8 ZI-data=608

  如上所示,其中的Code段,RO-data段和ZI-data段是啟動代碼產生的,這里不深究。

  它產生了8個字節的RW段,可以分析產生的map文件查看main匯編代碼和RW段,發現的確將aaa和bbb分配在了RW段。

  map文件中的符號如下:

  aaa 0x20000000 Data 4 main.o(.data)

  bbb 0x20000004 Data 4 main.o(.data)

  Execution Region RW_IRAM1

  Base Addr Size Type Attr Idx E Section Name Object

  0x20000000 0x00000008 Data RW 11 .data main.o

  想想沒道理,嘗試發現初始化了的全局變量也是放在RW段。

  最后發現罪魁禍首是KEIL的armcc的“--bss_threshold=num”這個編譯選項,查看手冊介紹如下:

  This option controls the placement of small global ZI data items in sections. A small global ZI data item is an uninitialized data item that is eight bytes or less in size.

  --bss_threshold=num

  where:

  num

  is either:

  place small global ZI data items in ZI data sections

  place small global ZI data items in RW data sections.

  In ARM Compiler 4.1 and later, the compiler might place small global ZI data items in RW data sections as an optimization. In RVCT 2.0.1 and earlier, small global ZI data items were placed in ZI data sections by default.

  Use --bss_threshold=0 to emulate the behavior of RVCT 2.0.1 and earlier with respect to the placement of small global ZI data items in ZI data sections.

  將比較小的全局ZI變量存放到RW段當中作為優化手段,默認是小于8個字節的當做small global ZI data,也就是說char,int這些類型全部會放到ZI,除非是大于8個字節的數組。

  知道這個之后在編譯選項里面添加--bss_threshold=0就可以將其恢復到正常的ZI段中了。

  gcc的arm編譯器編出來的就是正常的放在ZI段的,感覺keil這樣做沒什么道理,萬一少字節的全局變量很多的話就增加了很大的bin size。

  當然全局變量太多也不是一個有素質的程序員應該寫出的代碼。

  一、含義解釋:

  Code:即代碼域,它通常是指編譯器生成的機器指令,這些內容會被存儲到ROM區。

  RO-data:Read Only data,即只讀數據域,它指程序中用到的只讀數據,這些數據被存儲在ROM區,因而程序不能被修改的內容。例如C語言中const關鍵字定義的變量就是典型的RO-data。

  RW-data:Read Write data,即可讀寫數據域,它指初始化為“非0值”的可讀寫數據,程序剛運行時,這些數據具有非0的初始值,程序運行的時候它們又會常駐在RAM區,應用程序可以修改其內容。例如C語言中定義的全局變量,且定義時賦予“非0值”給該變量。

  ZI-data:Zero Initialie data,即0初始化數據,它指初始化為“0值”的可讀寫數據域,它與RW-data的區別是程序剛運行時這些數據初始值全都為0,程序運行時和RW-data的性質一樣,它們也常駐在RAM區,應用程序可以更改其內容。例如C語言中使用定義的全局變量,且定義時賦予“0值”給該變量(如若定義該變量時沒有賦予初始值,編譯器會把它當ZI-data來對待,初始化為0);

  二、程序存儲詳解:

  關于哪些數據存儲在Flash區域,哪些數據存儲在SRAM區域,這就涉及到程序的存儲狀態了,應用程序具有靜止和運行兩種狀態。靜止態的程序被存儲在非易失存儲器中,如內部FLASH區域,因而系統掉電后也能正常保存。但是當程序在運行狀態的時候,程序常常需要修改一些暫存數據(例如初始化非0值的數據),這些數據往往存放在Flash中,但是由于需要被修改,所以這些數據在程序運行的時候需要被復制到RAM中。因此,程序在靜止與運行的時候它在存儲器中的表現是不一樣的。

  三、程序占用Flash和SRAM的空間計算:

  GD32的RO區域不需要加載到SRAM,內核直接從FLASH讀取指令運行。當程序存儲到芯片的內部FLASH時(即ROM區),它占用的空間是Code、RO-data及RW-data的總和,所以如果這些內容比芯片的FLASH空間大,程序就無法被正常保存在芯片的FLASH了。當程序在執行的時候,需要占用內部SRAM空間(即RAM區),占用的空間包括RW-data和ZI-data空間之和。

  總結:程序需要下載到芯片的FLASH空間,FLASH的最小空間應該大于Code +ROData +RWData的總和;

  程序運行的時候,芯片內部RAM使用的空間應該大于RWData+ZIData之和;

【C言語KEIL的ARM編譯器對RW和ZI段的處理】相關文章:

C語言編譯器和IDE的選擇之間的關系10-18

C語言預處理概述03-30

有趣的C語言預處理12-04

C語言預處理知識11-26

c#中預處理指令#if的使用11-30

淺談c語言和c++和VB的區別04-02

幼兒園中班《ga zi ga zi 拉大鋸》教學設計04-01

C語言之字符串處理函數04-01

C語言函數的遞歸和調用11-28

C語言項目中.h文件和.c文件的關系詳解05-08

主站蜘蛛池模板: 青冈县| 石台县| 兴义市| 泽库县| 嘉禾县| 固原市| 长阳| 紫金县| 双鸭山市| 都昌县| 潮安县| 永州市| 江山市| 金塔县| 独山县| 平凉市| 米泉市| 南涧| 腾冲县| 萍乡市| 会昌县| 益阳市| 大安市| 扶余县| 闽清县| 邵东县| 那曲县| 安泽县| 吴川市| 四平市| 黑龙江省| 江口县| 广灵县| 宾川县| 运城市| 曲麻莱县| 鄂托克前旗| 苏尼特左旗| 屯昌县| 藁城市| 大足县|