
嵌入式开发:如何理解Local/Global寻址?
在TriCore架构中,SRAM(Static RAM)又分为PSPR(Program Scratch Pad RAM)和DSPR(Data Scratch Pad RAM),对于PSPR和DSPR又细分为Local PSPR/DSPR和Global PSPR/DSPR。如何理解Local和Global呢?
1、PSPR和DSPR地址划分
在TriCore多核架构中,PSPR和DSPR的Global基地址划分如下所示:
TriCore多核架构中,要求CPU之间数据/指令访问通过全局地址访问,也就是上述Global基地址开始的有效访问空间。而对于每个CPU的本地数据,可以使用Local地址访问,也可以使用Global地址访问。
(一)CPU数据访问
如下图,CPU0访问数据的有效全局地址空间为0x70000000~0x7003BFFF(240KByte),这块地址空间就是Global;而访问本地有效地址空间为0xD0000000~0xD003BFFF(240KByte),这块地址空间就是Local,而这两个逻辑地址空间对应同一块物理地址空间。CPU1访问数据的有效全局地址空间为0x60000000~0x6003BFFF(240KByte),访问本地有效地址空间也是0xD0000000~0xD003BFFF(240KByte),而这两个逻辑地址空间也对应同一块物理地址空间。
如上图可以看出,对于每个CPU,访问Local地址空间时,地址虽然一样,但是彼此之间不能直接访问,只能本地CPU访问。
(二)CPU指令访问
如下图,CPU0访问指令的有效全局地址空间为0x70100000~0x7010FFFF(64KByte),访问本地有效地址空间为0xC0100000~0xC010FFFF(64KByte),而这两个逻辑地址空间对应同一块物理地址空间。而CPU1访问全局数据的有效全局地址空间为0x60100000~0x6010FFFF(64KByte),访问本地有效地址空间为0xC0100000~0xC010FFFF(64KByte),而这两个逻辑地址空间也对应同一块物理地址空间。
2、数据的Global地址访问理解
如下图,CPU0如果想访问CPU1中的数据,只能通过读取CPU1的Global地址获取,而不能通过Local地址获取,因为CPU0和CPU1两者的Local地址一样,如果访问Local地址,CPU0只能读取到本地数据,而不是CPU1的数据。
3、Local和Global的映射操作
实际的开发中,Local和Global地址需要在链接文件中映射。示例如下:
MEMORY
{
dsram2_local (w!xp): org = 0xd0000000, len = 120K
dsram2 (w!xp): org = 0x50000000, len = 120K
psram2 (w!xp): org = 0x50100000, len = 24K
dsram1_local (w!xp): org = 0xd0000000, len = 120K
dsram1 (w!xp): org = 0x60000000, len = 120K
psram1 (w!xp): org = 0x60100000, len = 24K
dsram0_local (w!xp): org = 0xd0000000, len = 112K
dsram0 (w!xp): org = 0x70000000, len = 112K
psram0 (w!xp): org = 0x70100000, len = 24K
psram_local (w!xp): org = 0xc0000000, len = 24K
......
}
/* map local memory address to a global address */
REGION_MAP( CPU0 , ORIGIN(dsram0_local), LENGTH(dsram0_local), ORIGIN(dsram0))
REGION_MAP( CPU1 , ORIGIN(dsram1_local), LENGTH(dsram1_local), ORIGIN(dsram1))
REGION_MAP( CPU2 , ORIGIN(dsram2_local), LENGTH(dsram2_local), ORIGIN(dsram2))
4、数据的local和global访问示例
基于TC277TP,在三个Core中分别定义全局变量CPU0_argu = 0x10、CPU1_argu = 0x20、CPU2_argu = 0x30。三个全局变量默认都分配到CPU1对应的全局地址空间,如下所示:
既然三个全局变量全部分配到Core1对应的global地址空间,那么Core0、Core2无法访问Core1的local地址,只有Core1可以通过local地址空间访问到CPU0_argu、CPU1_argu、CPU2_argu。
(一)CPU0访问CPU0_argu、CPU1_argu、CPU2_argu结果如下所示:
如上可以看出,CPU0_argu、CPU1_argu、CPU2_argu数据存储到CPU1的全局RAM区域,CPU0只能通过CPU1的global地址获取数据,访问local数据时只能访问到CPU0的本地数据,访问不到CPU1本地的CPU0_argu、CPU1_argu、CPU2_argu。
(二)CPU1访问CPU0_argu、CPU1_argu、CPU2_argu结果如下所示:
如上可以看出,CPU0_argu、CPU1_argu、CPU2_argu数据存储到CPU1的全局RAM区域,CPU1既可以通过CPU1的global空间获取数据,也可以通过local空间访问数据,且两者数据相同。
(三)CPU2访问CPU0_argu、CPU1_argu、CPU2_argu结果如下所示:
如上可以看出,CPU0_argu、CPU1_argu、CPU2_argu数据存储到CPU1的全局RAM区域,CPU2只能通过CPU1的global地址获取数据,访问local数据时只能访问到CPU2的本地数据,访问不到CPU1本地的CPU0_argu、CPU1_argu、CPU2_argu。
文章转载自公众号:开心果 Need Car
