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.

一个cache操作的一致性问题



硬件平台:6678,软件平台:ccs5.5

1、当L1D和L1P的cache全开,即各32kB,L2的cache关闭,即0KB时,在core0上写DDR数据,然后writeback;在core1上对DDR地址做invalide操作,再读DDR数据,这种情况,数据都正确读出。

2、当L1D和L1P的cache全开,即各32kB,L2的cache打开128KB时,在core0上写DDR数据,然后writeback;在core1上对DDR地址做invalide操作,再读DDR数据,这种情况,DDR部分数据没进入cache中,导致读出错误数据。

附上memory 数据截图:

1、

地址0x80000000-0x8000007f的数据应该为1的,但是cache中还是为0,后面的数据都是对的。

2、

此图可以看出,core0确实已经把数据writeback到DDR中。

问题比较着急,搞了好久都没有找到问题所在,希望大家能帮忙解决,不甚感激

  • L1和L2都writeback了吗

    写的时候用wbInv试试

  • 谢谢Enoeht lea,刚试了,不行

    我说下我的测试情况:

    1、core0写DDR数据,core1读对应的DDR数据,当程序是基于BIOS系统的cache AIP操作,则没有问题

    2、core0写DDR数据,core1读对应的DDR数据,当程序是基于无操作系统的csl cache AIP操作,则会出现问题,参考了网上的操作,在core1程序中执行以下操作:

    /* Disable Interrupts */
    key = _disable_interrupts();

    /* Cleanup the prefetch buffer also. */
    CSL_XMC_invalidatePrefetchBuffer();

    CACHE_invL1d(g_ddr3Data, data_len, CACHE_FENCE_WAIT);
    CACHE_invL2(g_ddr3Data, data_len, CACHE_FENCE_WAIT);

    /* Reenable Interrupts. */
    _restore_interrupts(key);

    _mfence();
    _mfence();
    _mfence();

    还是不行,g_ddr3Data的前128字节,还是为0,貌似没invalide掉,128字节以后的数据都是正确的

    大神们有这方面经验的,能否指导下,谢谢了

  • TI专家们,能帮忙解答下吗?谢谢了

  • 把上面的CACHE_FENCE_WAIT换成CACHE_WAIT试试。

  • 怎么保证两个核中的同一个变量指向一个地址,核0的标识位isMCBSPInitialized置1了,但核1中isMCBSPInitialized还是0,没有同步,我两个核用相同的程序就可以同步。

    两个核都是这样定义的

    #pragma DATA_ALIGN (isMCBSPInitialized, 128)
    #pragma DATA_SECTION (isMCBSPInitialized, ".initialiedSharedMem");
    volatile Uint32 isMCBSPInitialized = 0;

    核0:

    isMCBSPInitialized = 1;

    CACHE_wbL1d ((void *) &isMCBSPInitialized, 128, CACHE_FENCE_WAIT);

    核1:

    while (isMCBSPInitialized == 0)
    CACHE_invL1d ((void *) &isMCBSPInitialized, 128, CACHE_FENCE_WAIT);

    核0的cmd:

    SECTIONS
    {
    .init_array: load >> L2SRAM
    .mcbsp: load >> MSMCSRAM
    .initializedSharedMem: load >> MSMCSRAM
    // .mcbspSharedMem: load >> MSMCSRAM
    platform_lib: load >> MSMCSRAM
    systemHeap: load >> L2SRAM
    }

    核1的cmd:

    SECTIONS
    {
    .init_array: load >> L2SRAM
    .initialiedSharedMem: load >> MSMCSRAM
    .qmss: load >> MSMCSRAM
    .cppi: load >> MSMCSRAM
    }

  • 最简单的办法就是多个核使用同一个out文件,将共享变量分配到MSMC中

    如果每个核要使用不同out文件的话,需要在cmd中强制指定一个共享section的起始地址,然后将两个核的共享变量都分配到这个section中,同时共享变量最好定义在一个相同的C文件中,保证编译的时候分配在section中的顺序也相同