参考zynq高频小数据量PS闭环的三个实验-第0课目的和目标zynq高频小数据量PS闭环的三个实验-第1课PL搭建zynq高频小数据量PS闭环的三个实验-第2课Vitis裸机测试zynq高频小数据量PS闭环的三个实验-第3课Linux驱动测试目的对比高频小数据量场景下 {GP,ACP} x {裸机,linux} 的各项指标。每个cycle固定交换64个u32。测试矩阵编号PS接口软件数据交换完成通知目的T1GPBare-metalAXI GP寄存器64写64读中断基准性能T2GPLinuxioremap()readl()/writel()中断Linux开销T3ACPBare-metalACP访问DDR中断ACP性能T4ACPLinuxkmalloc()virt_to_phys()ACP访问DDR中断ACPLinux性能slot0 寄存器表 [0x43c00000]读写是从PS角度看的PS可以用 axi_lite独立访问 slot0[1] ~ slot0[128],但是我为了PS能更高效的访问 slot0[1] ~ slot0[128] 引入 ACPslot0[1] ~ slot0[128] 在ddr中有个映像 ddr_slot0[1]~ddr_slot0[128]数据宽度32bit地址基址P_SLOT_BASE 0寄存器总数129地址范围slot0[0] ~ slot0[128]寄存器地址访问说明slot0[0]0W1P控制寄存器slot0[1] ~ slot0[64]1 ~ 64R/WPS读窗口PL用ACP 把这 64 个 u32 写入DDRslot0[65] ~ slot0[128]65 ~ 128R/WPS写窗口PL用ACP 从DDR读64个u32到这里CTRL (slot0[0])Bit名称说明0acq_en电平信号,1:使能采集 0:关闭采集1acq_done_flag采集完成中断,PS读取后自动清02ctrl_valid写窗口数据控制有效,PS写入1后自动清03mode0GP模式 1:ACP模式4busy只读状态,PL正在搬运数据5acp_err只读状态,ACP读写响应错误15~6Reserved保留31:16acq_freq中断频率,单位Hz测试流程初始化 GP 寄存器窗口裸机 shell 执行app_init_reg x初始化slot0[1] ~ slot0[128]为nx。初始化 ACP DDR 映像窗口裸机 shell 执行app_init_ddr_reg x初始化slot0_ddr[1] ~ slot0_ddr[128]为nx。启动 GP 周期采集裸机 shell 执行axi_test freq_hz等价于mode0, acq_en1, acq_freqfreq_hz命令本身不等待中断。启动 ACP 周期采集裸机 shell 执行acp_test freq_hz等价于mode1, acq_en1, acq_freqfreq_hz命令本身不等待中断。GP模式PL 以acq_freqHz 产生中断裸机 ISR 读取slot0[0~64]清除acq_done_flag并统计时间。ACP模式PL 以acq_freqHz 为周期把slot0[1] ~ slot0[64]转移到slot0_ddr[1~64]并产生中断; 裸机 ISR 读取 slot0_ddr[1~64]再写slot0[0].21通知 PL 拉回 DDR 写窗口到slot0[65] ~ slot0[128]不再修改 DDR 数据窗口。查询统计裸机 shell 执行get_info查看中断次数、中断间隔、响应次数和响应耗时。用AtShell制作12个命令序号命令 (Command)描述 (Description)0help命令列表1clean清屏2readGP 读 slot0 的129个 u323writeGP 写 slot04acp_read读 slot0_ddr5acp_write写 slot0_ddr6axi_testGP loop测试7acp_testACP loop 测试8app_init_reg初始化 slot0[0~128]9app_init_ddr_reg初始化 slot0_ddr[0~128]10stop停止复位清011get_info统计测试的信息$:0 AtShell commands:0.help - list cmd1.clean - cleanscreen2.read -readreg3.write -writereg4.acp_read - acpreadwindow5.acp_write - acpwritewindow6.axi_test - axi reg loop7.acp_test - acp ddr loop8.app_init_reg - app_init_reg9.app_init_ddr_reg - app_init_ddr_reg10.stop - stop slot0 acq11.get_info - slot0 irq info $:11modeGPfreq0Hzirq_cnt0irq_interval_ns0irq_exec_ns0loop_cnt0loop_ns0ps_rd64_ns0ps_wr64_ns0