C6678-缓存和内存
- 全局内存映射
- 扩展内存控制器(XMC)-MPAX内存保护与地址扩展
- 使用例程
- 缓存
全局内存映射
扩展内存控制器(XMC)-MPAX内存保护与地址扩展
每个C66x核心都具有相同大小的L1和L2缓存,并且可配置为普通内存使用。
每个核心也都有独立的MPAX(隶属于XMC),主要功能如下:
a) 将32bit逻辑地址映射到36bit物理地址上
b) 提供内存保护功能
c) 支持16个可配置映射段如下。
注意:复位后Segment0映射起始地址为00000H,但内部CGEM配置空间不可映射,因此实际上只映射了4MB共享内存。
应用实例:
这是一个单镜像的多核应用实例,每个核心共享代码段,因此代码段物理地址相同,数据段通过MPAX分别映射到不同的物理地址空间,但实际上对于每个核心的应用程序而言,所访问数据段的逻辑地址相同。
MPAX的段寄存器,分别对应16个段。
映射逻辑地址/物理地址的第12位均为0,也就是说映射最小单位为4KB。
使用例程
本例程采用单镜像加载,Core0映射4MB的共享空间,进行映射确认;Core3和Core4分别映射1MB的共享空间到0x0_0c000000和0x0_0c100000的物理内存,分别向各自的共享内存起始地址写100个数据。
通过Core0观察0x0c000000和0x0c100000分别可见其他2个核心写入的不同数据。
程序代码:《c6678内存映射示例工程下载》
部分应用程序代码:
/* CSL Header file */
#include <ti/csl/csl_pscAux.h>
#include <ti/csl/csl_xmcAux.h>
#include <c6x.h>
#define MPAX_SEG_1M_Size 0x13
#define MPAX_SEG_4M_Size 0x13+2
/****************************************************
* 注意:逻辑地址:logicAddr只保留高20bit,
* 物理地址:phyAddr,只保留高24bit。
*/
void mpax_map(Uint32 segment,Uint32 logicAddr,Uint32 phyAddr,Uint32 segSize)
{
CSL_XMC_XMPAXH mpaxh;
CSL_XMC_XMPAXL mpaxl;
mpaxh.segSize = segSize;
mpaxh.bAddr = logicAddr; //逻辑地址
mpaxl.ux = 1;
mpaxl.uw = 1;
mpaxl.ur = 1;
mpaxl.sx = 1;
mpaxl.sw = 1;
mpaxl.sr = 1;
mpaxl.rAddr = phyAddr;//物理地址
CSL_XMC_setXMPAXH (segment, &mpaxh);
CSL_XMC_setXMPAXL (segment, &mpaxl);
}
int main(void)
{
Uint32 Core_ID;
Uint32 *test;
psc_init();
Uint32 i;
// Get the Current Core ID
Core_ID = DNUM; // c6x.h
if (Core_ID == 0)
{
mpax_map(0, 0x0c000, 0x00c000, MPAX_SEG_4M_Size);
}
if (Core_ID == 3)
{
mpax_map(0,0x0c000,0x00c000,MPAX_SEG_1M_Size);
test = (Uint32 *)0x0c000000;
for (i=0;i<100;i++)
*test++ = 0xA0A0A0A0;
}
if (Core_ID == 4)
{
mpax_map(0,0x0c000,0x00c100,MPAX_SEG_1M_Size);
test = (Uint32 *)0x0c000000;
for (i=0;i<100;i++)
*test++ = 0x11111111;
}
while(1);
}
缓存