参考
zynq高频小数据量PS闭环的三个实验-第2课:Vitis裸机测试
zynq高频小数据量PS闭环的三个实验-第3课:Linux驱动测试
目的
对比高频小数据量场景下 {GP,ACP} x {裸机,linux} 的各项指标。每个cycle固定交换64个u32。
测试矩阵
| 编号 | PS接口 | 软件 | 数据交换 | 完成通知 | 目的 |
|---|---|---|---|---|---|
| T1 | GP | Bare-metal | AXI GP寄存器(64写+64读) | 中断 | 基准性能 |
| T2 | GP | Linux | ioremap()+readl()/writel() | 中断 | Linux开销 |
| T3 | ACP | Bare-metal | ACP访问DDR | 中断 | ACP性能 |
| T4 | ACP | Linux | kmalloc()+virt_to_phys(),ACP访问DDR | 中断 | ACP+Linux性能 |
slot0 寄存器表 0x43c00000
读写是从PS角度看的
PS可以用 axi_lite独立访问 slot01 ~ slot0128,但是我为了PS能更高效的访问 slot01 ~ slot0128 引入 ACP
slot01 ~ slot0128 在ddr中有个映像 slot0_ddr1~slot0_ddr128
- 数据宽度:32bit
- 地址基址:
P_SLOT_BASE = 0 - 寄存器总数:129
- 地址范围:
slot0[0] ~ slot0[128]
| 寄存器 | 地址 | 访问 | 说明 |
|---|---|---|---|
slot0[0] |
0 |
W1P | 控制寄存器 |
slot0[1] ~ slot0[64] |
1 ~ 64 |
R/W | PS读窗口,PL用ACP 把这 64 个 u32 写入DDR |
slot0[65] ~ slot0[128] |
65 ~ 128 |
R/W | PS写窗口,PL用ACP 从DDR读64个u32到这里 |
CTRL (slot0[0])
| Bit | 名称 | 说明 |
|---|---|---|
0 |
acq_en |
电平信号,1:使能采集 0:关闭采集 |
1 |
acq_done_flag |
采集完成中断,PS读取后自动清0 |
2 |
ctrl_valid |
写窗口数据控制有效,PS写入1后自动清0 |
3 |
mode |
0:GP模式 1:ACP模式 |
4 |
busy |
只读状态,PL正在搬运数据 |
5 |
acp_err |
只读状态,ACP读写响应错误 |
15~6 |
Reserved | 保留 |
31:16 |
acq_freq |
中断频率,单位Hz |
测试流程
- 初始化 GP 寄存器窗口:裸机 shell 执行
app_init_reg <x>,初始化slot0[1] ~ slot0[128]为n+x。 - 初始化 ACP DDR 映像窗口:裸机 shell 执行
app_init_ddr_reg <x>,初始化slot0_ddr[1] ~ slot0_ddr[128]为n+x。 - 启动 GP 周期采集:裸机 shell 执行
axi_test <freq_hz>,等价于mode=0, acq_en=1, acq_freq=freq_hz,命令本身不等待中断。 - 启动 ACP 周期采集:裸机 shell 执行
acp_test <freq_hz>,等价于mode=1, acq_en=1, acq_freq=freq_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_ddr1\~64,再写slot0[0].2=1通知 PL 拉回 DDR 写窗口到slot0[65] ~ slot0[128],不再修改 DDR 数据窗口。 - 查询统计:裸机 shell 执行
get_info,查看中断次数、中断间隔、响应次数和响应耗时。
用AtShell制作12个命令
| 序号 | 命令 (Command) | 描述 (Description) |
|---|---|---|
| 0 | help | 命令列表 |
| 1 | clean | 清屏 |
| 2 | read | GP 读 slot0 的129个 u32 |
| 3 | write | GP 写 slot0 |
| 4 | acp_read | 读 slot0_ddr |
| 5 | acp_write | 写 slot0_ddr |
| 6 | axi_test | GP loop测试 |
| 7 | acp_test | ACP loop 测试 |
| 8 | app_init_reg | 初始化 slot00\~128 |
| 9 | app_init_ddr_reg | 初始化 slot0_ddr0\~128 |
| 10 | stop | 停止,复位,清0 |
| 11 | get_info | 统计测试的信息 |
bash
$:0
AtShell commands:
0.help - list cmd
1.clean - clean screen
2.read - read reg
3.write - write reg
4.acp_read - acp read window
5.acp_write - acp write window
6.axi_test - axi reg loop
7.acp_test - acp ddr loop
8.app_init_reg - app_init_reg
9.app_init_ddr_reg - app_init_ddr_reg
10.stop - stop slot0 acq
11.get_info - slot0 irq info
$:11
mode=GP freq=0Hz irq_cnt=0 irq_interval_ns=0 irq_exec_ns=0 loop_cnt=0 loop_ns=0 ps_rd64_ns=0 ps_wr64_ns=0