Zynq7000 双核运行 核间通信 防止访问冲突经验总结

1. 平台说明

芯片:XC7Z020;

系统:双裸核程序,CPU0和CPU1 均使能cache。

2. 大块共享内存访问

    1)一维数组访问

         #define u32 (unsigned int)

         #define SHARE_MEM 0x05000000   //第一数组的起始地址

         #define MEM_LEN       0x05400000   //存放数组的长度 

         u32 *pData;  //一维数组指针

         int   *pLen;    //数组长度

         pData = (u32*)(SHARE_MEM);

          pLen= (int*)(MEM_LEN );

         //------------- 访问, 写入;读取:和写入差不多,略。

         *pLen = 0;

         for(int i=0;i<1000;i++){

                  pData[i] = (u32)(i);

                  (*pLen) += 1;

         }

    2)二维数组访问

         u32 *pArray[4];  //一维数组指针

         int   *pLen;    //数组长度

         pArray[0]= (u32*)(SHARE_MEM + 0);

         pArray[1]= (u32*)(SHARE_MEM + 20000);

         pArray[2]= (u32*)(SHARE_MEM + 40000);

         pArray[3]= (u32*)(SHARE_MEM + 60000);

          pLen= (int*)(MEM_LEN );

         //------------- 访问, 写入;读取:和写入差不多,略。

        u32 i = 0;

        u32 j = 0;

         for(i=0;i<4;i++){

                  pLen[i] = 0;

                  for(j=0;j<10000;j++){

                          pData[i] [j] = i*10000 + j;

                          pLen[i] += 1;

                  }

         }

         设置内存地址时,要避免和程序内的变量地址冲突,在lscript.ld中设置ps_ddr_0地址和大小时,留出空间用于共享内存。

         由于使能了cache在写入数据后,最好调用函数Xil_DCacheFlushRange( addr, len);函数把cache中的数据刷到DDR中;

         读取时最好调用函数Xil_DCacheInvalidateRange( addr, len);  把DDR中的数据刷入cache。

3. 为了避免CPU0和CPU1同时对同一块内存进行读写访问, 可以设置乒乓RAM

    定义两块共享内存, mem0和mem1,  同时设置标志;交替写入数据。

    当CPU0写mem0时,CPU1只能读取mem1;

    当CPU0开始写mem1时,如果CPU1正在读mem1,可以设置等待读取完成再进行写入。

4. 注意:在进行共享内存的访问时,确保只能由一个CPU核进行写入,另一个核只能读取;

    避免出现两个CPU和都能对同一个内存进行写入操作。

你可能感兴趣的:(Zynq,双核)