最近有客户小朋友用我们的PCIE教程去实现PCIE和ARM共享PS DDR的数据,这位小朋友总是搞不出来,总是来骚扰我,所以抽出一个晚上,把这个功能简单调试下,真的很简单,下面把代码贴出来。 首先是ARM测试程序的升级,我们PCIE上位机发送4096个数据,ARM端程序,只要收到第一个数据为1就表示PCIE上位机已经发送数据到PS DDR了,之后我们的ARM端程序会读出所有的4096个数据,并且加1 再写入到PS DDR. [pre] #include #include "platform.h" #include "xil_printf.h" #include "xil_io.h" #define PCIE_DATA_ADDR 0x10000000 u8*BufferPtr = (u8 *)PCIE_DATA_ADDR; int main() { int i=0; int read_val = 0; Xil_DCacheDisable(); while(1) { read_val=Xil_In8(PCIE_DATA_ADDR); if(read_val==1) { for(i = 0; i < 4096; i++) { read_val=Xil_In8(PCIE_DATA_ADDR + i); Xil_Out8(PCIE_DATA_ADDR + i, read_val+1); //printf("pcie read %d: %d\r\n",i,read_val); } read_val=0; } } return 0; } [/pre] 再来看上位机程序,上位机可以利用PCIE 第三课CH03_BAR_DDR程序只要稍作修改,每次发送4096字节数据,并且把的第一个数据设置为1,发送完成后要等待一会,等ARM端读并且加1后写入到DDR,完成后再读出PS DDR数据,做比较,看是否加1了。 测试结果如下 [pre] void MainWindow::on_TestDDR_clicked() { unsigned char buf1[4096]; unsigned char *buf2 = c2h_align_mem_tmp; unsigned int i=0; unsigned char tmp; unsigned int error_cnt =0; for(i=0;i<4096;i++) { buf1 = i+1; } put_data_to_fpga_ddr(FPGA_DDR_START_ADDR,buf1,4096); Sleep(1000); get_data_from_fpga_ddr(FPGA_DDR_START_ADDR,buf2,4096); for(i=0;i<4096;i++) { tmp = buf1 + 1; if(tmp!= buf2) error_cnt++; } if(error_cnt) { m_ddrpass++; QString str = QString("%1 %2").arg("DDR bad data = ").arg(error_cnt); ui->labelDDRPASS->setText(str); } else { m_ddrpass++; QString str = QString("%1 %2").arg("DDR PASS Times = ").arg(m_ddrpass); ui->labelDDRPASS->setText(str); } } [/pre] 测试结果: 最后小结:可以看到测试只用了byte读写测试也就是8bit,如果用32bit测试,也就是4bytes,应该还要注意ARM和X86主机之间大小端对齐的问题。这个留给具体开发应用的人去做把。我这里只会给出一个简单的例子,表示共享数据没有问题的。 |
扫描关注,了解最新资讯