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 。ui