ESP8266代码中的存储标记

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

相关文章
相关标签/搜索