美好的一天,我正在 Arduino IDE 上使用 ESP32。我已经编写了基本的外部中断例程来在变化沿触发。然后,我在中断内“立即”切换输出。
我目前正在测量输入和输出,我很惊讶地发现我的切换输出在上升沿延迟了 38us,在下降沿延迟了 18us。有什么办法可以减少这些时间延迟吗?我已附上我的范围图像。 Rising Edges Falling Edges Signals D2 是我的输入,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() {
}
最佳答案
Apparently预期中断延迟约为 2 us;或者您可以编写自己的 high level interrupt handlers在汇编程序中。如果您发现延迟明显较高,请考虑跳过 Arduino - 我不确定那里的 GPIO 库是否以性能为导向。我首先回到 Espressif 自己的 ESP IDF GPIO library .
关于arduino - ESP32 服务中断例程的速度有多快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66341123/