This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSMC 缓存问题?

Guru**** 2609925 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

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

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Fabio、

    我已通知 RTOS 团队。 他们的反馈将在此处发布。

    同时、您能否分享一下这是哪个 SDK 版本?

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好

    MCSDK 2.1.2.6
    SYS/BIOS 6.45.1.29

    此致
    Fabio
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我在原始案例和 workaround2案例中看到、struct2始终是二级高速缓存行大小对齐的。 在权变措施案例2中、使用了什么突出显示的字节计数? 32768? cache_invL1d (addr、32768、cache_wait)。 CSL 代码将字节计数转换为字计数并写入 L1DIWC 寄存器。 我不明白为什么不能使用32768。

    此致、Eric   

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好

    是的、我使用32768。 因此、尺寸不是问题、您能建议我如何进一步调查以了解正在发生的情况吗?

    此致

    Fabio

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    也尝试使预取缓冲区无效、因为默认情况下、MCSM 是可预取的:
    1.无效
    2.*XPFCMD=1,其中 XPFCMD 为(volatile UINT32_t*) 0x08000300
    3._mfenced();

    请参阅 C6678 CorePac 文档中的 XPFCMD§7.5.3 (建议使用的一个词是"将共享缓冲区隔开"、正如您已经完成的那样)。

    还要考虑有关缓存 L2损坏的芯片勘误表、即使不是您的情况也是如此。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    非常感谢,您给了我很好的解释。  使预取缓冲区无效的操作正常!

    谢谢