编辑:CrazyRabbit
日期:2022年7月28日
本文是英飞凌官方培训的笔记摘录,入门篇第五节课。
1. 总述
下图是TC37x的架构框图,包含有3个TriCore核,每一个都包含一个DMI和PMI,分别是CPU的取数据、取指令接口。在DMI和PMI里分别有自己的DSPR和PSPR(Scratch-Pad Ram,集成在CPU上的高速RAM)。
对于SPR,查到的一些介绍(不保证正确):内核嵌入一块耦合紧密的SRAM,起到类似通用寄存器的作用。51的4组通用寄存器,既可以用作寄存器,又可以用作内部RAM,就是典型的Scratch-Pad。
除了CPU自身的内嵌RAM外,在SRI总线上还会有一块LMU(Local Memory Unit),LMU主要包含三部分:LMURAM、TRAM、EMEM。
TC3xx系列的亮点:
2. 内存布置
下图展示了TC3xx的内存布置:
- PFLASH和DFLASH:非易失性内存,用于存一些代码和数据
- UCB(User Configuration Blocks):用户可配置的内存块(在DFLASH中),可以配置芯片启动方式,是否对FLASH进行保护等
- BootROM:英飞凌自用,不可更改,BootROM会根据UCB进行相关芯片配置,上电后跑的第一段代码就在这里
- PSPR/DSPR(Program&Data Scratch-Pad RAM):允许CPU访问数据、指令比访问PFLASH、DFLASH更快
- PCACHE/DCACHE:高速RAM
初次使用AURIX的人员容易混淆,比如:代码地址段在0x8…和0xA…,0x8带CACHE,0xA不带CACHE。实际上他物理上是同一个地方,只是访问0x8的时候,他先把指令从这个地方拷贝到PCACHE中,CPU从PCACHE中找对应的指令,一次拷贝256个字节;如果是DCACHE的话,也类似,先把数据从被CACHE的地方拷贝到DCACHE,然后CPU去DCACHE Area取数据。
在多核使用中,需要注意,如果有一些共享变量,要被多个核访问。如果用CACHE的访问方式,会出现:在原始的地方(原核)数据已经被修改,而对于该核可能是从自己的CACHE中读取数据,会产生不一致。
- LMU(Local Manage Unit):注意分为三个部分,LMURAM、TRAM(一般给调试器工具使用,如TRACE32)和EMEM(用于标定或深度Trace)。
- 将4GB的可寻址范围分为了16个Segments,每个Segment是256MB
- 每个Segment的高4分,代表的是Segment Number
- 每个Segment都被允许访问一个specific area,无Cache或带Cache
- 每个Segment的用处见图片右侧
3. 多样的取指模式
右边的图片分为两部分:一个是Data Access,一个是Code Fetch。
所谓Data Access,CPU0可以通过DMI从自己的DSPR0、PSPR0,其他CPU的DSPR1、PSPR1取数据,只是去其他CPU需要经过SRI总线,经过SRI总线就会有竞争。所以开发人员在做代码的变量分配的时候,尽量将其放在自己CPU的SPR中,访问效率会更高。
下面的Code Fetch,CPU0可以通过PMI去访问DSPR0、PSPR0、DSPR1、PSPR1里面的指令;同样,访问其他CPU需要经过SRI总线,会跟其他CPU或DMA做竞争,造成额外的延迟。在一些应用里,会将一些算法从FLASH拷贝到PSPR0中,这样对于CPU0的访问会很快。
4. 系统集成
- 前面提到的Segment,要么是外设的地址空间,要么是cached/non-cached的内存;
- 在TriCore架构下,不同的Segment有不同的访问characteristics(特征),比如访问属性,访问权限等,都可以做一些配置;
- 访问Segment以外的地址空间,会产生一个Trap。