由于项目中需要,所以尝试在zynq7020上移植cmsis_dsp库。在网上参考了其他大佬的移植过程,大多基于linux环境,遇到的问题与windows环境不一样。此次在windows下记录下移植过程,方便自己及其他有同样需求的人查阅。
芯片:ZYNQ7020
开发软件:Xilinx Vitis 2020.1
环境:windows
初次移植问题
初次移植参考下面这篇文章,该大佬是在linux环境下移植的,但步骤与windows环境基本一致。https://blog.youkuaiyun.com/leida_wt/article/details/133940593#comments_33440006
https://blog.youkuaiyun.com/leida_wt/article/details/133940593#comments_33440006 问题主要出现在最后的编译阶段,由于源码文件太多,windows环境下有命令行长度限制导致编译生成.elf文件失败,如下图所示: 
问题解决
这里提供一种使用cmake工具把CMSIS DSP库编译成静态链接库再在工程中引用的解决办法,本人已经测试能正常使用。在这里还要感谢xilinx中文论坛的技术支持人员对本人问题的耐心解答。
在CMSIS DSP库源码(Source)文件夹中已经提供了CMakeLists.txt。所以我们能很方便的使用cmake工具生成Makefile文件。
移植准备
1、下载CMSIS_DSP库源码。
2、添加CMSIS头文件依赖。从CMSIS下载CMSIS_5/CMSIS/Core_A /Include/路径下的头文件,拷贝到CMSIS_DSP库源码的Include目录下
2.在下载的CMSIS DSP文件目录下新建build文件夹,也可以建在其他地方,后续我们会把cmake生成的makefile文件放在该文件夹下 
3.下载并安装cmake
https://cmake.org/download/
https://cmake.org/download/
选择最新的版本并选择下图所示的文件下载,下载完成后就和正常的.exe应用一样安装
4.下载并安装GnuWin32 make.exe
make.exe下载地址: https://gnuwin32.sourceforge.net/packages/make.htm
https://gnuwin32.sourceforge.net/packages/make.htm 选择如下图所示的版本下载,该版本是不包含源码的安装版本

5.添加环境变量
添加gcc工具链路径至系统Path环境变量,该工具链我们可以在vitis软件目录下找到。
路径:Xilinx\Vitis\2020.1\gnu\aarch32\nt\gcc-arm-none-eabi\bin

添加上一步安装的GnuWin32路径到环境变量。
路径取决于你的安装位置:GnuWin32\bin

两个路径添加完毕后请重启电脑
生成静态链接库
1.新建zynq-none-toolchain.cmake文件,文件内容如下:
set(CMAKE_SYSTEM_NAME "Generic" CACHE STRING "")
set(CMAKE_SYSTEM_PROCESSOR "arm" CACHE STRING "")
SET(CMAKE_CROSSCOMPILING 1)
set(CMAKE_C_COMPILER_WORKS 1)
set(CMAKE_CXX_COMPILER_WORKS 1)
set(CROSS_PREFIX "arm-none-eabi-" CACHE STRING "")
set(CMAKE_C_FLAGS "-mcpu=cortex-a9 -mfpu=vfpv3 -mfloat-abi=hard" CACHE STRING "")
set(CMAKE_CXX_FLAGS "-mcpu=cortex-a9 -mfpu=vfpv3 -mfloat-abi=hard" CACHE STRING "")
include (CMakeForceCompiler)
set(CMAKE_ASM_COMPILER "${CROSS_PREFIX}as")
set(CMAKE_C_COMPILER "${CROSS_PREFIX}gcc")
set(CMAKE_CXX_COMPILER "${CROSS_PREFIX}g++")
set(CMAKE_LINKER "${CROSS_PREFIX}gcc")
set (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER CACHE STRING "")
set (CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER CACHE STRING "")
set (CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER CACHE STRING "")
set(CMAKE_NO_SYSTEM_FROM_IMPORTED ON)
如果需要使能neon请将
set(CMAKE_C_FLAGS "-mcpu=cortex-a9 -mfpu=vfpv3 -mfloat-abi=hard" CACHE STRING "")
set(CMAKE_CXX_FLAGS "-mcpu=cortex-a9 -mfpu=vfpv3 -mfloat-abi=hard" CACHE STRING "")
修改为
set(CMAKE_C_FLAGS "-mcpu=cortex-a9 -mfpu=neon-vfpv4 -mfloat-abi=hard" CACHE STRING "")
set(CMAKE_CXX_FLAGS "-mcpu=cortex-a9 -mfpu=neon-vfpv4 -mfloat-abi=hard" CACHE STRING "")
2.运行cmake gui
指定源码路径和生成文件存放路径:

点击Configure 设置编译工具链

选择上一步创建的zynq-none-toolchain.cmake文件

点击Finish后cmake gui的界面会显示如下信息,该信息根据zynq-none-toolchain.cmake和DSP源码中的CMakeLists.txt生成
点击Generate,成功在build文件夹中生成makefile文件

在build文件夹中能找到生成的makefile

3.使用make编译生成静态链接库
运行windows下的cmd命令行, cd到build 目录下 并make all 等待编译完成

如果编译全程没有出现错误,最后会在bulid文件夹生成静态链接库

把该静态链接库添加到工程中并添加DSP库中的头文件就能正常使用DSP库中的函数了。
Ps:在vitis工程中添加外部库时名字和路径不要搞错了

遗留问题
CMSIS_DSP库是支持NEON的,我在CMakeLists.txt中使能了NEON并修改了编译工具链,成功生成了静态链接库,但是进行FFT运算时间完全没有变化,具体哪里出现了问题还没找到。等后续有时间了再来研究一下,或者有成功使能neon的大佬能分享下方法。
4441

被折叠的 条评论
为什么被折叠?



