最近有客户小朋友用我们的PCIE教程去实现PCIE和ARM共享PS DDR的数据,这位小朋友总是搞不出来,总是来骚扰我,所以抽出一个晚上,把这个功能简单调试下,真的很简单,下面把代码贴出来。
首先是ARM测试程序的升级,我们PCIE上位机发送4096个数据,ARM端程序,只要收到第一个数据为1就表示PCIE上位机已经发送数据到PS DDR了,之后我们的ARM端程序会读出所有的4096个数据,并且加1 再写入到PS DDR.
[pre]
#include <stdio.h>
#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主机之间大小端对齐的问题。这个留给具体开发应用的人去做把。我这里只会给出一个简单的例子,表示共享数据没有问题的。
|
|