8266 2.5.2版本的 中断问题-Arduino中文社区 - Powered by Discuz! Archiver

guosaijun 发表于 2019-8-3 12:26

8266 2.5.2版本的 中断问题

void setup() {
   pinMode (14,INPUT);
   attachInterrupt(14, aaa, CHANGE);

}

void loop() {
// put your main code here, to run repeatedly:

}

void aaa() {
// put your main code here, to run repeatedly:

}

2.5.2版本设置了中断 就无限重启!



有谁知道原因吗?

奈何col 发表于 2019-8-3 14:15

文档有说明:
Pin interrupts are supported through attachInterrupt, detachInterrupt functions. Interrupts may be attached to any GPIO pin, except GPIO16. Standard Arduino interrupt types are supported: CHANGE, RISING, FALLING. ISRs need to have ICACHE_RAM_ATTR before the function definition.

https://arduino-esp8266.readthedocs.io/en/latest/reference.html

sanci 发表于 2019-8-23 15:03

我的也是,找了好久原因,最后退回2.5.0后正常了:L

zljcat 发表于 2019-9-13 14:11

我也遇到了,确实退回到2.5.0就正常了,看在后续版本中能不能修复这个问题

Beautiful_Now 发表于 2019-12-18 17:11

可以在ESP8266上使用中断,但必须谨慎使用并有一些限制:

中断回调函数必须位于IRAM中,因为闪存在发生时可能处于其他操作的中间。为此,可以ICACHE_RAM_ATTR在函数定义上添加属性。如果不存在此属性,则草图会在尝试attachInterrupt出现错误消息时崩溃 。
ICACHE_RAM_ATTR void gpio_change_handler(void *data) {...
中断不得调用delay()或yield(),或调用内部使用delay()或的任何例程yield()。
中断中长时间运行(> 1ms)的任务将导致不稳定或崩溃。如果中断被长时间运行的中断阻止,WiFi和核心的其他部分可能会变得不稳定。如果您有很多事情要做,您可以设置一个易失的全局标志,以便您的主设备loop()可以检查每次通过或使用调度的函数(在安全的情况下将在中断上下文之外调用该函数)来进行长时间运行的工作。
内存操作可能很危险,应避免在中断中进行。调用new或malloc应该最小化,因为如果内存碎片,它们可能需要很长的运行时间。呼叫,realloc并且 free绝不能呼叫。出于同样的原因,也禁止使用任何调用的例程或对象 free或realloc它们本身。这个装置String,std::string,std::vector它们使用了可以调整大小必须极其小心使用连续的内存和其它类(确保字符串不被改变,矢量元素不添加等)。
数字IO

lwq1947 发表于 2021-7-27 09:25

zljcat 发表于 2019-9-13 14:11
我也遇到了,确实退回到2.5.0就正常了,看在后续版本中能不能修复这个问题 ...

最近我也遇到了,查阅有关资料后在程序中添加 voidICACHE_RAM_ATTR ***(); 即可解决该问题。***为你的中断名。
页: [1]
查看完整版本: 8266 2.5.2版本的 中断问题