Arm和运行linux系统,dsp核运行ti-rtos系统,系统中有一块共享的内存如:0x95800000,范围1MB。DSP对此内存启用了cache。假设有如下结构体:
typedef union
{
struct
{
volatile UINT32 ptrSender;//64~1M
volatile UINT32 ptrReader;//64~1M
};
volatile UINT32 CtrlHdr[16];
} AmMsgCtrl;
定义在内存0x95800000位置。
权限定义:
1、ARM对ptrReader有读、写权限,对ptrSender只有读权限;
2、DSP对ptrSender有读、写权限,对ptrReader只有读权限;
消息通讯:
1、DSP有新消息发给ARM时,修改ptrSender指针,同时对ptrSender和消息存放区使用cache_writeback函数,然后使用MsgQ通知ARM有新数据;
2、ARM接收到MsgQ通知后,读取ptrSender、ptrReader指针(打印此两指针的值),然后判断这两个指针来处理消息,当消息处理完成后,ARM修改(递增)ptrReader(通过打印消息看,ptrReader已经修改了),然后等待新的MsgQ通知。
出现的问题:
1、ARM接收到MsgQ通知后,打印ptrSender、ptrReader指针的值,出现ptrReader值回退现象,明明上次递增后打印的ptrReader已经改变,但是此时打印的ptrReader比上次打印的值小;而ptrSender值是一直正常递增的。
请问怎么确保ARM修改的值真实的写到内存?怎么解决这个异常问题?
2、DSP发送的消息比较频繁时,以上错误出现的几率比较大。难道是DSP使用cache_writeback时对ptrSender(dsp不会修改此指针)指针有影响?
Kevin Le82:
使用的是AM5728,ccs6.13
Kevin Le82:
回复 Kevin Le82:
各位专家请教一下:关于cache的操作,比如cache line是64字节的,我只修改了里面的int整形的4个字节,如果这时候调用cache写回,cpu写回时是将整个cache line的64字节写回还是只写回修改的4字节
Kevin Le82:
回复 Shine:
cache line是一次性写回,所以多核操作是需要小心