C DMA写入已分配内存会在第一次写入时丢失前两个地址
我正在玩带有FPGA的ZYNQ7(双核ARM)。FPGA设计有一个32位计数器,以256个数据包为单位,通过DMA控制器访问DDR 在处理器1的C代码中,我运行一个LWIP应用程序,通过以太网连接到我的pc。 在那里,我为DMA事务分配ram内存。指针的地址通过共享内存传递到第二个内核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
#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事务上。之后,当设备运行时,它再也不会出现
有什么想法吗?我找到了一个解决办法
我必须在分配内存后刷新缓存,然后才能将地址传递给第二个内核进行处理