https://e2e.ti.com/support/processors-group/processors/f/processors-forum/583258/msmc-cache-issue
你(们)好
我是否可以调用 cache_invL1d、使其经过大尺寸? 例如
(L1D 为32K)
cache_invL1d (addr、7296、cache_wait)
cache_invL1d (addr、32768、cache_wait)
我之所以提出这一问题、是因为我遇到了以下问题
2 MSCM 中的共享结构、由8个内核访问、定义如下
------------------------------
#pragma DATA_ALIGN (cache_L2_LINESIZE);
#pragma DATA_SECTION (".MSharedSRAM")
volatile Struct1 far gStruct1;
#pragma DATA_ALIGN (cache_L2_LINESIZE);
#pragma DATA_SECTION (".MSharedSRAM")
volatile Struct2 far gStruct2;
------------------------------
sizeof (结构1)为7284
sizeof (结构2)为32656
地址0x0C109880处分配的结构1
在地址0x0C10B500处分配的结构2
两个结构都按如下方式进行访问(伪代码)
{
while (((CSL_semAcquireDirect (HW_SEM))=0);
cache_invL1d ((void*)&x、sizeof (x)、cache_wait);
x= x + 1;
cache_wbL1d ((void*)&x、sizeof (x)、cache_wait);
CSL_semReleaseSemaphore (HW_SEM);
}
要访问结构1、我使用大小7296 (缓存行大小的倍数)
例如:cache_invL1d (addr、7296、cache_wait)
要访问结构2、我使用大小为32768、cache_invL1d (addr、32768、cache_wait)
在常规间隔(对于调试、间隔= 1秒)、8个内核读取/写入结构:
-始终正确读取 struct 1
-有时结构2被错误访问、即内核读回旧值(结构内部有一个计数器、我看到计数器不能正确递增)
我找到了2种权变措施
工作区1:
通过禁用高速缓存、程序可正常运行几个小时、从而使程序承受压力、我将间隔设置为2ms
工作区2:
启用缓存后、我在结构1和结构2之间创建大小为128的虚拟结构、如下所示
------------------------
#pragma DATA_ALIGN (cache_L2_LINESIZE);
#pragma DATA_SECTION (".MSharedSRAM")
volatile Struct1 far gStruct1;
#pragma DATA_ALIGN (cache_L2_LINESIZE);
#pragma DATA_SECTION (".MSharedSRAM")
volatile DummyStructfar gDummyStruct;
#pragma DATA_ALIGN (cache_L2_LINESIZE);
#pragma DATA_SECTION (".MSharedSRAM")
volatile Struct2 far gStruct2;
------------------------
存储器中的新地址为:
结构1 0x0C109880
dummyStruct0x0C10B500
结构2 0x0C10B580
在启动时、我用已知模式填充 gDummyStruct,并在运行时检查该结构是否从未被覆盖
程序正常运行几个小时、以使程序承受压力 I 将间隔设置为2ms
有什么想法吗???????
谢谢你
Fabio