MemoryMAP如下
下图是所有资源都分配给R5_00情况下的内存映射。
上图中的SRAM细分如下,其中用于核间通信,log等存储空间应该关闭Cache以保证一致性。
MPU
针对R5F_00 empty工程的MPU设置解读
R5F_00 empty工程的MPU配置十分简单,首先创建了2GB的背景设置,区域覆盖了SRAM和Flash,在该区域内不允许cache预取,不允许执行代码。由于MPU设置高编号会覆盖低编号,后续的设置如region1~4,会将上述区域的部分覆盖。
TCM已经是非常快速的SRAM了,这里为什么还要Cache搞不清楚,增加工程师工作量。
SRAM整体设置成了Cached。在MemoryMAP中可以看到SRAM末尾有部分区域会被用于核间通信IPC,LOG等,如果要用到IPC需要手动添加一个NoCache区域。否则IPC Notify或者RP Message无法发送给其他内核。
Flash区域被设置为了Cache,只读。
Cache
CacheP_wb()
:CPU写cache,数据写入cache的时候也写入主存
比如,在串口写入前,我们虽然准备好了一个数组buffer,但是该数据有可能只在Cache;i而不再SRAM里。当我们开启DMA之后DMA搬运SRAM中的数据到串口外设此时就会出问题。正确的流程应该是:
//准备数据buffer;
//CacheP_wb(buffer)
//uartransmit_dma(buffer)
CacheP_inv()
:CPU读cache,cache内读取的行先失效,再从SRAM调取到cache
读取与发送同理,在某个数据的读取完成中断中,应当先调用CacheP_inv,再操作
//CacheP_inv(buffer)
//一些操作
CacheP_wbInv()
:上述两个API的合体