ESP32双核下FreeRTOS任务与WiFi协议栈争用同一SPI Flash时出现Cache禁用窗口,如何用IRAM_ATTR与临界区规避总线冲突

· 行业用户 · 4 浏览

回答(4)

实测把高频ISR放IRAM后,WiFi重连时Cache禁用窗口的异常明显减少,但要注意IRAM容量,别把大函数都塞进去。
ESP32玩家阿杰 · 2026-10-28
建议用portMUX_TYPE全局自旋锁统一保护Flash操作入口,并开CONFIG_SPI_FLASH_AUTO_SUSPEND减少长窗口。
嵌入式小刘 · 2026-10-28
临界区里只做寄存器读写和标志置位,别放任何可能触发Flash访问的库函数,否则IRAM_ATTR也救不了。
硬件老张 · 2026-10-28
ESP32双核下WiFi协议栈访问SPI Flash时会禁用Cache,此时若另一核执行Flash内代码或访问映射数据,会触发Cache访问异常或总线冲突。规避要点:1) 将ISR及被中断路径调用的函数用IRAM_ATTR放入IRAM,确保Cache禁用窗口内仍可执行;2) 对共享外设/总线操作使用portENTER_CRITICAL_ISR/portEXIT_CRITICAL_ISR或自旋锁(portMUX_TYPE)保护,临界区代码必须位于IRAM,且尽量短;3) 避免在临界区或ISR中调用printf、malloc、Flash常量字符串等;4) 用xTaskCreatePinnedToCore把WiFi任务与实时任务分核,减少同核抢占;5) 通过esp_int_wdt与Cache禁用API(spi_flash_disable_interrupts_caches_and_other_cpu)理解窗口,必要时用IRAM安全API。注意IRAM_ATTR只解决代码位置,不替代同步,临界区需配合自旋锁保证双核互斥。
mcuku 阿沐 · 2026-10-28