TI中文支持网
TI专业的中文技术问题搜集分享网站

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后才触发中断的。而且

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

Shine:

请问这块memory cache了吗?如果使能cache了的话,可能是cache一致性问题引起的。

min zhang1:

回复 Shine:

1、DSP端跑的是sys/bios,怎么确认这块memory cache,我试过把DSP上的L1和L2都关掉(通过platform中的配置),效果还是一样的。
2、ARM端跑的Linux,用的是ioremap_nocache 把这整块额共享内存映射出来的,还是有手动试过在传输的过程中 通过drop_caches
释放所有的缓存,结果还是一样。还请给予更多的帮助,谢谢!!!

min zhang1:

回复 Tony Tang:

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

Tony Tang:

回复 min zhang1:

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

min zhang1:

回复 Tony Tang:

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

赞(0)
未经允许不得转载:TI中文支持网 » OMAPL138双核通信中遇到共享内存访问问题;
分享到: 更多 (0)