【问题标题】:How fast does the ESP32 take to service an interupt routine?ESP32 服务中断程序的速度有多快?
【发布时间】:2021-02-23 21:08:18
【问题描述】:

美好的一天,我正在 Arduino IDE 上使用 ESP32。我已经编写了基本的外部中断程序来触发变化边缘。然后我在中断中“立即”切换我的输出。

我目前正在测量输入和输出,我很惊讶地发现我的切换输出在上升沿延迟了 38us,在下降沿延迟了 18us。有什么办法可以减少这些时间延迟?我附上了我的示波器图像。Rising EdgesFalling EdgesSignalsD2 是我的输入,D1 是我的输出。

谁能向我解释 ESP32 离开主循环并服务中断所需的时间?

简而言之,我希望我的中断在尽可能短的时间内得到服务,因为它看起来好像延迟是由于离开主循环并到达中断例程所花费的时间。

我的代码如下:


volatile boolean toggle = false;
volatile int counter = 0;
portMUX_TYPE mux = portMUX_INITIALIZER_UNLOCKED;

void IRAM_ATTR Pin34RPM(){
  //xyz
  if(toggle){
  GPIO.out_w1ts = ((uint32_t)1 << 19);
  }
  else{
  GPIO.out_w1tc = ((uint32_t)1 << 19); 
  }
   toggle = !toggle;

}
  
void setup(){

  
  pinMode(19, OUTPUT);
  digitalWrite(19,LOW);
  pinMode(34, INPUT_PULLUP);//Crank
  attachInterrupt(34, Pin34RPM, CHANGE);
  
  
}

void loop() {

   
}

【问题讨论】:

    标签: arduino esp32


    【解决方案1】:

    Apparently 预期的中断延迟约为 2 us;或者,您可以在汇编程序中编写自己的high level interrupt handlers。如果您看到明显更高的延迟,请考虑跳过 Arduino - 我不确定那里的 GPIO 库是否面向性能。我会先回到 Espressif 自己的ESP IDF GPIO library

    【讨论】:

    • 太好了,您使用了我不知道的正确单词,我想知道是否可以减少延迟。您是否还暗示我看到的延迟是由于引脚的实际写入(高或低)。我的感觉是,由于其他原因,我没有得到预期的 2us 延迟。除了 switchin IDE 之外,没有什么可以减少它的吗?这是涉及蓝牙、eeprom 等的更大代码的一部分,我仍然是新手。阅读这些链接让我头晕目眩
    • 它几乎就像认为 ESP 故意不立即进入中断一样。 40us 不是我所期望的 240mhz 时钟
    • Arduino ESP32 库构建在 Espressif 的 ESP IDF 框架之上。我的假设是 GPIO 或中断处理的 Arduino 实现性能很差,增加了一个数量级的额外延迟。为了检验这个假设,你必须使用底层的 ESP IDF 框架而不是 Arduino 来编写你的中断处理和 GPIO。你不必切换任何东西。都在下面,只需阅读相关文档(在谷歌搜索“esp idf interrupts”或“esp idf gpio”时,API 文档可靠地弹出)
    猜你喜欢
    • 1970-01-01
    • 2012-09-21
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多