项目中设计了一个简单的双核通信机制: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掉当内存来使用;