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.

C6678:使用bios时全局变量的问题



我在两个例程里面看到对全局变量的使用方法有矛盾,还请专家帮忙解释下

在shmIPC例程里面,在c文件开头定义了一些全局变量,从下文的程序中可以看出,各个core都有自己的全局变量,全局变量的值都不一样。

但是在led_play例程里面,定义了next_core这个全局变量,却被用于多核之间同步,因此可见多核都可以访问的是同一个内存空间。

这里我有一点想不明白,对于多核程序,全局变量是多核共享的还是每个core都有对应的全局变量?

如果全局变量是共享的,shmIPC中之所以多核各自访问得到的全局变量值不同,只是因为各自cache里面的数据没有维护一致性,那么这样的使用方式岂不是很不安全?

  • 如果是多核共享一个out的话,可以很容易做到多个核使用相同的变量名字对应不同的地址;如果多核共享一个out,如果定义的全局变量在LL2则是私有的,如果在共享memory则是共享变量。

  • 如果用不同的.out呢,多核共享同一变量出问题是什么原因???

    怎么保证两个核中的同一个变量指向一个地址,核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
    }

  • 一个简单的办法,你可以分别检查两个核的map文件,看看这两个变量是否分配到了MSMC上面的相同地址。如果分配到相同地址的话,这样操作是没有问题的。

  • 怎么保证两个核中共享全局变量分配相同地址,我查看了两个map文件分配地址不一致。

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

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