按照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段。