gpt4 book ai didi

arduino - 如何在 ESP32 中禁用 'interrupt watchdog' 或增加 ISR 时间限制?

转载 作者:行者123 更新时间:2023-12-04 16:44:29 27 4
gpt4 key购买 nike

我正在使用 ESP32 DEVKIT link和 Adafruit VS1053 编解码器 + MicroSD Breakout - MP3/WAV/MIDI/OGG Play + Record - v4 link录制然后播放声音。我正在使用 Arduino IDE 进行编码。

我现在面临一个问题,该模块使用硬件中断进行播放。但是当我尝试播放音轨时,ESP32 会一次又一次地重置。调试日志说:

Guru Meditation Error: Core  1 panic'ed (Interrupt wdt timeout on CPU1)
Core 1 register dump:
PC : 0x400d1280 PS : 0x00060834 A0 : 0x800d128f A1 : 0x3ffc0bb0
A2 : 0x3ffc241c A3 : 0x3ffb1f20 A4 : 0x800d1779 A5 : 0x3ffb1f00
A6 : 0x3ffc241c A7 : 0x3f400f9c A8 : 0x800d1280 A9 : 0x3ffc0b90
A10 : 0x0000002b A11 : 0x3f401067 A12 : 0x800d1691 A13 : 0x3ffb1ed0
A14 : 0x3ffc241c A15 : 0x00000000 SAR : 0x0000001f EXCCAUSE: 0x00000006
EXCVADDR: 0x00000000 LBEG : 0x400014fd LEND : 0x4000150d LCOUNT : 0xffffffff
Core 1 was running in ISR context:
EPC1 : 0x400d4123 EPC2 : 0x00000000 EPC3 : 0x00000000 EPC4 : 0x400d1280

Backtrace: 0x400d1280:0x3ffc0bb0 0x400d128c:0x3ffc0bd0 0x40080e21:0x3ffc0bf0 0x400817d5:0x3ffc0c10 0x400d3ae5:0x00000000

Core 0 register dump:
PC : 0x400ee86e PS : 0x00060934 A0 : 0x8008656c A1 : 0x3ffc7910
A2 : 0x00000008 A3 : 0x00000000 A4 : 0x00000001 A5 : 0x3ffc7f4c
A6 : 0x00000000 A7 : 0x00000001 A8 : 0x3ffc3404 A9 : 0x3ffc33e8
A10 : 0x00000000 A11 : 0x00000001 A12 : 0x00000000 A13 : 0x00000001
A14 : 0x00060b20 A15 : 0x00000000 SAR : 0x00000000 EXCCAUSE: 0x00000006
EXCVADDR: 0x00000000 LBEG : 0x00000000 LEND : 0x00000000 LCOUNT : 0x00000000

Backtrace: 0x400ee86e:0x3ffc7910 0x40086569:0x3ffc7930

Rebooting...
ets Jun 8 2016 00:22:57

rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:952
load:0x40078000,len:6084
load:0x40080000,len:7936
entry 0x40080310
Adafruit VS1053 Simple Test
VS1053 found

线路 Guru Meditation Error: Core 1 panic'ed (Interrupt wdt timeout on CPU1)表示其中断 wdt。

我搜索了禁用中断 WDT 的方法,但没有帮助。文件 esp_int_wdt.h~Documents\Arduino\hardware\espressif\esp32\tools\sdk\include\esp32提供两个函数来为两个或一个 CPU 启用中断 WDT。没有禁用它的功能。

如何禁用 ESP32 中断 WDT?

最佳答案

#include "soc/rtc_wdt.h"

rtc_wdt_protect_off();
rtc_wdt_disable();
或者在 menuconfig 中关闭它。我同意其他海报,但你不应该关闭它,相反,你也可以使用以下功能提供它:
rtc_wdt_feed();
我通常会创建一个优先级最低的 FreeRTOS 任务,该任务只是循环并以小于超时的延迟调用 feed 方法,从而为更高优先级的“业务逻辑”提供足够的时间来运行。例子:
在 menuconfig 或代码中将超时设置为 250 毫秒:
rtc_wdt_set_length_of_reset_signal(RTC_WDT_SYS_RESET_SIG, RTC_WDT_LENGTH_3_2us);
rtc_wdt_set_stage(RTC_WDT_STAGE0, RTC_WDT_STAGE_ACTION_RESET_SYSTEM);
rtc_wdt_set_time(RTC_WDT_STAGE0, 250);
然后在您的任务中执行此操作:
while(true) {
rtc_wdt_feed();
vTaskDelay(pdMS_TO_TICKS(100));
}
这将同时提供 FreeRTOS WDT 和 RTC WDT,并在系统陷入循环或未在您的时间要求内进行处理时重置您的系统。您需要调整超时时间以及为计时器提供的频率,以使其适合您的系统。请记住,Wifi、PHY 和 BT 不是确定性的,因此如果您在时间上有很多不可预测性依赖于来自“网络”的 DAQ。

关于arduino - 如何在 ESP32 中禁用 'interrupt watchdog' 或增加 ISR 时间限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51750377/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com