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.

OMAPL138双核通信中遇到共享内存访问问题;



项目中设计了一个简单的双核通信机制:DSP->ARM的通信;

1、在共享内存地址0x80000000的地址分配给一个事件通知的结构体:

typedef struct tagCoreInterCNotify_t
{
    uint8_t   bAckFlag;          // ACK enable or disable and as interrupt flag. EN_NOTIFY_ACK
    uint8_t      bEvent;           // Event number. if the event have no data,please do not care next config
    uint16_t  wDataLen;      // Data len<=2000(byte). fill "0" if this event have no data
    void* pDataAddr;
}CoreInterCNotify_t;
2、然后在0x80000020开始的2K地址范围内用来传输数据;

3、当DSP需要发送数据给ARM时,先通过中断SYSCFG_CHIPSIG_CHIPSIG0通知ARM,并将CoreInterCNotify_t结构体中bAckFlag的标志置位;

4、ARM 端读取数据(通过内存映射读取0x80000000的CoreInterCNotify_t结构体获取事件等相关信息,让后再将0x80000020处的数据拷贝出来);

5、ARM 端读取完数据后将CoreInterCNotify_t结构体中bAckFlag的标志清除;

问题:如果当DSP需要发送数据给ARM时不检查bAckFlag的标志是否被清除,工作正常。但是只要检查bAckFlag标志,ARM 端能收到中断但是读出

CoreInterCNotify_t结构体中的数据就不正确。

感觉像是是要DSP端和ARM端都读取这段数据就不行!!!按道理DSP端读取和ARM读取不是同时的,都是先查询标志OK后才触发中断的。而且

在硬件生这块共享内存应该没有显示吧?还请各位给予解答,谢谢!!

  • 请问这块memory cache了吗?如果使能cache了的话,可能是cache一致性问题引起的。
  • 1、DSP端跑的是sys/bios,怎么确认这块memory cache,我试过把DSP上的L1和L2都关掉(通过platform中的配置),效果还是一样的。
    2、ARM端跑的Linux,用的是ioremap_nocache 把这整块额共享内存映射出来的,还是有手动试过在传输的过程中 通过drop_caches
    释放所有的缓存,结果还是一样。还请给予更多的帮助,谢谢!!!
  • min zhang1 说:
    3、当DSP需要发送数据给ARM时,先通过中断SYSCFG_CHIPSIG_CHIPSIG0通知ARM,并将CoreInterCNotify_t结构体中bAckFlag的标志置位;

    先将CoreInterCNotify_t结构体中bAckFlag的标志置位,再通过中断SYSCFG_CHIPSIG_CHIPSIG0通知ARM更合理吧。

    min zhang1 说:

    问题:如果当DSP需要发送数据给ARM时不检查bAckFlag的标志是否被清除,工作正常。但是只要检查bAckFlag标志,ARM 端能收到中断但是读出

    CoreInterCNotify_t结构体中的数据就不正确。

    不正确的数有什么规律没有?

    min zhang1 说:
    在硬件生这块共享内存应该没有显示吧?

    在硬件上这块内存用做共享内存没有问题。

    不防尝试在代码上做点修改试一下,在写操作后加一个回读的空操作,以确保“写”动作完成了。

  • 通过配置MAR寄存器禁用这块共享内存缓存,问题解决。感谢!!

  • 你前面提到试过将L1, L2 disable也不行是怎么回事? 是关的指令Cache? 不是关的数据Cache?

  • 这也是我觉得纳闷的地方,我之前确实将L1 DATA关闭了, L2都是disable掉当内存来使用;