[X]关闭

MZ7015FA开发板PCIE数据和ARM端修改问题

文档创建者:求助大神
浏览次数:9395
最后更新:2019-07-17
 
使用的mz7015开发板,使用官方
pcie
例程CH01_BASE ,代码如下:
#define PCIE_DATA_ADDR 0x1000000
int main()
{
int i;
int pcie_read_data  = 0;
int pcie_write_data = 0;
    init_platform();
    while(1)
    {
     for(i = 0; i < 10; i++)
     {
      pcie_read_data = Xil_In32(PCIE_DATA_ADDR + i*4);
      Xil_Out32(PCIE_DATA_ADDR + i*4, pcie_read_data+1);
      pcie_write_data = Xil_In32(PCIE_DATA_ADDR + i*4);
     }
    }
    cleanup_platform();
    return 0;
}
debug程序断点在for循环处,通过pc端xdma_rw.exe命令写入二进制文件,debug单步执行读出的数据和二进制文件数据一致,修改内存数据,通过pc
端xdma_rw.exe命令读出二进制文件发现文件没有被修改,求解答。



发表评论已发布 6

uisrc

发表于 2019-7-11 17:07:22 | 显示全部楼层

可能cache问题,disable cache后再试试
越努力越幸运!加油!

求助大神

发表于 2019-7-11 17:30:27 | 显示全部楼层

admin 发表于 2019-7-11 17:07
可能cache问题,disable cache后再试试

#define PCIE_DATA_ADDR 0x1000000
int main()
{
int i;
int pcie_read_data  = 0;
int pcie_write_data = 0;
//    init_platform();
//    print("Hello World\n\r");
    while(1)
    {
     for(i = 0; i < 10; i++)
     {
//      disable_caches();
      pcie_read_data = Xil_In32(PCIE_DATA_ADDR + i*4);
      Xil_Out32(PCIE_DATA_ADDR + i*4, pcie_read_data+1);
      pcie_write_data = Xil_In32(PCIE_DATA_ADDR + i*4);
//      enable_caches();
     }
    }
//    cleanup_platform();
    return 0;
}
改完还是不行

菲尼克兔

发表于 2019-7-16 11:11:20 | 显示全部楼层

我也感觉不是cache的问题,
我想问下....单步执行的时候pcie_write_data  读出的数据是不是已经不是写入的数据了?

uisrc

发表于 2019-7-16 22:36:05 | 显示全部楼层

  首先是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]
测试结果如下





越努力越幸运!加油!

菲尼克兔

发表于 2019-7-17 10:01:46 | 显示全部楼层

7015上已经有arm+pcie的case啦,请问7035上有这样的例子不?

uisrc

发表于 2019-7-17 13:30:16 | 显示全部楼层

7035用的PL DDR 自己也可以用PS DDR实现,很简单,自己弄下吧。
越努力越幸运!加油!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则