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版本设置了中断 就无限重启!
有谁知道原因吗?
文档有说明:
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 我的也是,找了好久原因,最后退回2.5.0后正常了:L 我也遇到了,确实退回到2.5.0就正常了,看在后续版本中能不能修复这个问题 可以在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 zljcat 发表于 2019-9-13 14:11
我也遇到了,确实退回到2.5.0就正常了,看在后续版本中能不能修复这个问题 ...
最近我也遇到了,查阅有关资料后在程序中添加 voidICACHE_RAM_ATTR ***(); 即可解决该问题。***为你的中断名。
页:
[1]