一、按照https://www.cnblogs.com/tsfh/p/9184621.html 安装Sdx IDE 2017.4一直到第5步;
二、但第5步时出现问题:
可以看到什么都没有输出,即使运行我生成好的./sdx_hello.elf依旧不会正常输出。/mnt下也没有看到挂载的SD卡,但SecureCRT却可以检测到SD卡,但并不是ttyusb0而是ttyacm0!!但去windows下面是可以跑起来的!!!!可是回ubuntu无论是用SecureCRT还是putty还是不行啊?!别人的都是ttyCOM0,我的是ttyACM0,是这个原因吗?
然后我试了官网的颜色空间转换的例子,在ubuntu下生成sd_card,拷到SD卡,然后去windows下跑起来:
至于ubuntu下SecureCRT或者putty下检测到这块板子却跑不起来的原因,目前没找到?
三,看ug1167 ug1235sdsoc-optimization-guide.pdf
ug1167文档中说:xfOpenCV是xilinx专门为opencv做的加速库,可以在Sdx中使用,也可以在Vivado HLS中使用。如果想仅仅进行算法仿真、综合得到性能报告或IP core,建议在HLS中使用xfOpenCV库。但xfOpenCV在HLS中使用有四个方面的限制,其中两个方面是:涉及内存映射的函数不行,比如xf::warpaffine();涉及多核集成的函数用不了,比如xf::canny()边缘检测。 如果想要产生bitstream,建议在Sdx中使用xfOpenCV。
ug1235文档我才看到第33页,文中主要围绕图像卷积这个例子给我们讲如何优化。看到“数据访问模式” 优化这一章,发现和以前搞OpenCL在写kernel之前做规划太像了,OpenCL是要合理调配工作组和工作项写出最大并行化的kernel协同完成kernel上的任务。其实Sdsoc上的优化跟这个好像。再次感受到知识之间是有关联的,并不存在那种完全独立于所有学科的知识,我觉得所有知识都是或多或少相互关联的。
四、在Sdx上跑一个xfOpenCV示例
本来想按照ug1233那样直接在Sdx ISE提供的xilinx---Sdx Library----install按钮下将xfOpenCV下载下来并跑示例的,但发现这个按钮下载不了。所以我自己手动去Xilinx的github上下载的xfOpenCV,然后将示例新建工程:
可以看到会提示下载的xfOpenCV里的头文件存在类型缩窄的限制,这是stdc++11引起的问题。在compiler后加上 -Wno-narrowing就可以了。接下来:
会报错说:lib/libjpeg.so:file not recognized:不可识别的文件。这是因为zcu102是64位,而zedboard是32位冲突导致,准备按照 :http://www.iot-online.com/IC/embedded/2017/101877484.html 这里所说将64位变成32位,同时OpenCV也要重新交叉编译为32的库:https://blog.csdn.net/luotuo44/article/details/8958990 在configure时候显示cmake error in configuration process,project files may be invalid! 也就是说交叉编译工具不是有效的,在终端查看是否到底有效: arm-linux-gcc -v 结果显示:未找到命令!所以难怪Cmake使用不了! 解决办法:https://blog.csdn.net/liaoxu02/article/details/52492122 https://blog.csdn.net/fulinus/article/details/8648384 除了在环境变量中添加, 还要在终端添加: export PATH=$PATH:/opt/Xilinx/usr/local/arm/4.3.2/bin 否则总是说未找到命令!!!!!而网上很多都只说在profile中添加实际不是的,超级用户的终端也要这样。然后就可以了:
接下来继续按照那个网址cmake结果后,在新的arm-opencv(自己取的名字)下进行make:出现第1个错误:
解决办法,在这个报错文件同级目录下新建一个config.h文件,内容是:
#ifndef _LINUX_CONFIG_H
#define _LINUX_CONFIG_H
#define HAVE_PTHREAD
#endif
然后让这个报错文件包含这个config.h文件即可。
继续编译出现第2个错误:原来是在cmake的configure时没有将 BUILD_ZLIB 勾选上,记得要勾选上哦!!!
接着会出现一些警告,警告不是错误我就没有管它们了:
接着出现第3个错误:
去这个报错的softfloat.hpp地方,将所有报错的地方的数字后面加上ULL,比如原来是0xfffffffff,那么就改成0xfffffffffULL。全部都这样修改。即可。
然后继续make,出现第4个错误:
我在想这个错误是因为cmake时BUILD_OPENCL默认勾选了吗?早知道就检查下不要勾选了。于是我又重来一遍cmake编译那里,并将所有与OPENCL相关的地方取消勾选!终于不再报上面那个错了,但是编译到43%时另一个地方报错了:在smooth.cpp里报:error: conversion from '<unnamed>::ufixedpoint32' to 'unsigned char' is ambiguous
发现arm-linux编译3.4.1这么费劲啊,网上都是编译的2.4.1这么低的版本。难怪没人搞高版本的!
对于这个问题,我看了别人也遇到了:
看网上编译成功的人都是编译很低版本的OpenCV,于是我准备换成OpenCV3.2.0.........
****************************************************************************************************************
*********************************************************************************************************************
去下载了OpenCV3.2.0按照上述步骤,报了一个错:
解决办法:将这个报错文件的语句的abs() 改成 fabs() 即可,继续编译出了第2个错误:
看起来像缺少什么库导致的。然而网上说的 CFLAGS=-march=i686这个解决不了。
最后实在是无奈烦死,改用了OpenCV3.0,然后依旧是报同样的错:perf_compare.cpp.obj:perf_compare.cpp.text._ZN34Size_MatType_CmpType_compareScalar12PerfTestBodyEv+0x3a0): more undefined references to `__sync_fetch_and_add_4' follow collect2: ld returned 1 exit status 实在解决不了这个问题。
于是换成OpenCV 2.4.13:编译通过!!!!!终于通过了!!!!!!
然后准备跑一个例子:
https://blog.csdn.net/luotuo44/article/details/8958990 但这个例子没跑起来,修改后也跑不起来:
醉了。。。。最后试了很多次,终于搞定了。
原来是要将编译好的arm-opencv下的lib的所有文件拷贝到arm/4.3.2/lib下面就可以了。我的测试文件是test_wd.cpp。现在已经不报错了,也生成了可执行文件。其中` 符号不是逗号,而是1 左边的那个符号。
这样应该就是表示 https://blog.csdn.net/humanplus/article/details/76417677 第7步完成了。然而我最后用Sdsoc创建xfOpenCV的膨胀的例子 dilation时 依旧编译出错:
没有生成sd_card,所以也无法去验证在开发板上是否可以跑起来xfOpenCV!!!????哎资料太少的东西果然累!!!!
终于知道原因了,OpenCV交叉编译时cmake第一项不应该填“arm-linux”而应该填写“linux”!!!
另外我换了2018.2版本的终于可以了:
这个下载按钮可以使用!!!!!
我换了2018.2版本后,可以跑HLS的例子:
但创建新工程时总是不行啊:
点击Next后,Finish按钮始终是灰色啊?!!!这是什么奇葩问题都被我遇上了,最近不顺啊!!!
我将xilinx的所有软件全部卸载了,全部重新装,现在终于正常了!!!!!!!没有什么奇葩事情是卸载解决不了的!但是新建HLS工程仿真时报了一个错:libOpenCL.so.1: cannot open shared object file: No such file or directory 解决办法:
apt-get install ocl-icd-opencl-dev
即可,再无问题。
我在米联客7035的板子上跑了一下Sdx的一个例子:(7035平台文件是我们老大搭建好的)
这是不是因为我没有格式化这个SD卡,另外我发现这个板子在ubuntu下也可以跑:
太好了,这样以后就不会2个系统过来过去了。
我待会儿格式化再试一次