const uint8 MyArr[1024] ICACHE_RODATA_ATTR = {0}; void MyFun() ICACHE_FLASH_ATTR { }
這種 ICACHE 開頭的宏作的用就是因為esp8266的ram有限,所以在啟動的時候就不可能把所有的數據都載入ram,只能是先載入必要的數據,其他數據保留在Flash中,在需要的時候讀取。esp8266的固件有5個有效段,分別是:.data,.rodata,.bss,.text,.irom0.text,(這些都是從編譯好的elf文件中提取的)其中 .data,.rodata,.bss,.text 這四個段在啟動的時候被載入內存,.irom0.text 則通過內存映射的方式訪問,不會占用寶貴的ram。所以不是必要的數據都可以裝入 .irom0.text 這個段中以節省ram占用。另外需要注意的是,任何中斷函數都不可以存放在 .irom0.text 中,會crash!!!
#define ICACHE_FLASH_ATTR __attribute__((section(".irom0.text"))) #define ICACHE_RODATA_ATTR __attribute__((section(".irom.text")))
這兩個宏就是告訴編譯器數據的保存位置。變量用 ICACHE_RODATA_ATTR ,(切記變量必須是 const 類型的),函數用 ICACHE_FLASH_ATTR 。
