首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >and 8266/Arduino:为什么需要将ICACHE_RAM_ATTR宏添加到ISRs和从那里调用的函数?

and 8266/Arduino:为什么需要将ICACHE_RAM_ATTR宏添加到ISRs和从那里调用的函数?
EN

Stack Overflow用户
提问于 2019-09-26 09:41:32
回答 2查看 21.6K关注 0票数 15

注意:由于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调用的函数,会发生什么情况:

代码语言:javascript
运行
复制
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宏添加到被迫内联的函数中?

EN

回答 2

Stack Overflow用户

发布于 2020-03-20 21:55:52

非常感谢ICACHE_RAM_ATTR,我在代码的最上面使用了它.当然,也有一些引脚不起中断的作用,例如,在我的例子中,我使用的是板WEMOS D1 Mini Pro,而引脚D0 (GPIO 16)没有工作,直到我换到下一个引脚(GPIO 14)时,它才完美无缺.

ICACHE_RAM_ATTR适用于较新的库,过时的2.5库在没有这段代码的情况下也能工作。

非常感谢!

代码语言:javascript
运行
复制
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);
  }

}
票数 2
EN

Stack Overflow用户

发布于 2022-08-13 06:54:18

这个参数对我有用。如果您在重新启动循环中使用中断和ESP8266,请尝试以下操作。您必须在安装程序()之前添加,否则将不会工作并产生错误。

谢谢。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58113937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档