C DMA写入已分配内存会在第一次写入时丢失前两个地址

C DMA写入已分配内存会在第一次写入时丢失前两个地址,c,arm,fpga,xilinx,C,Arm,Fpga,Xilinx,我正在玩带有FPGA的ZYNQ7(双核ARM)。FPGA设计有一个32位计数器,以256个数据包为单位,通过DMA控制器访问DDR 在处理器1的C代码中,我运行一个LWIP应用程序,通过以太网连接到我的pc。 在那里,我为DMA事务分配ram内存。指针的地址通过共享内存传递到第二个内核 #define RCVADDR 0x1ef00002 u32_t * send=NULL; u32_t* addr = (uint32_t*)RCVADDR; //Allocating the memory o

我正在玩带有FPGA的ZYNQ7(双核ARM)。FPGA设计有一个32位计数器,以256个数据包为单位,通过DMA控制器访问DDR

在处理器1的C代码中,我运行一个LWIP应用程序,通过以太网连接到我的pc。 在那里,我为DMA事务分配ram内存。指针的地址通过共享内存传递到第二个内核

#define RCVADDR 0x1ef00002
u32_t * send=NULL;
u32_t* addr = (uint32_t*)RCVADDR;

//Allocating the memory once initially
if(send==NULL){
        send=malloc(256*sizeof(uint32_t));
    }

    *addr = (uint32_t)send;
    //starting the DMA on Core 2
    *getdma=1;

使用握手,我在第二个内核中初始化DMA事务,并在事务完成后使用第一个内核上的TCP连接将数据发送到PC

#define GetDMA  0x1ef00001
#define DONEDMA 0x1ef00003

uint8_t* getdma = (uint8_t*)GetDMA;
uint32_t* addr=(uint32_t*)RCVADDR;

    while(1){
        if(*getdma == 1){
            StartDMATransfer(*addr, 2048);  // The Number 2048 is the number Of Transfered Packets. It has to be at least the amount of Packets my Counter transfers in chunks. The design has a packet end indicator on its own. So 256 or bigger works the same as 256
            *getdma =0;

            Xil_DCacheFlush();

        }
    }
在建立TCP连接之前,我刷新DCache

void send_data(){
    int ip_addr[4];
        u8_t i=0;

        char * token = strtok(ip,".");
        ip_addr[0] = atoi(token);

        while(token != NULL){

            ip_addr[++i]=atoi(strtok(NULL,"."));
        }
        Xil_DCacheFlushRange(send, 256*sizeof(uint32_t));

        //sleep(0.5);
        connect(ip_addr,atoi(port));
}
问题:设备编程后的第一个变速箱循环显示:

[12801281,2,3,4,5,6,。。。。。 ……、248、2491530、1531、1532、1533、1534、1535]

前2个值和后6个值来自重新编程设备之前的前一个周期。 但是,这仅发生在第一个DMA事务上。之后,当设备运行时,它再也不会出现

有什么想法吗?

我找到了一个解决办法

我必须在分配内存后刷新缓存,然后才能将地址传递给第二个内核进行处理