AURIX的芯片手册:
内存
内存在电脑中起着举足轻重的作用。内存一般采用半导体存储单元,包括随机存储器(RAM),只读存储器(ROM),以及高速缓存(CACHE)。
RAM作为主存的主要部分,按其结构分为:
动态随机存取存储器 (Dynamic Random Access Memory,DRAM), 同步动态随机存取内存(synchronous dynamic random-access memory,简称SDRAM), 静态随机存取存储器(Static Random-Access Memory,SRAM)。
可以理解为FLASH是一个静态的存储【也就是只读存储器(ROM)】,可以用来存储函数或者常量,也就是定义的这部分烧录到芯片里,执行内容不会有改变。即便掉电,里面的数据也不会丢失。
而RAM是一个动态的存储,可以读数据,也可以写数据。RAM可以在运行过程中,可以当flash用。但是如果掉电,RAM里的数据不会保存,一旦掉电,数据就全没了。
举例:一个手机里存着我们很多的数据,如果手机关机,这些数据或者图片是存放在FLASH里的,因为FLASH是存放静态数据的,而当手机重新上电的时候,flash里的数据会通过指令传输到RAM里,之后在被系统里的函数调用,从而开机后,手机可以看到关机前的数据。
缓存:
万字整理内存管理之Cache
高速缓冲存储器(Cache),是位于CPU与主内存间的一种容量较小但速度很高的存储器:
由于CPU的速度远高于主内存,CPU直接从内存【(RAM)、(ROM)】中存取数据要等待一定时间周期,Cache中保存着CPU刚用过或循环使用的一部分数据,当CPU再次使用该部分数据时可从Cache中直接调用,这样就减少了CPU的等待时间,提高了系统的效率。
缓存需要把内存里的数据放进来。Cache 的数据放置的策略决定了内存中的数据块会拷贝到 CPU Cache 中的哪个位置上,因为 Cache 的大小远远小于内存,所以,需要有一种地址关联的算法,能够让内存中的数据可以被映射到 Cache 中来。这个有点像内存地址从逻辑地址向物理地址映射的方法,但不完全一样。
缓存的命中:
根据要寻址的地址的tag来逐一与cache中的tag字段比较,如果有与之匹配的cache line,也就是cache hit,如果遍历整个cache,也没有找到匹配的cache line,那就是cache miss了。
Cache的层次设计
Cache设计采用了指令 Cache(简称I-Cache)和数据Cache (简称D-Cache) 分开的方式。
- 在 I-Cache中存储有微处理器需要的指令,在微处理器的取指阶段,通过程序计数器PC提供给I-Cache的地址,微处理器可以获取需要的指令。
- 而D-Cache则是作为一个数据的存储,并提供对于Load/Store指令所要操作地址的数据,它地址则来自于ALU运算的结果。
I-Cache和微处理器的接口以及I-Cache和L2 I-Cache的接口都是单向的。D-Cache和微处理器的接口以及D-Cache和L2 Cache的接口是双向的。这样处理的原因在于I-Cache存储的是指令,不需要更改所存储的数据的值。而D-Cache 中存储的是数据,其值会根据指令操作的不同而改变。比如:在运行 Store 指令的时候会对 D-Cache 中相应地址进行写入数据的操作。
AURIX中的Cache:
在AURIX中,CPU分为Cache和Non-Cache,CPU0的PFlash访问方式如下图:
Cache使能的方式是配置下面这个寄存器:
(1)使能Cache以后,每个CPU各有一段PCache/DCache区域,以便于提前缓存指令和数据(例如访问8和9的 Segment,这是打开了P-Cache后,P-Flash和LMU对应的地址)。
当CPUx取指令时,会先去PCache空间查找指令,如果在PCache中查找到对应的指令,即:Cache Hit,则不必再去Physical Area搬运对应的数据,提高了指令读取的效率。如果没有找到对应的指令,即:Cache Miss,再去Physical Area搬运对应的数据到PCache空间(Program Cache refills),而搬运的过程需要额外的等待时间,等效于Non-Cached方式,指令读取时间延长;同理,当CPU取数据时,会先去DCache空间查找数据,如果在DCache中命中数据,则直接读取,如果没有命中,再去Physical Area搬运。
(2)对于Non-Cache方式读取指令和数据(例如访问10和11的 Segment,这是关闭了P-Cache后,P-Flash和LMU对应的地址),CPU需要直接访问Physical Area,而访问Physical Area区域所消耗的时间远比访问PCache/DCache区域慢的多。
P-Cache(P-Cache就是I-Cache)与D-Cache的区别:
P-Cache的作用是缓存指令,D-Cache是缓存数据。指令一般不会被修改,所以P-Cache在硬件设计上是可以是只读的,这在一定程度上降低硬件设计的成本。D-Cache则是作为一个数据的存储,并提供对于Load/Store指令所要操作地址的数据,它地址则来自于ALU运算的结果。
在C语言中,内存主要分为5个区,分别为栈区、堆区、全局/静态存储区、常量存储区、代码区。其中代码区存放源程序的二进制代码,其余四个区都存储进程运行过程中需要的存储的变量。
一般,指令(P-Cache或者PSPR的内容)是放在代码区或者常量区,而数据(D-Cache或DSPR的内容)放在全局(静态)区。
举例:
我定义一个函数:
观察他的map文件里的地址:.o是他所属的C文件,下面是函数所属的地址。同样的我定义一个未初始化的全局变量,也可以找到他的地址。
我定义一个全局变量:
他的map文件里的地址:.o是他所属的文件,下面是函数所属的地址。同样的我定义一个.bss或.data的全局变量,也可以找到他的地址。
linker file用来定义数据和代码具体存放在哪一块。比如它会规定存储在Flash的启动函数_START()的存储地址和BootROM里面reset vector内预设的地址匹配,这样复位以后就总会从启动函数_START()开始执行
如何在代码里将函数、变量、常量等由一个地址移到另一块地址:
举例:我想将代码里的函数从原来P-Cache的地址移到PSPR这个地址。要如何处理。原来P-Cache访问P-flash,现在改成PSPR访问P-flash
我在TASKING的.lsl文件中添加一个规则,这个规则的意思就是将代码中含有 PSPR_CORE2_CPULoad_Optimize 这个关键词的函数放到PSPR的地址里面
代码中添加的内容是:
函数地址的变化:由801ea848变成50100004
上面是将某个函数换地址,也可以用上面的方式将整个文件的函数换地址,除此之外,还可以如下图将划线的内容改成CDD_SDH*,这样也可以将整个C文件的函数换个地址:文章来源:https://www.toymoban.com/news/detail-470274.html
文章来源地址https://www.toymoban.com/news/detail-470274.html
到了这里,关于关于Aurix的内存,缓存Cache,PSPR等的理解-(持续更新)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!