注意:由于https://github.com/esp8266/Arduino/releases/tag/3.0.0 ICACHE_RAM_ATTR已更改为IRAM_ATTR。对于未来的读者,我更新了指向https://arduino-esp8266.readthedocs.io/的链接,但问题的其余部分没有改变。
我在ATTR宏到互配服务例程(ISRs) 以及从那里调用的每一个函数的Arduino代码中看到了ESP8266,以防止随机崩溃。我还找到了ATTR,尽管我不确定对于ESP8266上的Arduino是否也是这样解释的,这是Espressif ESP8266 SDK的解释。我不明白为什么我需要将宏添加到ISRs中。
第一个问题:为什么需要将ICACHE_RAM_ATTR宏添加到ISRs和从那里调用的所有函数?
下一个问题是,如果我强制内联从ISR调用的函数,会发生什么情况:
inline void doStuff() __attribute__((__always_inline__)) { // <-- necessary to add ICACHE_RAM_ATTR here?
// no more function calls here
}
void ICACHE_RAM_ATTR handleInterrupt() {
doStuff();
}
第二个问题:是否需要将ICACHE_RAM_ATTR宏添加到被迫内联的函数中?
发布于 2020-03-20 21:55:52
非常感谢ICACHE_RAM_ATTR,我在代码的最上面使用了它.当然,也有一些引脚不起中断的作用,例如,在我的例子中,我使用的是板WEMOS D1 Mini Pro,而引脚D0 (GPIO 16)没有工作,直到我换到下一个引脚(GPIO 14)时,它才完美无缺.
ICACHE_RAM_ATTR适用于较新的库,过时的2.5库在没有这段代码的情况下也能工作。
非常感谢!
const uint8_t interruptPin = 14;
volatile byte interruptCounter = 0;
int numberOfInterrupts = 0;
void ICACHE_RAM_ATTR handleInterrupt();
void setup() {
Serial.begin(9600);
pinMode(interruptPin, INPUT);
attachInterrupt(digitalPinToInterrupt(interruptPin), handleInterrupt, CHANGE);
}
void handleInterrupt() {
interruptCounter++;
}
void loop() {
if(interruptCounter>0){
interruptCounter--;
numberOfInterrupts++;
Serial.print("An interrupt has occurred. Total: ");
Serial.println(numberOfInterrupts);
}
}
发布于 2022-08-13 06:54:18
这个参数对我有用。如果您在重新启动循环中使用中断和ESP8266,请尝试以下操作。您必须在安装程序()之前添加,否则将不会工作并产生错误。
谢谢。
https://stackoverflow.com/questions/58113937
复制相似问题