目錄
- 基于ESP32S3:解決RWDT無法觸發中斷問題
- 引言
- 解決方案
- 1. 查看報錯日志
- 2. 分析報錯及一步一步找到解決方法
- 3.小結
- 我的源碼
基于ESP32S3:解決RWDT無法觸發中斷問題
引言
在嵌入式系統中,RWDT(看門狗定時器)是確保系統穩定性的重要組件。然而,在某些情況下,RWDT可能無法觸發預期的中斷。本文旨在探討此問題的原因及解決方案。
解決方案
1. 查看報錯日志
??從上圖可以知道錯誤是程序那個位置發生的,那么報錯的程序如下圖所示:
2. 分析報錯及一步一步找到解決方法
??從上面已經知道了導致報錯的程序位置了,那么我調用esp_intr_alloc函數傳入的形參與對比官方的源碼調用esp_intr_alloc來看,都沒有什么問題,猜測,一般是該中斷源可能已經被使用過導致的,我們可以分析一下esp_intr_alloc函數。
??跳轉到esp_intr_alloc函數中,如下圖所示:
可以看到,該函數其只是調用esp_intr_alloc_intrstatus函數而已,那么跳轉到esp_intr_alloc_intrstatus函數中,如下圖所示:
我們可以在紅色框框看出,該函數內使用的是ESP_EARLY_LOGV函數進行日志輸出。結果調用這個函數后并沒有ESP_EARLY_LOGV函數后并沒有生效,沒用對應的日志輸出出來,那我們先看看函數的介紹,如下圖:
log文件路徑:\Espressif\frameworks\esp-idf-v5.1.2\components\log\log.c
??從上面可只,log_level=ESP_LOG_VERBOSE,而LOG_LOCAL_LEVEL和esp_log_default_level又是哪里定義的呢?下圖是我找到其定義:
從上面可分析出,ESP_EARLY_LOGV日志輸出使能條件是 CONFIG_LOG_MAXIMUM_LEVEL>=ESP_LOG_VERBOSE 和 CONFIG_LOG_DEFAULT_LEVEL>=ESP_LOG_VERBOSE 同時成立。而CONFIG_LOG_MAXIMUM_LEVEL和CONFIG_LOG_DEFAULT_LEVEL都是在sdkconfig上定義的,那么我們可以通過menuconfig圖形化工具進行設置,如下:
??重新編譯運行后,ESP_EARLY_LOGV就能正常輸出日志了,但是因為這種設置時全局的,導致系統所有的日志都輸出出來,這是不想看到的,因此只在這個函數修改 LOG_LOCAL_LEVEL和esp_log_default_level即可,那么就不會影響到全局了,操作如下圖所示:
這是日志也能正常輸出了:
??從上面申請中斷的日志和RTC中斷源號可看出,在進入主函數和系統調度前就已經申請了,所以這也就是為什么申請RTC中斷失敗的原因了。那么現在就是要找找到底是哪里申請了該RTC中斷了,可以在函數調用中加esp_backtrace_print這個函數,這個函數是打印堆棧信息的,如下:
輸出日志如下:
從上面日志可以確定,調用的文件是,如下圖: