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.

6678 BIOS 下如何定义某一段或者某一自定义存储空间为Non cacheable

TI的工程师你们好!

自制的一块6678板子,多核跑程序时出现问题,定义在共享内存内的变量,其他核心无法正确读取数据

在BIOS内,我从共享内存内开辟了一段1K的空间,名字叫做MSMC_DATA.

在cfg内,使用如下指令定义一个新段ShareData并放入MSMC_DATA.内

Program.sectMap[".ShareData"] = new Program.SectionSpec();
Program.sectMap[".ShareData"].loadSegment = "MSMC_DATA";

在程序内,使用DATA_SECTION将共享变量放入到ShareData段内

#pragma DATA_SECTION (TrackingInf1, ".ShareData")//sharedata is confided in the cfg file
volatile TrackingInf TrackingInf1;

但是当程序运行过程中,如果TrackingInf1发生了改变,其他核心并不能正确读取变量的值,

所以是不是应该将其存储空间(MSMC_DATA)或者段(ShareData)定义为Noncacheable?

具体需要如何操作?是在cfg文件内进行还是在Main函数中?

如果有更好的解决办法又该如何处理?

  • 跟非bios代码的操作一样,调用csl或者操作MAR寄存器配置memory属性为non cache

  • 谢谢你的回复!

    不过我是在MSMC内开的共享空间,这个空间一部分开成non cache的话好像需要使用XMC进行空间映射

    觉得这么做太麻烦了,最后就用MessageQ进行数据交互了

    现在我的ShareRegion在共享L2内,只要我的结构体内不含有数组指针的话

    我用MessageQ传结构体就不要进行Cache一致性维护了吧!

    自定义的结构体如下

    typedef struct TrackingMessage{

     MessageQ_MsgHeader  header;
     Uint32 X_locationori;
     Uint32 Y_locationori;
     Uint32 Boxori;
     Uint32 X_location;
     Uint32 Y_location;
     Uint32 Box;
     Uint32 Index;
     Uint32 CountMin;
     Uint32 CountIn;
     Uint32 status;
    } TraMsg;

  • 最后自己解决了,使用MessageQ,如果自定义结构体内不含有字符串指针之类的,就不需要进行Cache一致性维护,

    MessageQ会自行帮你同步数据,之后熟悉了指针操作之后发现数据发送都没有问题