一,前言
由于现在做cortexR5内核的芯片,和cortexA雷同,只是无mmu,但是xip的设计,我还是第一次用这类跨界芯片,我家cortexA的am335用来做linux开发板,不做单片机用途。所以我网上无意间查到nxp也有类似芯片,且开发板外设很丰富,所以买了一块练手。它是cortex M7的,比cortexM3多了cache,至于TCM,只要是arm的内核都有的。
二,FlexRAM
rom是外置的,首先想到代码能运行在ram当然是最好的,所以关注下内存大小及特点,FlexRam蛮有趣的,居然像fpga一样,可定制。
1)FlexRAM里面有3种类型的存储区域,DTCM和OCRAM都可以运行ram数据,ITCM可以保存和运行rom数据,可以通过efuse进行静态配置,默认efuse设置为0(OCRAM=256K,ITCM=128K,DTCM=128)大小可以设置,但是OCRAM不可以设置为size 0,因为bootROM代码需要使用。
2)可以通过通用寄存器切换为动态分配,有32个bit,每2个bit来设置1个bank的类型。总的256/16=16个bank。
3)cpu M7和FlexRAM不用通过cache,可以支持直接访问,所以速度很快,建议中断的stack放入Flexram中。
三,cache
在设置mpu内存区域的时候,一定会涉及cache,打开cache会遇到一致性问题,比如dma可以直接修改内存,但是没有同步到cache的时候,cpu读取的就是cache中老的值,解决方法就是flush cache进行手工同步。
我在看mpu相关配置寄存器的时候,主要是Write allocation属性有点搞不清楚含义了,所以又复习了下,其实Write allocation就是针对写miss的情况下,是否还会写入一份到cache中。
1)一般在arm中都会有3层cache,L1是单core内独享的,L2是单个cluster内多cpu共享的,L3是多个cluster共享的。
当配置为 Inner-Shareable 的时候,意味着只能够被单个 CPU cluster 集群访问;
当配置为 Outer-Shareable 的时候,意味着只能够被多个 CPU clusters 集群访问;
2)cache的4种策略
a.Read allocation(RA) 当读操作cache miss时默认进行分配cache line。
b.Write allocation(WA) 当写操作cache miss时,会触发一个burst读,通过读的方式来分配cache line,然后再将数据写入cache。
c.Write-back(WB) WB方式下,数据只写入cache,并标记为dirty,当cache line被换出或者显式的clean操作才会更新到外部内存中。当cache line被换出是按cache的替换算法,比如满了就那最早的替换掉,或者时间长不更新了就被替换掉。
d.Write-through(WT) WT方式下,数据同时写入cache和外部内存,不会将cache line标记为dirty。
四,sdram
看了内部ram,看了cache连线关系及复习了设计原理,那么要再看看外部sdarm,板子上为32M大小,但是速度呢!我看了一份应用手册,之后抽空我也跑下,测试下我板子的sdram读写读取。
从上图信息来看不开cache就很慢,特别是读取居然比写入慢,原因是写入通道中有pipeline做缓冲,但是读取没有。
所以我在考虑若大内存准备放入sdram的读取就不走cpu,直接走dma了。那么cpu写入后只要记得Invalidcache,就可以同步更新到sdram中了,然后启动dma来复制数据到lcd即可。谁说lcd等大帧就不建议开cache呢?只要cache用法正确,我觉得完全无风险。
五,小结
本次看内存特点的主要目的是为了性能设计,对于我的开发板是单核的,仅有L1,所以关注点主要是哪些内容要放TCM,哪些内容要放入外部sdram,哪些外设要开dma,才能让性能保持最佳。其实TCM就类似tricore芯片的DLMU,是每个core私有的ram,访问主频和cpu一样是528M。若要速度快,全部放TCM,空间换时间,但是大型应用的话这点TCM一定不够用,还得进行性能调试。