ESP8266(ESP12F)中断报错 - ISR not in IRAM解决

ESP8266可以在Arduino IDE平台上编写中断,当使用外部中断并且成功编译烧写后,ESP8266出现不断重启并且串口一直重复打印堆栈信息如下:

ISR not in IRAM!

User exception (panic/abort/assert)
--------------- CUT HERE FOR EXCEPTION DECODER ---------------

Abort called

>>>stack>>>

ctx: cont
sp: 3fffff00 end: 3fffffc0 offset: 0000
3fffff00:  feefeffe feefeffe feefeffe 3ffef58c  
3fffff10:  000000fe 00000000 00000000 00000000  
3fffff20:  00000000 00000000 00000000 00ff0000  
3fffff30:  5ffffe00 5ffffe00 3ffe87fa 3ffee754  
3fffff40:  00000000 00000002 00000002 40202bda  
3fffff50:  401006f9 3ffe87f9 3ffee6ec 40202bec  
3fffff60:  40201f78 3ffe87f9 00000002 402037ed  
3fffff70:  3fffdad0 00000020 3ffee6ec 402021ec  
3fffff80:  3fffdad0 00000000 3ffee6ec 4020388c  
3fffff90:  3fffdad0 00000000 3ffee6ec 402010a4  
3fffffa0:  feefeffe 00000000 3ffee740 40202768  
3fffffb0:  feefeffe feefeffe 3ffe85e0 40100fb5  
<<<stack<<<

--------------- CUT HERE FOR EXCEPTION DECODER ---------------

解决方法参考 开发说明,在 attachInterrupt 调用的中断函数定义前面添加 IRAM_ATTR 属性 demo代码如下

/**
 * 功能描述:ESP8266中断演示
 */ 
void setup() {
          
   
 //设置串口波特率
 Serial.begin(115200);
 //设置中断号、响应函数、触发方式
 attachInterrupt(digitalPinToInterrupt(D2), InterruptFunc, RISING);
}
 
void loop() {
          
   
}

/**
 * 中断响应函数
 */ 
IRAM_ATTR void InterruptFunc(){
          
   
 Serial.println("Hello ESP8266");
}

在中断函数前添加属性后,中断可以正常运行

经验分享 程序员 微信小程序 职场和发展