按照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: 0x20000000, Size: 0x00000268, Max: 0x00001000, ABSOLUTE)
Base Addr Size Type Attr Idx E Section Name Object
0x20000000 0x00000008 Data RW 11 .data main.o
想想沒道理,嘗試發現初始化了的全局變量也是放在RW段。