1、程序执行中途停止
应该是由于编译器和指令执行顺序问题,导致后面的循环调度到前面来执行,使循环前面的部分语句执行不到就开始一个大循环,就好像无缘无故就中断了程序执行。所以尽量不要有过大的循环和死循环。
除了循环问题,写地址函数Xil_Out32()也会导致程序挂起。具体情况是:如果Block Design中使用的控制寄存器接口是AXI-Slave Full,这个接口使用axi_smc接到Zynq的AXI GP Master端口上,不论设置的地址位置在哪,好像都无法使用Xil_Out32()函数正确写入数据,并且导致PS端程序挂起在这里,一直等待写入完成,导致后续程序无法执行。
对照前面实现过的PS-PL间通讯Demo,可以发现就是AXI-Slave接口有所不同,导致其连接的AXI互联模块不同,Demo中是axi_periph,这里是axi_smc。并且Full端口在Address Editor中显示的Base Name是S00_AXI_mem,而不是Lite端口显示的S00_AXI_reg,怀疑是这里的问题。将这一模块重新配置为AXI-Slave Lite接口,并重新连接Zynq与这一端口,生成了与Demo中相同的AXI互联模块,重新使用SDK烧入比特流,写入PS端程序运行观察绑定的LED,发现可以正确写入,并且程序不再被堵塞。
这破问题卡了我2两天,也不知道为什么Xil_Out32()就是写不进去,明明DDR和Lite口的寄存器都写得没问题,关键是还不报错,程序就直接断在前面的某个地方,问题定位方式就是一句一句的注释看printf,跑一次还要20分钟,真心累。
2、运行报错找不到Xil_printf.h等
右键Project->Clean Project,解决问题。
3、DDR初始化方法
Vivado SDK的Dump/Restore Data File部分,可能是对DDR进行数据初始化的功能。但是我在实际使用的过程中,一是不知道这里的数据bin文件怎么写,二是找不到我连接的板子PS。
所以最后,我直接把数据写成一个数组,放到.h里,在主程序中调用.h,运行程序的时候.h中的数组就已经放在DDR里了。就是这样子编译和上板的速度非常慢,100M+数据大概编译10分钟,上板5分钟。
但是这样写DDR还有一些地址上的问题,后续Debug中会遇到。