对ARM紧致内存TCM的理解

ARM的ram包括静态ram, 动态ram, TCM---紧耦合内存(TCM: Tightly Coup ledMemories) 。
TCM是一个固定大小的RAM, 紧密地耦合至处理器内核, 提供与cache相当的性能, 相比于cache的优点是, 程序代码可以精确地控制什么函数或代码放在哪儿(RAM里) 。 当然TCM永远不会被踢出主存储器, 因此, 他会有一个被用户预设的性能, 而不是象cache那样是统计特性的性能提高 。
TCM对于以下几种情况的代码是非常有用、也是需要的:可预见的实时处理(中断处理)、时间可预见(加密算法)、避免cache分析(加密算法)、或者只是要求高性能的代码(编解码功能) 。 随着cache大小的增加以及总线性能的规模, TCM将会变得越来越不重要, 但是他提供了一个让你权衡的机会
【对ARM紧致内存TCM的理解】那么, 哪一个更好呢?他取决于你的应用 。 Cache是一个通用目的的加速器, 他会加速你的所有代码, 而不依赖于存储方式 。 TCM只会加速你有意放入TCM的代码, 其余的其他代码只能通过cache加速 。 Cache是一个通用目的解决方案, TCM在某些特殊情况下是非常有用的 。 假如你不认为需要 TCM的话, 那么你可能就不需要了, 转而加大你的cache, 从而加速运行于内核上的所有软件代码.
紧致内存是指片上快速存储区, 与片上缓存具有同等的性能, 但因为程序可完全控制紧致内存, 因而比统计复用的缓存有更好的可预测性 。 这是ARM5TE引入的特性, 目的是通过这一快速的存储区, 一方面提高某些关键代码(如中断处理函数)的性能, 另方面使存储访问延迟保持一致, 这是实时性应用所要求的 。 ARM6对TCM操作做了进一步的规范 。
TCM的应用领域:可预测的实时处理(中断处理)、避免缓存分析(加密算法)、或单纯的性能提高(处理器侧编解码)等 。
如同缓存的哈佛结构, 指令TCM和数据TCM是分开的 。 TCM有两种使用方式:作为快缓存使用, 和作为本地内存使用 。
本地内存
这时, TCM被用作更快速的内存, 如同一般的RAM 。 因为指令段有时也是数据访问的对象, 指令TCM实际上是指令数据一体化TCM 。 对TCM写操作后和后续对此写操作的依赖指令之间必须跟一个阻塞操作 。
快缓存(smartcache)
TCM可以配置成当作外部RAM的缓存使用, 对应的外部RAM也要设置可缓存标志 。 如果被缓存的外部RAM可以由多处理器共享, 那么TCM是否与共享数据保持一致并没有规定, 而由具体实现厂家决定 。
TCM与缓存的内容不会自动保持一致, 这意味着TCM映射到的内存区域必须是不缓存的区域 。 如果一个地址同时落在缓存和TCM内, 那么访问这一地址的结果是不能预测的 。 另一个限制是各个TCM必须要配置成不相交的 。
TCM的配置
通过CP15的0、1、9号寄存器进行:
0号寄存器
读CP15的0号寄存器, opcode2为2:
MRC p15, 0, Rd, C0, C0, 2
返回TCM状态寄存器的内容, 其中, 16-18位代表数据TCM个数, 0-3代表指令TCM个数 。
1号寄存器
ARM6之前, 1号寄存器的16位和18位用于使能数据TCM和指令TCM(ARM946, ARM966), ARM6因为可以使用9号寄存器控制每一块TCM的使能状态, 所以1号寄存器的这两个位就过时了, 应该置1 。
9号寄存器
每个TCM都有一个TCM区域寄存器, 设置这个寄存器就可以设置TCM的基址和大小 。 在设置TCM区域寄存器前, 需要设置TCM选择寄存器 。
下面是访问这些相关寄存器的指令:
ARM Instruction TCM Region Register
MRC/MCR P15, 0, Rd, C9, C1, 0 Data TCM Region Register
MRC/MCR P15, 0, Rd, C9, C1, 1 Instruction/Unified TCM Region Register