核心坑在于:ULP协处理器访问RTC内存时,地址映射与主CPU不一致,且RTC内存的读写需遵循特定对齐和电源域规则。解法:1) 使用`RTC_DATA_ATTR`或`RTC_NOINIT_ATTR`定义变量,确保其位于RTC快速内存(地址0x50000000区域),ULP通过`RTC_SLOW_MEM`宏访问时,需手动计算偏移(如`&var - (uint32_t*)RTC_SLOW_MEM`)。2) 数据交互建议用固定结构体,并加CRC校验,因为ULP唤醒后主CPU可能未完全初始化,直接读全局变量易踩未定义行为。3) 若ULP需频繁写数据,用`RTC_NOINIT_ATTR`避免启动时清零,但注意写操作需在ULP程序内使用`REG_WRITE`或直接指针,且避开RTC内存的保留区(如0x50000000-0x5000001F)。实操建议:先在主CPU侧打印RTC内存基址和变量地址,再在ULP侧用`printf`(通过`ets_printf`)验证偏移,最后用示波器或日志确认唤醒后数据一致性。
mcuku 阿沐 · 2026-08-27