Aurix TC3XX Cache memory分析

news/2025/2/2 23:53:44/

为了加速CPU获取指令和数据的速度,开发过程中,会选择开启Cached(缓存)功能。大家在阅读英飞凌芯片手册的时候,是否注意过如下的内存划分,Segment 8和Segment A的前16M空间大小划分一致,如下所示(eg:英飞凌tc3xx):

这两个段(Segment)内存区域有什么区别吗?划分的这两个段内存区域只是逻辑分区(Logical Area)的不同,实际这两个逻辑区对应同一个物理内存区(Physical Area),不同点:CPU访问Cached区和Non-Cached区的速度不同。为什么速度会不同呢?因为Cached区是一块速度更快的RAM区,CPU用一个时钟Cycle即可访问此区域,而访问Non-Cached区,需要多个时钟Cycle。

eg:CPU0的PFlash访问方式如下所示:

(1)使能Cached以后,每个CPU各有一段PCache/DCache区域,以便于提前缓存指令和数据(访问8 Segment)。当CPUx取指令时,会先去PCache空间查找指令,如果在PCache中查找到对应的指令,即:Cache Hit,则不必再去Physical Area搬运对应的数据,提高了指令读取的效率。如果没有找到对应的指令,即:Cache Miss,再去Physical Area搬运对应的数据到PCache空间(Program Cache refills),而搬运的过程需要额外的等待时间,等效于Non-Cached方式,指令读取时间延长;同理,当CPU取数据时,会先去DCache空间查找数据,如果在DCache中命中数据,则直接读取,如果没有命中,再去Physical Area搬运。(2)对于Non-Cached方式读取指令和数据(访问A Segment),CPU需要直接访问Physical Area,而访问Physical Area区域所消耗的时间远比访问PCache/DCache区域慢的多。

即:CPU访问Segment 8上的PF0和访问Segment A上的PF0的内容是一样的,只是访问速度不同。Aurix tc3xx部分Cache和Non-Cached地址空间对比如下所示:

1、PFlash指令和数据读取

对于CPU来说,如果想让其正确的干活,首先需要去目标地址拿到指令,之后再拿到需要处理的数据,按照指令处理数据。CPU不管拿指令还是数据都需要去内存中获取,如果CPU想获取PFn(PFlash)中的指令或者数据,需要通过PFI(Program Flash Interface)接口,经过PFRWB(PFlash Read Write Buffer)方能拿到PFn中的数据,如下所示:

PFI和PFRWB的交互如下所示:

为了节约CPU从PFn中读取指令或者数据的时间,Cache功能就派上了用场,将数据和指令提前缓存到每个CPU的Cache空间,Cache空间大小取决于芯片类型。

Cache访问方式之所以使得数据/指令访问效率提高,是因为提前将数据/指令搬运到了更利于CPU访问的PCache/DCache区域(RAM区),而为了提高搬运效率,CPU不会逐字节搬运,而是以Cache Line为最小单位搬运。对于tx3xx,一次可以搬运256bit数据(one cache line),也就是32 bytes。对于CPU指令而言,一次最多可以搬运8个32-bit指令或者16个16-bit指令。

对于tc3xx,CPU0的DCache大小为16 Kbyte,PCache大小为32 Kbyte。因此,对于数据,最多可以缓存16 * 1024 / 32 = 512 Cache Line;对于指令,可以缓存32 * 1024 / 32 = 1024 Cache Line。

不管DCache还是PCache,均采用了Two-way set-associative方式,即:DCache的所有Cache Line分为两组,每组256 Cache Line;PCache的所有Cache Line分为两组,每组512 Cache Line。类似二分法,先找到目标所在的组,之后在组内查找对应内存位置的数据/指令。对于这部分的理解,我参考了文末资料(2)。

CPU读取指令或者数据时,使能Cached与否,意味着CPU获取指令和数据的Path不同,如下所示:

由上图可以看出,CPU访问自身关联的内存区相对比较直接。eg:访问PCache/DCache、PSPR、DSPR、DLMU、LPB。如果CPUx需要访问CPUy的内存空间,则需要借助对应的Interface。

CPU内存访问路径

对于英飞凌tx3xx系列,多核内存之间的访问通过SRI(Shared Resource Interconnect Bus)交互,这种多主多从访问方式,可以提高数据的访问效率,示意如下所示:

(一)DMI接口

以CPU0访问数据为例,数据的访问需要通过DMI(Data Memory Interface),如下所示:

每个CPUx的DSPRx位于各自的DMI内部,如果CPUx需要访问CPUy的DSPRy,则需要通过SRI(Shared Resource Interconnect)Slave Interface,如下所示:

(二)PMI接口以CPU0访问指令为例,指令的访问需要通过PMI(Program Memory Interface),如下所示:

每个CPUx的PSPRx位于各自的PMI内部,如果CPUx需要访问CPUy的PSPRy,则需要通过SRI(Shared Resource Interconnect)Slave Interface,如下所示:

Cache使能

默认情况下,Cache功能禁止,如下所示:

  • DCache默认禁止

  • PCache默认禁止

Cache的使能需要手动启动,一般会在启动文件中启动Cache功能。

Cache的使能分为两种:PCache(指令缓存)、DCache(数据缓存)。配置PCON0.PCBYP位使能PCache,配置DCON0.PCBYP使能DCache。对应的寄存器如下所示:

如果没有手动配置Cache的空间大小,只操作PCON0.PCBYP和DCON0.PCBYP,则使用最大的Cache空间,每个CPU的DCache和PCache空间大小默认全部使用。

DCON2寄存器配置D-Cache和DSPR使用的空间大小,如下所示:

同样,PCON2寄存器配置P-Cache和PSPR使用的空间大小。

DCache/PCache空间

当DCache/PCache使能以后,会有额外的一段内存空间启用。以CPU0为例,如果CPU0的DCache/PCache使能,则对应的0x7003C000~0x7003FFFF(16Kbyte)、0x70110000~0x70117FFF(32Kbyte)可以使用,如下所示:

提示:其他核类似,不同核,可以使用的Cache空间大小可能不同。


http://www.ppmy.cn/news/334283.html

相关文章

3.4只读存储器ROM

文章目录 一、引子二、介绍1.MROM2.PROM3.EPROM4.Flash Memory5.SSD 三、运行过程四、回顾 一、引子 这一小节,我们学习只读存储器ROM。 上一小节,学习了两种RAM芯片,分别是SRAM和DRAM。详情请戳:3.3Sram和Dram RAM芯片可以支持…

机械革命深海幽灵z2学习电脑系统史

目录 前言第一次蓝屏第一次接触重装系统装Linux系统Linux16.04版本与显卡1060不兼容问题windows与linux双系统问题Linux学习售后自己重装系统换主板没有我修不好的电脑 键盘故障再次蓝屏重装系统梅花起总结 前言 先说说我的电脑型号 机械革命深海幽灵z2 7000多 i5-8300 1060 机…

机械革命 深海幽灵Z2-G的主要参数与特性

本文作用:记录自己用过的深海幽灵Z2-G的主要参数与特性,以供日后购买相关电子设备时参考。 主要时间节点及版本、价格 2019年5月9日,首发,购入。RAM和ROM有多个版本,下文主要描述购入版本。购入渠道:清华…

5.2 清洗数据

5.2 清洗数据 5.2.1 检测与处理重复值1、记录重复 drop_duplicates()2、特征重复 equals() 5.2.2 检测与处理缺失值 isnull()、notnull()1、 删除法 dropna()2、替换法 fillna()3、 插值法 5.2.3 检测与处理异常值1、3σ原则2、箱线图 5.2.4 任务实现(wei&#xff0…

02- 输入、输出及运算符(C语言)

一 输入、输出 1.1 输出函数 printf 函数是一个可变参数函数,参数的个数不定:int printf(const char *format, ...) printf("%d\n", x); printf("%d %d\n", x, y); 1.2 输入函数 1.2.1 scanf函数:int scanf(const …

vector 内存大小管理

vector 内存大小管理 环境&#xff1a; windows下 vs2019 1. size() 和 capacity() 1.1 定义一个空的 vector vector<int> v; cout << v.size() << endl; // 0 cout << v.capacity() << endl; // 0空的 vector 的 size() 和 capacity() 都是…

git实操和理论知识

一、上传代码到gitlab中 1、安装git工具 yum install -y git2、准备要上传的代码 db Dockerfile LICENSE pom.xml README.md src3、初始化 git init Initialized empty Git repository in /etc/ssh/tomcat-java-demo-master/.git/4、添加远程仓库地址(复制要上传的代码库地…

5个接口性能提升的通用技巧

前言 作为后端开发人员&#xff0c;我们总是在编写各种API&#xff0c;无论是为前端web提供数据支持的HTTP REST API &#xff0c;还是提供内部使用的RPC API。这些API在服务初期可能表现不错&#xff0c;但随着用户数量的增长&#xff0c;一开始响应很快的API越来越慢&#x…