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");
}
在中断函数前添加属性后,中断可以正常运行
