1. 平台说明
芯片:XC7Z020;
系统:双裸核程序,CPU0和CPU1 均使能cache。
2. 大块共享内存访问
1)一维数组访问
#define u32 (unsigned int)
#define SHARE_MEM 0x05000000 //第一数组的起始地址
#define MEM_LEN 0x05400000 //存放数组的长度
u32 *pData; //一维数组指针
int *pLen; //数组长度
pData = (u32*)(SHARE_MEM);
pLen= (int*)(MEM_LEN );
//------------- 访问, 写入;读取:和写入差不多,略。
*pLen = 0;
for(int i=0;i<1000;i++){
pData[i] = (u32)(i);
(*pLen) += 1;
}
2)二维数组访问
u32 *pArray[4]; //一维数组指针
int *pLen; //数组长度
pArray[0]= (u32*)(SHARE_MEM + 0);
pArray[1]= (u32*)(SHARE_MEM + 20000);
pArray[2]= (u32*)(SHARE_MEM + 40000);
pArray[3]= (u32*)(SHARE_MEM + 60000);
pLen= (int*)(MEM_LEN );
//------------- 访问, 写入;读取:和写入差不多,略。
u32 i = 0;
u32 j = 0;
for(i=0;i<4;i++){
pLen[i] = 0;
for(j=0;j<10000;j++){
pData[i] [j] = i*10000 + j;
pLen[i] += 1;
}
}
设置内存地址时,要避免和程序内的变量地址冲突,在lscript.ld中设置ps_ddr_0地址和大小时,留出空间用于共享内存。
由于使能了cache在写入数据后,最好调用函数Xil_DCacheFlushRange( addr, len);函数把cache中的数据刷到DDR中;
读取时最好调用函数Xil_DCacheInvalidateRange( addr, len); 把DDR中的数据刷入cache。
3. 为了避免CPU0和CPU1同时对同一块内存进行读写访问, 可以设置乒乓RAM
定义两块共享内存, mem0和mem1, 同时设置标志;交替写入数据。
当CPU0写mem0时,CPU1只能读取mem1;
当CPU0开始写mem1时,如果CPU1正在读mem1,可以设置等待读取完成再进行写入。
4. 注意:在进行共享内存的访问时,确保只能由一个CPU核进行写入,另一个核只能读取;
避免出现两个CPU和都能对同一个内存进行写入操作。