大家好!
目前我在做C6670,多核访问MSMC区域内的同一个数组。
环境如下:CCS v5.3、TMS320C6670、SYS/BIOS v6.33
大致想实现的功能是:申请一个全局数组,load到MSMC区域内,Core0先写这个数组,然后通知Core1去打印这个数组。
实现方法是:
1. 使用了SYS/BIOS v6.33,在起Task之前,手动地设置L2为non-cacheable,L1d为32KB cacheable
CACHE_setL1PSize(CACHE_L1_32KCACHE);
CACHE_setL1DSize(CACHE_L1_32KCACHE);
CACHE_setL2Size(CACHE_0KCACHE);
2. 定义了全局变量
#defineMSMC_test_len 256
#pragma DATA_ALIGN (MSMC_test, 64)
#pragma DATA_SECTION (MSMC_test, ".shareMemotest");
unsigned char MSMC_test[MSMC_test_len];
由于开启了L1d cache,所以使用了
#pragma DATA_ALIGN (MSMC_test, 64)实现与L1d的64 Bytes Cache Line对齐
并在CMD文件中,将该变量分配到共享存储区
.shareMemotest load >> MSMCSRAM
3. 在Core0的代码中,写这个全局数组
for(i=0;i<MSMC_test_len;i++)
MSMC_test[i] = test_cnt;
然后,对Core0的L1d进行Write-Back再Invalidate
CACHE_wbInvL1d ((void *) MSMC_test, MSMC_test_len, CACHE_WAIT);
4. 接着Core0向Core1发送信号
5. Core1收到这个信号后,
CACHE_invL1d((void *) MSMC_test, MSMC_test_len, CACHE_WAIT);
for(i=0;i<MSMC_test_len;i++)
{
System_printf("%d ",MSMC_test[i]);
if(i%20 == 0)
System_printf("\n");
}
首先Invalidate Core1的L1d cache,然后打印这个全局数组。
出现问题是:每次Core0对长度为256 Bytes的MSMC_test写数据,比如0x02或者0x03等等,然后通知Core1打印,Core1打印出来的是前128 Bytes正确,后面的128 Bytes都是不正确的,显示的是第一次Core0对MSMC_test写的数据。