检查中断处理程序中调用的函数: 中断处理程序中调用的每一个函数也必须位于 IRAM 中(通常使用 IRAM_ATTR 修饰)或者是在 ROM 中已存在的函数。确保这些函数没有访问 Flash 中的内容。
IRAM_ATTR: 任何中断服务程序(ISR)都应该被定义在 IRAM 中。
c
#include "esp_attr.h"
void IRAM_ATTR my_interrupt_handler(void* arg) {
// ISR 代码
// 注意:在这里只能调用也位于 IRAM 中的函数
}检查中断处理程序中使用的数据: 中断处理程序中使用的全局变量、常量应存放在 DRAM 中,使用 DRAM_ATTR 修饰,以防止编译器将其放置在 Flash 中而需要 Cache 访问。
c
const uint8_t DRAM_ATTR my_const_data[] = {0x01, 0x02, 0x03};