文章目录
- 前言
- S32K324的Memory map
- DTCM的原理
- DTCM的使用
- DTCM/DTCM backdoor测试
- 总结
前言
S32K324的Ram在选型手册上给的是512K,但实际上sram只有320k,项目中对ram的需求更大,所以需要拓展一下ram的使用。本文分析DTCM的使用方案及测试结果
S32K324的Memory map
512K是由32K ITCM0 + 32K ITCM1 + 64K DTCM0 + 64K DTCM1 + 160K SRAM0 + 160K SRAM1组成的
需要注意的是,如果启用HSE,SRAM_1的最后48K是不能使用的。
可能有细心的朋友发现了,ITCM0和ITCM1的起始和结束地址一样(对于S32K324来说,都是0x00000000-0x00007FFF),DTCM0和DTCM1的起始和结束地址一样(都是0x20000000-0x0000FFFF**)。这并不是写错了,而是ITCM0和DTCM对应的是核0,ITCM1和DTCM1对应的是核1,虽然说地址一样,但在不同核访问时,地址内容是不一样的,这一点搞清楚非常重要。这个知识点打破了之前的认知,之前一直认为memory地址的内容是唯一的。
由于地址一样,就会导致一个问题,双核单elf的工程,这两块内存无法区分,就不能作为两块独立的内存使用了。
这时候,就可以提到另外一块内存了,也就是ITCM/DTCM对应的Backdoor地址,backdoor很形象,“后门”,也就是说,当核1/其他外设想访问核0的DTCM0区域时,直接访问(“正门”)是会报错的,而通过backdoor地址访问,走"后门",就可以访问了。
DTCM的原理
DTCM (Data Tightly Coupled Memory) 的原理
定义:DTCM 是一种紧耦合数据存储器,通常用于嵌入式系统中,特别是那些对数据访问速度有极高要求的应用场景。
特点:
低延迟:DTCM 位于处理器核心附近,访问速度非常快,通常只有几个时钟周期。
小容量:由于成本和物理限制,DTCM 的容量通常较小,一般在几 KB 到几十 KB 之间。
专用性:DTCM 通常用于存储频繁访问的数据,如实时控制算法中的变量或缓冲区。
应用场景:
实时系统:在需要快速响应的实时系统中,DTCM 可以显著减少数据访问延迟,提高系统的实时性能。
嵌入式系统:在资源受限的嵌入式系统中,DTCM 可以优化关键数据的访问速度,提升整体性能。
下面通过总线图可以看到DTCM的位置:
可以看到,DTCM和对应核直接通信,相比于SRAM而言(需要经过AXBS总线),访问速度必然会快。
上图中的红色箭头表示,当启用锁步模式时,DTCM0和DTCM1都给主核使用,也就是主核的DTCM变为了128K
而如果想要使用backdoor的话,访问路径如下:
访问backdoor通过AXBS总线,还要走AHBS总线,实际访问速度应该比SRAM还慢,所以,并不太建议通过backdoor的方式将DTCM作为普通RAM使用。
DTCM的使用
ld文件中定义DTCM的内存地址,核0核1都为同一块:
int_dtcm : ORIGIN = 0x20000000, LENGTH = 0x00010000 /* 64K */
DTCM在Startup.s中被初始化,主核在通过DisableSWT0中调用RamInit之后调用DTCM_Init,从核直接调用DTCM_Init
SetCore0Stack:
; /* set up stack */ldr r0, =__Stack_start_c0msr MSP, r0b DisableSWT0SetCore1Stack:
; /* set up stack */ldr r0, =__Stack_start_c1msr MSP, r0
#ifdef RAM_DATA_INIT_ON_ALL_CORESb RamInit
#elseb DTCM_Init ;/* SWT1 clock is disabled at startup */
#endif
最开始看这个初始化时,一直以为核1才会初始化DTCM,实际并不是,核0调用DisableSWT0最后也会调DTCM_Init
初始化完后,就可以访问这两块内存了,注意:在通过backdoor地址访问时,可能会出现使能了MPU而对应地址未加入到MPU保护的地址而导致的fault
DTCM/DTCM backdoor测试
下面将核1使用的同一块data,放到SRAM,DTCM,DTCM_backdoor,进行对比:
SRAM:
DTCM:
DTCM_backdoor:
平均运行时间DTCM_backdoor(145988)>SRAM(140708)>DTCM(132627)
总结
可以考虑将核内频繁访问的数据放入DTCM,但需要注意,核0核1都要访问的数据(例如,XCP标定的数据),不能放入DTCM,否则,会导致两个核获取的数据不一致。