3. AURIX存储系统与MPU

AURIX TC3xx的存储系统是面试中区分“会写代码”和“懂架构”的关键分水岭。很多候选人能说出PFlash、DFlash的名字,却讲不清LMU和DSPR在访问延迟上的本质差异,更说不清MPU保护区域配置错误时,总线会报出哪类Trap。本章围绕真实面试高频问题展开,把存储映射、Cache行为和MPU配置串成一条可操作的链路。

一、先建立地址空间的整体认知

AURIX采用统一编址,CPU通过32位地址访问所有存储和外设。TC3xx典型地址划分中,PFlash(程序闪存)通常映射在0x8000_0000起始的段,容量从2MB到16MB不等,用于存放代码和常量;DFlash(数据闪存)位于0xAF00_0000附近,容量较小(如1MB),擦写寿命和粒度更适合模拟EEPROM;LMU(Local Memory Unit)是挂在SRI总线上的本地存储,常作为核间共享RAM或扩展数据区;DSPR(Data Scratch-Pad RAM)和PSPR(Program Scratch-Pad RAM)则是每个CPU核私有的紧耦合存储,分别用于数据和指令,访问延迟通常只有1~2个时钟周期,远低于通过Cache访问外部存储的代价。

面试中常被追问:DSPR和Cache都能加速访问,为什么还要同时存在?答案在于确定性。Cache的命中率受程序访存模式影响,最坏情况下的缺失延迟不可预测;而DSPR是物理上紧邻CPU的SRAM,地址固定、无缺失、无替换,适合存放中断向量表、实时控制变量和栈。这也是为什么AURIX的安全相关代码常把关键数据段链接到DSPR。

二、PFlash与DFlash的工程差异

PFlash按扇区(Sector)擦除,TC3xx的PFlash扇区大小常见为16KB或更大,编程粒度通常为页(Page),例如256字节。写之前必须擦除,且擦除期间该Bank不可读——如果代码正在同一Bank执行,就会触发总线错误。因此Bootloader设计中必须把擦写PFlash的代码搬到PSPR或另一Bank执行,这是面试中“为什么需要PSPR”的经典答案。

DFlash的擦除粒度更小,TC3xx的DFlash常支持按页擦除,配合EEPROM仿真算法(如磨损均衡)实现频繁写入。一个可讲的实操细节是:DFlash写入前需要检查目标页是否已擦除,若未擦除直接写会导致ECC错误。调试时若看到DFlash访问触发DAPE或DAE类Trap,优先怀疑未擦除就写。

三、Cache行为与一致性

TC3xx的CPU通常带指令Cache和数据Cache,Cache行大小常见为32字节。数据Cache默认可能是写回(Write-Back)策略,这意味着CPU写入的数据可能停留在Cache中,DMA或另一核读取LMU时看不到最新值。面试题常问:“DMA搬运数据到LMU后,CPU读到的为什么是旧值?”答案就是Cache一致性。解决方式包括:将共享缓冲区配置为非Cacheable区域,或在访问前后执行Cache无效/写回操作。AURIX提供Cache Invalidate和Cache Writeback指令,但更稳妥的做法是在MPU中把共享区设为Non-Cacheable,用性能换确定性。

四、MPU配置:从区域划分到Trap验证

MPU(Memory Protection Unit)是AURIX内存保护的核心。TC3xx每个核有独立的MPU,支持多个保护区域(如Data Protection Region),每个区域可设置起始地址、结束地址和访问权限(读/写/执行)。配置流程通常是:先设置DPR寄存器组的上下界,再通过DPRE使能,最后在MPU全局控制中开启保护。

下面给出一个可参考的配置片段,假设要把DSPR中0x7000_0000到0x7000_3FFF设为仅本核可读写、不可执行:

/* 示例:配置数据保护区域,参数为合理假设 */
DPR0_L = 0x70000000;   /* 区域下界 */
DPR0_U = 0x70003FFF;   /* 区域上界 */
DPR0_E = 0x1;          /* 使能该区域 */
/* 权限位:读=1,写=1,执行=0,具体位域依芯片手册 */
DPR0_ACC = 0x3;        /* 仅读写,禁止取指 */

配置完成后,如何验证保护真的生效?可以故意在代码中向该区域写入一个越界地址,例如0x7000_4000,观察是否触发Memory Protection Trap。在调试器中,这类Trap通常表现为Class 4或Class 5,具体类别取决于芯片。若没有触发,检查MPU全局使能位是否打开、当前核是否处于Supervisor模式(某些保护对Supervisor不生效)。

五、一个完整的调试案例

假设某项目在TC377上运行,现象是:主核通过LMU向从核发送数据,从核偶尔读到全0。排查步骤可以这样展开:

第一步,确认LMU地址是否被MPU设为Cacheable。若主核写LMU后数据停留在Cache,从核读到的就是旧值。用调试器查看主核Cache状态,或直接在MPU中把LMU区域改为Non-Cacheable,现象消失则定位成功。

第二步,若改为Non-Cacheable后仍偶发,检查是否使用了__dsync()或内存屏障。AURIX的写缓冲可能导致写操作未到达LMU就从核已读,插入__dsync()可强制同步。

第三步,若问题依旧,检查LMU是否被ECC保护且发生了可纠正错误。读取LMU错误状态寄存器,若看到ECC标志,说明数据在传输中出错,需检查时钟和电源稳定性。

这个案例的价值在于:它把Cache、MPU、内存屏障和ECC串在一起,面试时能讲出这条链路,基本可以证明你真正调过AURIX的存储系统。

六、面试高频问题速查

以下问题建议能脱口而出:DSPR和PSPR的区别是什么?——DSPR存数据,PSPR存代码,都是核私有,访问延迟低。PFlash擦除时为什么不能执行同Bank代码?——擦除期间Bank不可读,取指会触发总线错误。MPU保护区域配置后如何验证?——故意越界访问,观察Trap。Cache一致性问题如何避免?——共享区设Non-Cacheable或用屏障指令。DFlash写之前必须做什么?——确认目标页已擦除,否则ECC错误。