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共享内存读写问题



想咨询一下,板子上电后,驱动配置完毕,对共享内存直接不进行写操作而直接进行读的时候为什么会出现vBUS error。是不是对于共享内存的使用必须是先写后读啊!不能先读操作。我如果事先将使用的共享内存进行写操作(或者由外部发送的数据发到共享内存)然后在读就不会出现错误。

求解,非常感谢!

  • 没有这种限制,默认是允许对共享内存直接读操作。把你的操作过程及错误提示现象发上来看看,谢谢。

  • 你好,Andy Yin1,首先非常感谢你的回复,代码中我大概是这么操作的:

    count = 0;

    switch(count)

    {

    case 0:

        config = (int32 *)(0x0C000000);

        data_len = (config[0] > 0)? config[0] : 0;

        if (config[data_len] == 0xa5a5a5a5)

       {

            ……

        }

        count = 1;

        break;

    case 1:

        config = (int32 *)(0x0C010000);

        data_len = (config[0] > 0)? config[0] : 0;

        if (config[data_len] == 0xa5a5a5a5)

       {

            ……

        }

        count = 2;

        break;

    case 2:

        config = (int32 *)(0x0C020000);

        data_len = (config[0] > 0)? config[0] : 0;

        if (config[data_len] == 0xa5a5a5a5)

       {

            ……

        }

        count = 3;

        break;

    case 3:

        config = (int32 *)(0x0C030000);

        data_len = (config[0] > 0)? config[0] : 0;

        if (config[data_len] == 0xa5a5a5a5)

       {

            ……

        }

        count = 0;

        break;

    default :

        count = 0;

        break;

    }

    代码中的四段空间是用来存放SRIO发送过来的数据的,FPGA轮询向这四段空间发送数据。config[0]中存放的是每次发送数据的长度,最后数据的结束标志位为0xa5a5a5a5,所以用查询判断数据是否发送完毕。这段代码实在主函数中while(1)内的。

    在进入该循环代码前是对驱动的初始化,每当第一次上电的时候进入switch语句判断config[data_len]时就会抛出中断。上电之后从第三次烧写程序开始就不会出错了。抛出的错误信息大体如下:

    External exception happened. MEXPFLAG[3]=0x4004000.

      Event 110: MDMAERREVT XMC VBUS  error even

      MDMA read status error detected

      XID (Transaction ID) = 8

      Addressing error

      Event 122: DMC_CMPA CPU memeory protection fault for L1D(……)

      memory protection exception caused by local access at 0x4dfaf7e0

      Supervisor Read violation

    NRP = 0x8000c296, NTSR = 0x1800f, IRP = 0x0, ITSR = 0x0, ……

    Exception happened at a place can not safely return!

    我顺着代码查了一下,这是进入NMI中断了,但是不知道为什么会出现vbus错误和内存访问错误!

    当我在代码中先对0x0C000000~0x0C040000这段要读的空间初始化后(写0),就不会出现错误了,谢谢!

     

       

     

     

  • 从现象来看,代码中有对XMC MPAX进行配置对相关的memory进行了读写权限保护,对照corepac手册section先查看一下XMC MPAX的配置,如7.3.1.2节对应MPAX regs的地址0x08000000开始,对照MPAX寄存器定义确定访问的共享memory在MPAX中配置映射范围并且是允许读写的。

  • 你好,Andy Yin1,我现在不想用这种方式判断数据的到达,因为查询SL2的标志位都要占用总线,我觉得这样会影响其他核访问SL2的速率,不知道这样想对不对。现在想让FPGA每次发送完一包数据之后发送一个doorbell,我在这边判断相应的中断状态寄存器来判断数据的到达。

    但是这遇到了一个问题,就是数据和doorb谁先到达的问题。假如我把数据通过SRIO发送到SL2,我们知道它是需要内部DMA将数据搬送到SL2的,倒是doorb就不需要DMA了,当发送完数据再发送doorbell,有可能DSP端接受到doorbell中断的时候数据还没有完全发送过来,因为它需要DMA搬送。

    我想问一下有没有一个能判断每次数据发送完毕判断数据完全到达相应空间的寄存器,一直没找到。或者说一般在接收端采用什么样的方法来判断SRIO的数据发送完毕,谢谢!

  • 你好!

    我也遇到了类似的问题。

    请问您的两个问题:

    1、访问异常报错

    External exception happened. MEXPFLAG[3]=xxxxxxx

    2、SRIO写数据与发DOORBELL关系

    后来怎么解决的?

    谢谢!