ESP8266—“ICACHE_FLASH_ATTR”宏——解释含义

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 。

转载于:https://www.cnblogs.com/CodeWorkerLiMing/p/11256391.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[1\]中提到了在使用ESP8266编程时出现的问题,即出现了"ISR not in IRAM"的错误。根据引用\[1\]中的描述,这个问题的解决方法是在定义中断程序时使用ICACHE_RAM_ATTR属性来定义,这样可以确保中断程序在RAM中执行。如果没有定义这个属性,程序在调用时可能会崩溃。 引用\[2\]和引用\[3\]提供了关于ESP8266的编译选项的说明。在编译选项"-ffunction-sections"打开的情况下,函数的默认属性为".text"。具有".text"属性的函数将被放置在.irom0.text或.text段中。根据引用\[2\]和引用\[3\]的描述,ESP8266的SDK默认将iRAM中的一部分空间用作iram或cache。iram用于存放flash中的代码,而cache用于存放spi flash中的代码。因此,如果在编写与flash相关的代码时,需要将其放置在iram中,否则可能会导致崩溃。 综上所述,ICACHE_RAM_ATTR是一个用于定义中断程序在RAM中执行的属性,而ESP8266的编译选项可以控制函数代码的存放位置,包括iram和cache。在编写ESP8266程序时,需要注意这些属性和选项,以确保程序的正常运行。 #### 引用[.reference_title] - *1* [ESP8266和MPU6050使用外部中断](https://blog.csdn.net/weixin_44481398/article/details/108419892)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [ESP8266cache 和 iram 一点理解](https://blog.csdn.net/ustccw/article/details/84721188)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值