把zynq的程序移植到fmql,因为软件不同(vivado与Procise;SDK与IAR),库函数不同,所以在移植过程中遇到些坑。记录下来,以便后续回看。
哪些可以用zynq的库函数,哪些没有用
zynq中用到了:
中断
UART、UART16550、sysmon、WDT、Timer、CAN、Lwip、SDFatfs、GPIO、flash读写
在尝试移植zynq库函数的过程中,遇到了很多没有解决的问题,所以放弃使用,转而使用fmql的库函数:
中断GIC、UART、WDT、Timer、CAN、Lwip、SDFatfs、flash
【fmql的WDT比zynq少,Timer也与zynq有差别】
【中断:GIC、exception.h都移植失败】
用zynq的库函数:
UART16550、GPIO、sysmon
总结
为什么有些可以用zynq的库函数,有些不可以?
比如WDT,在zynq中用的是ScuWDT,而fmql只有WDT,没有ScuWDT。Timer也是,fmql没有ScuTimer。
并且,fmql库函数中没有关于PL任何资源的库函数内容,比如sysmon,UART16550(至少目前新建的工程都没有自动生成),包括定义的bram_PL。
来看一下目前我用的工程的库函数对比:
可以看出来,zynq比fmql多。
库函数添加&修改
pl文件夹下libsrc文件夹中是zynq库函数的添加位置,但是具体有哪些模块的文件夹(自动生成),要根据.bd生成。也就是说,block design中没用到的,pl中也不会自动生成。
【所以后面需要添加其他功能时可能需要重新新建工程】
以上文件夹都是自动生成的,但是是需要什么生成什么(可能ps_a7也是,没太注意)
其中,bram、gpiops、sysmon、uartns550这几个文件夹移植了zynq的库函数。
其他头文件添加如下图所示:(文件内容有修改)
头文件修改
xil_types.h
添加了#include "fmsh_common_types.h"(因为有些定义重复了)
注释掉:
xparameter.h
//#include "xparameters_ps.h" 注释
#include "fmsh_ps_parameters.h" 添加
注释STDIN_BASEADDRESS与STDOUT_BASEADDRESS
IAR环境配置
如果有用到stdio.h,就要修改以下位置:
以下内容视需求而定:
修改.icf文件:
程序默认在AHB_SRAM中运行,但是Lwip程序内容占用比较大,所以要修改至DDR运行(在icf文件中修改)
程序移植注意事项
这也是自己遇到的坑。
Lwip以太网调试
只有Lwip工程会自动添加网口所需的头文件,其他如Helloworld、Empty就没有:
最开始用的是empty工程,手动添加文件夹把以上文件添加了,但是一直调不通。
后来尝试用Lwip工程,把用的串口等其他模块内容加进去,就可以了。
所以用到网口的话,一定要用生成以上文件夹的工程!!!
(网口的工程中,在初始化部分,已经有使能中断的内容,后续可以不用对中断进行初始化)
编译环境
最开始是在para.h文件中声明变量,在para.c中使用,然后main.h中include para.h
但是编译环境不支持这么做,会报duplicate definitions
仅支持这么做:
中断配置
中断这部分也卡了我很久。。
CAN用例程就可以(虽然例程是CAN0与CAN1的通信,但是CAN1的中断配置可以参考)
但是UART就调了很久。用官方的中断服务函数:
网口根据phy型号修改参数,自行修改中断函数内容(默认的传输是接收到什么数据就发送什么数据)
Timer的中断服务函数里要添加:
等待完善......