tag 标签: nxp

相关博文
  • 2021-4-27 09:15
    13 次阅读|
    0 个评论
    2021/04/23 “创龙首款NXP工业评估板,全新i.MX 8惊艳登场” 重磅!创龙科技(Tronlong)今日首次推出NXP工业评估板及核心板—— i.MX 8M Mini ,让大家久等了!! 图1| TLIMX8-EVM评估板正面 图2 | TLIMX8-EVM评估板侧面 (带壳) 图3 | SOM-TLIMX8核心板正面 图4 | SOM-TLIMX8核心板背面 1、 高性能 创龙科技i.MX 8系列产品基于 NXP i.MX 8M Mini 的 4核ARM Cortex-A53 + 单核ARM Cortex-M4多核 处理器设计,主频高达 1.6GHz 。 图5 |i.MX 8M Mini处理器功能框图 2、 工 业级核心板 SOM-TLIMX8是一款高端工业级核心板,通过邮票孔连接方式引出千兆网口、PCIe、USB 2.0、MIPI CSI、MIPI DSI等接口。支持1080P60 H.264视频硬件编解码、1080P60 H.265视频硬件解码。核心板经过专业的PCB Layout和高低温测试验证,稳定可靠,可满足各种工业应用环境。 用户使用核心板进行二次开发时,仅需专注上层运用,降低了开发难度和时间成本,可快速进行产品方案评估与技术预研。 图6 |核心板硬件框图 3、 接口资源丰富 TLIMX8-EVM评估板接口资源丰富,引出 MIPI CAMERA、MIPI/LVDS LCD、HDMI OUT、LINE IN/OUT、PCIe、FlexSPI、USB、RS485、RS232、千兆网口、百兆网口 等接口,板载WIFI模块,支持Mini-PCIe 4G模块,选配外壳直接应用于工业现场,方便用户快速进行产品方案评估与技术预研。 图7 |评估板硬件框图 图8 |评估板硬件资源图解1 图9 |评估板硬件资源图解2 4、 多媒体应用领域 i .MX 8系列以其出色的 视频编解码能力 ,广泛应用于 医疗设备、机器视觉、工业HMI 等领域。 图10 5、 开发资料齐全 创龙科技秉承“因我们的存在,让嵌入式应用更简单”的愿景,i.MX 8系列产品为用户提供丰富的软、硬件开发资料,包括: ( 1 )提供核心板引脚定义、可编辑底板原理图、可编辑底板 PCB 、芯片 Datasheet ,缩短硬件设计周期; ( 2 )提供系统固化镜像、内核驱动源码、文件系统源码,以及丰富的 Demo 程序; ( 3 )提供完整的平台开发包、入门教程,节省软件整理时间,上手容易; (4)提供详细的 ARM + FPGA 架构通信教程,完美解决异构多核开发瓶颈。 开发案例主要包括: •基于Linux 的应用开发案例 •基于ARM Cortex-M4 的裸机/FreeRTOS 开发案例 •基于ARM Cortex-A53 与 Cortex-M4 的核间 OpenAMP 通信开发案例 •基于FlexSPI 的 ARM 与 FPGA 通信开发案例 •基于PCIe 的 ARM 与 FPGA 通信开发案例 •基于H.264 的视频硬件编解码开发案例 •基于H.265 的视频硬件解码开发案例 •基于OpenCV 的图像处理开发案例 •Qt 开发案例
  • 热度 1
    2021-4-22 15:06
    294 次阅读|
    1 个评论
    By Toradex胡珊逢 Visual Studio Code在软件开发领域具有十分广泛的应用,其支持多种编程语言,丰富的插件极大得提高了开发效率,同时这也是一个非常开放的平台。本文接下来将介绍如何在Visual Studio Code中使用Yocto Project生成的Linux SDK,并针对Arm处理器进行C/C++应用交叉编译和调试。 首先使用 Yocto Project生成SDK ,我们这里以Apalis iMX8上的minimal console image为例,其对应的SDK为tdx-xwayland-glibc-x86_64-Reference-Minimal-Image-aarch64-apalis-imx8-toolchain-5.2.0.sh。直接运行该文件,将其安装到Linux电脑上,例如/home/ben/Toradex/LinuxDevelop/LinuxSDK/v5/arm64路径下。 然后参考 这里的说明 在Linux电脑上安装Visual Studio Code。在Extension中安装一些常用的插件,如C/C++,C++ Intellisense,Makefile Creator等。 Visual Studio Code并不像Visual Studio,后者集成了完整的代码编辑、编译和调试工具,Visual Studio Code则提供了相应的框架,根据具体使用的编程语言和用户习惯来实现对应的步骤或者任务。当然也有很多公司、组织或者个人提供现成的插件,这简化了配置任务。目前Visual Studio Code还没有现成的插件可以直接使用Yocto Project生成的Linux SDK,因此我们通过直接配置JSON文件,制定相应的编译和调试步骤。 vscode-tdxlinux 是配置好的例程,接下来我们将对其中配置进行说明,以及介绍使用方法。 下载上面的例程后,在文件夹中会有下面文件。 hello.c是一个演示代码,Makefile是编译规则文件,.vscode文件夹中四个json文件即用于配置Visual Studio Code。 c_cpp_properties.json env中包含一些自定义的变量,例如SDK版本,开发板名字,以及SDK根目录。可以用$符号对其引用,例如${env.sdkroot}引用SDK根目录。 configurations中是Visual Studio Code规定的一些设置。includePath包含项目编译用的头文件所在目录,这里包括SDK中文件系统里和gcc本身的头文件。browse是浏览头文件时可以查找的目录,常用于VS Code编写代码时用Go To Definition打开对应文件。defines预定义一些宏,__linux__:指定目标系统为Linux,__aarch64__:目标处理器为64bit Arm。intelliSenseMode将IntelliSense Mode映射到对应的平台和处理器构架,Apalis iMX8是64位处理器,所以这里选择linux-gcc-arm64。这里的配置还可以通过ctl+shift+p组合键盘选择UI方式来配置。 settings.json 这里定了一些变量,其他文件可以通过${config:var}来引用,例如${config:tdxlinuxsdk.sdkroot}。 tasks.json 这里配置了编译相关的任务。 env配置GCC编译工具,编译参数等,这部分内容来自SDK的environment-setup-aarch64-tdx-linux文件。 Run Build Task调用相关任务。 launch.json 这里配置调试方法。 嵌入式Linux通过使用gdb调试C/C++应用。在configurations中MIMode为gdb,miDebuggerPath为gdb所在目录,这是SDK中包含的软件。 customLaunchSetupCommands是gdb具体执行步骤。首先使用gdb的target remote extend-remote连接IP为192.168.20.91的目标设备即Apalis iMX8,端口为1234。第二步remote put将本地编译好的hello二进制文件上传到Apalis iMX8。最后在main函数处设置一个断点。通过上面设置,点击VS Code中的debug即可进入调试。上面的每个步骤同样可以根据项目或者用户习惯调整。下面我们将演示从编译到调试的流程。 按组合键ctrl+shift+b选择TdxLinux SDK Make. 编译完成后可以通过file命令查看hello程序的格式属性,ARM aarch64格式。 查看Apalis iMX8的IP地址。192.168.20.97也是launch.json中设置的IP。 在Apalis iMX8上运行gbdserver程序,侦听端口为1234。 在hello.c程序的printf函数设置一个断点。 点击VS Code中的调试按键。 点击step over进行单步调试。 在Apalis iMX8调试串口中可以看到执行结果。 总结 上面是VS Code交叉编译和调试的简单介绍,提供了Eclipse之外的另一种开发环境。用户可以重新调整配置文件,并配合其他插件如Makefile Creator实现个性化的IDE。 ​
  • 热度 3
    2021-3-11 14:23
    777 次阅读|
    1 个评论
    By Toradex秦海 1). 简介 随着嵌入式处理器性能的提升甚至一些嵌入式处理器已经开始集成针对人工智能和机器学习的硬件加速单元NPU,机器学习应用在嵌入式边缘设备的应用也慢慢展现。为此,NXP也发布了eIQ for i.MX软件工具包,用于在NXP的i.MX系列嵌入式处理器上面来支持目前比较常见的各种机器学习推理引擎,比如TensorFlow、Caffe等,具体的支持情况可以参考下图,其中ArmNN、TensorFlowLite、ONNX可以支持GPU/NPU硬件加速,而OpenCV和PyTorch目前只支持在CPU运行。 ​ NXP eIQ协议栈通过Neural Network Runtime (NNRT)模块来对不同的前端Runtime进行硬件加速支持,具体的架构可以参考下图,对于很多机器学习算法场景,通过硬件加速引擎可以很大提升算法推理性能。 ​ 本文的演示的平台来自于Toradex Apalis iMX8 ARM嵌入式平台,这是一个基于NXP iMX8QM ARM处理器,支持Cortex-A72+A53和Coretex-M4架构的计算机模块平台。 2). 准备 a). Apalis iMX8QM 4GB WB IT ARM核心版配合 Ioxra载板 ,连接调试串口UART1(载板X22)到开发主机方便调试。载板连接HDMI显示器。 3). Apalis iMX8 Ycoto Linux 编译部署以及配置 a). Apalis iMX8 Ycoto Linux通过Ycoto/Openembedded框架编译,具体的配置方法请参考 这里 ,参考如下修改后编译Reference-Multimedia image镜像 ./ iMX8 Ycoto layer中默认没有包含NXP Machine Learning和OpenCV 4.4.0版本支持,因此首先需要通过下面修改添加相关layer,详细的NXP Ycoto指南请参考i.MX Yocto Project User's Guide Rev. L5.4.70_2.3.0 ------------------------------- ### download related layers from NXP official repository $ repo init -u https://source.codeaurora.org/external/imx/imx-manifest -b imx-linux-zeus -m imx-5.4.70-2.3.0.xml $ repo sync $ DISTRO=fsl-imx-wayland MACHINE=imx8qmmek source imx-setup-release.sh -b build ### copy mechine learning layer meta-ml to Toradex ycoto environment $ cp -r …/sources/meta-imx/meta-ml …/oe-core/layers/ ### modify meta-ml layer …/layers/meta-ml/conf/layer.conf file to support ycoto dunfell --- a/layers/meta-ml/conf/layer.conf 2021-03-03 15:50:59.718815084 +0800 +++ b/layers/meta-ml/conf/layer.conf 2021-03-03 16:55:46.791158625 +0800 @@ -8,4 +8,4 @@ BBFILE_COLLECTIONS += "meta-ml" BBFILE_PATTERN_meta-ml := "^${LAYERDIR}/" BBFILE_PRIORITY_meta-ml = "8" -LAYERSERIES_COMPAT_meta-ml = "warrior zeus" +LAYERSERIES_COMPAT_meta-ml = "warrior zeus dunfell" ### copy opencv 4.4.0 related to Toradex ycoto environment $ cp -r …/sources/meta-imx/meta-bsp/recipes-support/opencv/ …/oe-core/layers/meta-toradex-nxp/recipes-support/opencv/ ### modify build/conf/bblayer.conf to add above extra layers --- a/build/conf/bblayers.conf +++ b/build/conf/bblayers.conf @@ -24,6 +24,9 @@ ${TOPDIR}/../layers/meta-openembedded/meta-python \ ${TOPDIR}/../layers/meta-freescale-distro \ ${TOPDIR}/../layers/meta-toradex-demos \ + ${TOPDIR}/../layers/meta-ml \ ${TOPDIR}/../layers/meta-qt5 \ \ \ ------------------------------- ./修改local.conf,增加mechine learning相关支持 ------------------------------- ### add python and opencv support ### +IMAGE_INSTALL_append = " python3 python3-pip opencv python3-opencv python3-pillow" ### add eIQ support ### +IMAGE_INSTALL_append = " arm-compute-library nn-imx tensorflow-lite armnn onnxruntime" +PACKAGECONFIG_append_pn-opencv_mx8 = " dnn jasper qt5 test" ### remove opencl conflict ### +PACKAGECONFIG_remove_pn-opencv_mx8 = "opencl" +PACKAGECONFIG_remove_pn-arm-compute-library = "opencl" ### option, add onnxruntime and armnn dev support to SDK ### +TOOLCHAIN_TARGET_TASK_append += " onnxruntime-dev armnn-dev " ACCEPT_FSL_EULA = "1" ------------------------------- ./编译image和SDK ------------------------------- # compile Reference-Multimedia image $ bitbake bitbake tdx-reference-multimedia-image # compile SDK bitbake tdx-reference-multimedia-image -c populate_sdk ------------------------------- b). Ycoto Linux image部署 参考 这里 通过Toradex Easy installer将上面编译好的image更新部署到模块,目前最新稳定版本为Ycoto Linux V5.1,最新测试版本为Ycoto Linux V5.2 4). TensorFlow Lite 测试 a). NXP iMX8 eIQ TensorFlow Lite支持特性和协议栈框图如下 ./ TensorFlow Lite v2.3.1 ./ Multithreaded computation with acceleration using Arm Neon SIMD instructions on Cortex-A cores ./ Parallel computation using GPU/NPU hardware acceleration (on shader or convolution units) ./ C++ and Python API (supported Python version 3) ./ Per-tensor and Per-channel quantized models support ​ b).示例应用测试 ./ Image预装的TensorFlow Lite测试示例应用位置 /usr/bin/tensorflow-lite-2.3.1/examples ./基于mobilenet model测试“label_image”示例应用 ------------------------------- $ cd /usr/bin/tensorflow-lite-2.3.1/examples/ ### Run on CPU $ ./label_image -m mobilenet_v1_1.0_224_quant.tflite -i grace_hopper.bmp -l labels.txt Loaded model mobilenet_v1_1.0_224_quant.tflite resolved reporter invoked average time: 44.999 ms 0.780392: 653 military uniform 0.105882: 907 Windsor tie 0.0156863: 458 bow tie 0.0117647: 466 bulletproof vest 0.00784314: 835 suit ### Run with GPU acceleration $ ./label_image -m mobilenet_v1_1.0_224_quant.tflite -i grace_hopper.bmp -l labels.txt -a 1 Loaded model mobilenet_v1_1.0_224_quant.tflite resolved reporter INFO: Created TensorFlow Lite delegate for NNAPI. Applied NNAPI delegate. invoked average time: 13.103 ms 0.784314: 653 military uniform 0.105882: 907 Windsor tie 0.0156863: 458 bow tie 0.0117647: 466 bulletproof vest 0.00784314: 668 mortarboard ### TensorFlow Lite Python API predefined example script run, no option to choose CPU or GPU, run with GPU acceleration by default if libneuralnetworks.so or libneuralnetworks.so.1 is found in the /usr/lib directory, otherwise run on CPU $ python3 label_image.py INFO: Created TensorFlow Lite delegate for NNAPI. Applied NNAPI delegate. Warm-up time: 5052.5 ms Inference time: 12.7 ms 0.674510: military uniform 0.129412: Windsor tie 0.039216: bow tie 0.027451: mortarboard 0.019608: bulletproof vest ------------------------------- c).更多示例和benchmark测试,C++ API应用开发以及当前eIQ对于TensorFlow Lite不同模型的限制等更多信息可以参考NXP i.MX Machine Learning User's Guide Rev. L5.4.70_2.3.0 Chapter 3 TensorFlow Lite,从上面简单测试可以看出NPU加速下mobilenet模型要比CPU运行性能更好。 5). Arm Compute Library 测试 a). ACL(ARM-Compute Library)是专为ARM CPU & GPU优化设计的计算机视觉和机器学习库,基于NEON & OpenCL支持的SIMD技术,但在iMX8平台目前只支持CPU NEON加速,另外因为其为ARM NN架构的计算引擎,因此一般来说建议直接使用ARM NN。NXP iMX8 eIQ ACL支持特性如下 ./ Arm Compute Library 20.02.01 ./ Multithreaded computation with acceleration using Arm Neon SIMD instructions on Cortex-A cores ./ C++ API only ./ Low-level control over computation b).示例应用测试 ./ Image预装的ACL测试示例应用位置 /usr/share/arm-compute-library/build/examples ./ MobileNet v2 DNN model,随机输入量测试 ------------------------------- $ cd /usr/share/arm-compute-library/build/examples $ ./graph_mobilenet_v2 Threads : 1 Target : NEON Data type : F32 Data layout : NHWC Tuner enabled? : false Cache enabled? : false Tuner mode : Normal Tuner file : Fast math enabled? : false Test passed ------------------------------- c).更多示例测试和参数说明可以参考NXP i.MX Machine Learning User's Guide Rev. L5.4.70_2.3.0 Chapter 4 Arm Compute Library。 6). Arm NN 测试 a). Arm NN是适用于CPU,GPU和NPU的开源推理引擎,该软件桥接了现有神经网络框架(例如TensorFlow、TensorFlow Lite、Caffe或ONNX)与在嵌入式Linux平台上运行的底层处理硬件(例如CPU、GPU或NPU)。这样,开发人员能够继续使用他们首选的框架和工具,经Arm NN无缝转换结果后可在底层平台上运行,NXP iMX8 eIQ ARM NN支持特性和协议栈框图如下 ./ Arm NN 20.02.01 ./ Multithreaded computation with acceleration using Arm Neon SIMD instructions on Cortex-A cores provided by the ACL Neon backend ./ Parallel computation using GPU/NPU hardware acceleration (on shader or convolution units) provided by the VSI NPU backend ./ C++ and Python API (supported Python version 3) ./ Supports multiple input formats (TensorFlow, TensorFlow Lite, Caffe, ONNX) ./ Off-line tools for serialization, deserialization, and quantization (must be built from source) ​ b). Apalis iMX8 $Home目录下创建如下测试使用目录以供后续测试使用 ------------------------------- $ mkdir ArmnnTests $ cd ArmnnTests $ mkdir data $ mkdir models ------------------------------- c). Caffe示例应用测试 ./ Image包含如下ARM NN Caffe模型测试示例,本文随机选择CaffeAlexNet-Armnn进行测试 /usr/bin/CaffeAlexNet-Armnn /usr/bin/CaffeCifar10AcrossChannels-Armnn /usr/bin/CaffeInception_BN-Armnn /usr/bin/CaffeMnist-Armnn /usr/bin/CaffeResNet-Armnn /usr/bin/CaffeVGG-Armnn /usr/bin/CaffeYolo-Armnn ./部署模型和输入数据文件到模块 ------------------------------- ###从 这里 下载,bvlc_alexnet_1.caffemodel模型文件,部署到Apalis iMX8 ~/ArmnnTests/models;shark.jpg输入文件,部署到Apalis iMX8 ~/ArmnnTests/data $ cd ArmnnTests ### Run with C++ backend, CPU without NEON $ CaffeAlexNet-Armnn --data-dir=data --model-dir=models --compute=CpuRef Info: ArmNN v20200200 Info: = Prediction values for test #0 Info: Top(1) prediction is 2 with value: 0.706227 Info: Top(2) prediction is 0 with value: 1.26575e-05 Info: Total time for 1 test cases: 15.842 seconds Info: Average time per test case: 15841.653 ms Info: Overall accuracy: 1.000 ### Run with ACL NEON backend, CPU with NEON $ CaffeAlexNet-Armnn --data-dir=data --model-dir=models --compute=CpuAcc Info: ArmNN v20200200 Info: = Prediction values for test #0 Info: Top(1) prediction is 2 with value: 0.706226 Info: Top(2) prediction is 0 with value: 1.26573e-05 Info: Total time for 1 test cases: 0.237 seconds Info: Average time per test case: 236.571 ms Info: Overall accuracy: 1.000 ### Run with GPU/NPU backend $ CaffeAlexNet-Armnn --data-dir=data --model-dir=models --compute=VsiNpu Info: ArmNN v20200200 , size = 618348Warn-Start NN executionInfo: = Prediction values for test #0 Info: Top(1) prediction is 2 with value: 0.706227 Info: Top(2) prediction is 0 with value: 1.26573e-05 Info: Total time for 1 test cases: 0.304 seconds Info: Average time per test case: 304.270 ms Info: Overall accuracy: 1.000 ------------------------------- d). TensorFlow示例应用测试 ./ Image包含如下ARM NN TensorFlow模型测试示例,本文随机选择TfInceptionV3-Armnn进行测试 /usr/bin/TfCifar10-Armnn /usr/bin/TfInceptionV3-Armnn /usr/bin/TfMnist-Armnn /usr/bin/TfMobileNet-Armnn /usr/bin/TfResNext-Armnn ./部署模型和输入数据文件到模块 ------------------------------- ###从 这里 下载,inception_v3_2016_08_28_frozen.pb模型文件,部署到Apalis iMX8 ~/ArmnnTests/models;shark.jpg, Dog.jpg, Cat.jpg输入文件,部署到Apalis iMX8 ~/ArmnnTests/data $ cd ArmnnTests ### Run with C++ backend, CPU without NEON $ TfInceptionV3-Armnn --data-dir=data --model-dir=models --compute=CpuRef Info: ArmNN v20200200 Info: = Prediction values for test #0 Info: Top(1) prediction is 208 with value: 0.454895 Info: Top(2) prediction is 160 with value: 0.00278846 Info: Top(3) prediction is 131 with value: 0.000483914 Info: Top(4) prediction is 56 with value: 0.000304587 Info: Top(5) prediction is 27 with value: 0.000220489 Info: = Prediction values for test #1 Info: Top(1) prediction is 283 with value: 0.481285 Info: Top(2) prediction is 282 with value: 0.268979 Info: Top(3) prediction is 151 with value: 0.000375892 Info: Top(4) prediction is 24 with value: 0.00036751 Info: Top(5) prediction is 13 with value: 0.000330214 Info: = Prediction values for test #2 Info: Top(1) prediction is 3 with value: 0.986568 Info: Top(2) prediction is 0 with value: 1.51615e-05 Info: Total time for 3 test cases: 1477.627 seconds Info: Average time per test case: 492542.205 ms Info: Overall accuracy: 1.000 ### Run with ACL NEON backend, CPU with NEON $ TfInceptionV3-Armnn --data-dir=data --model-dir=models --compute=CpuAcc Info: ArmNN v20200200 Info: = Prediction values for test #0 Info: Top(1) prediction is 208 with value: 0.454888 Info: Top(2) prediction is 160 with value: 0.00278851 Info: Top(3) prediction is 131 with value: 0.00048392 Info: Top(4) prediction is 56 with value: 0.000304589 Info: Top(5) prediction is 27 with value: 0.000220489 Info: = Prediction values for test #1 Info: Top(1) prediction is 283 with value: 0.481286 Info: Top(2) prediction is 282 with value: 0.268977 Info: Top(3) prediction is 151 with value: 0.000375891 Info: Top(4) prediction is 24 with value: 0.000367506 Info: Top(5) prediction is 13 with value: 0.000330212 Info: = Prediction values for test #2 Info: Top(1) prediction is 3 with value: 0.98657 Info: Top(2) prediction is 0 with value: 1.51611e-05 Info: Total time for 3 test cases: 4.541 seconds Info: Average time per test case: 1513.509 ms Info: Overall accuracy: 1.000 ### Run with GPU/NPU backend $ TfInceptionV3-Armnn --data-dir=data --model-dir=models --compute=VsiNpu Info: ArmNN v20200200 , size = 1072812Warn-Start NN executionInfo: = Prediction values for test #0 Info: Top(1) prediction is 208 with value: 0.454892 Info: Top(2) prediction is 160 with value: 0.00278848 Info: Top(3) prediction is 131 with value: 0.000483917 Info: Top(4) prediction is 56 with value: 0.000304589 Info: Top(5) prediction is 27 with value: 0.00022049 Warn-Start NN executionInfo: = Prediction values for test #1 Info: Top(1) prediction is 283 with value: 0.481285 Info: Top(2) prediction is 282 with value: 0.268977 Info: Top(3) prediction is 151 with value: 0.000375891 Info: Top(4) prediction is 24 with value: 0.000367508 Info: Top(5) prediction is 13 with value: 0.000330214 Warn-Start NN executionInfo: = Prediction values for test #2 Info: Top(1) prediction is 3 with value: 0.986568 Info: Top(2) prediction is 0 with value: 1.51615e-05 Info: Total time for 3 test cases: 5.617 seconds Info: Average time per test case: 1872.355 ms Info: Overall accuracy: 1.000 ------------------------------- e). ONNX示例应用测试 ./ Image包含如下ARM NN ONNX模型测试示例,本文随机选择OnnxMobileNet-Armnn进行测试 /usr/bin/OnnxMnist-Armnn /usr/bin/OnnxMobileNet-Armnn ./部署模型和输入数据文件到模块 ------------------------------- ###从 这里 下载,mobilenetv2-1.0.onnx模型文件,部署到Apalis iMX8 ~/ArmnnTests/models;shark.jpg, Dog.jpg, Cat.jpg输入文件,部署到Apalis iMX8 ~/ArmnnTests/data $ cd ArmnnTests ### Run with C++ backend, CPU without NEON $ OnnxMobileNet-Armnn --data-dir=data --model-dir=models --compute=CpuRef Info: ArmNN v20200200 Info: = Prediction values for test #0 Info: Top(1) prediction is 208 with value: 17.1507 Info: Top(2) prediction is 207 with value: 15.3666 Info: Top(3) prediction is 159 with value: 11.0918 Info: Top(4) prediction is 151 with value: 5.26187 Info: Top(5) prediction is 112 with value: 4.09802 Info: = Prediction values for test #1 Info: Top(1) prediction is 281 with value: 13.6938 Info: Top(2) prediction is 43 with value: 6.8851 Info: Top(3) prediction is 39 with value: 6.33825 Info: Top(4) prediction is 24 with value: 5.8566 Info: Top(5) prediction is 8 with value: 3.78032 Info: = Prediction values for test #2 Info: Top(1) prediction is 2 with value: 22.6968 Info: Top(2) prediction is 0 with value: 5.99574 Info: Total time for 3 test cases: 163.569 seconds Info: Average time per test case: 54523.023 ms Info: Overall accuracy: 1.000 ### Run with ACL NEON backend, CPU with NEON $ OnnxMobileNet-Armnn --data-dir=data --model-dir=models --compute=CpuAcc Info: ArmNN v20200200 Info: = Prediction values for test #0 Info: Top(1) prediction is 208 with value: 17.1507 Info: Top(2) prediction is 207 with value: 15.3666 Info: Top(3) prediction is 159 with value: 11.0918 Info: Top(4) prediction is 151 with value: 5.26187 Info: Top(5) prediction is 112 with value: 4.09802 Info: = Prediction values for test #1 Info: Top(1) prediction is 281 with value: 13.6938 Info: Top(2) prediction is 43 with value: 6.88511 Info: Top(3) prediction is 39 with value: 6.33825 Info: Top(4) prediction is 24 with value: 5.8566 Info: Top(5) prediction is 8 with value: 3.78032 Info: = Prediction values for test #2 Info: Top(1) prediction is 2 with value: 22.6968 Info: Top(2) prediction is 0 with value: 5.99574 Info: Total time for 3 test cases: 1.222 seconds Info: Average time per test case: 407.494 ms Info: Overall accuracy: 1.000 ### Run with GPU/NPU backend $ OnnxMobileNet-Armnn --data-dir=data --model-dir=models --compute=VsiNpu Info: ArmNN v20200200 , size = 602112Warn-Start NN executionInfo: = Prediction values for test #0 Info: Top(1) prediction is 208 with value: 8.0422 Info: Top(2) prediction is 207 with value: 7.98566 Info: Top(3) prediction is 159 with value: 6.76481 Info: Top(4) prediction is 151 with value: 4.16534 Info: Top(5) prediction is 60 with value: 2.40269 Warn-Start NN executionInfo: = Prediction values for test #1 Info: Top(1) prediction is 287 with value: 5.98563 Info: Top(2) prediction is 24 with value: 5.49244 Info: Top(3) prediction is 8 with value: 2.24259 Info: Top(4) prediction is 7 with value: 1.36127 Info: Top(5) prediction is 5 with value: -1.69145 Error: Prediction for test case 1 (287) is incorrect (should be 281) Warn-Start NN executionInfo: = Prediction values for test #2 Info: Top(1) prediction is 2 with value: 11.099 Info: Top(2) prediction is 0 with value: 3.42508 Info: Total time for 3 test cases: 0.258 seconds Info: Average time per test case: 86.134 ms Error: One or more test cases failed ------------------------------- f).除了上述推理引擎前端,TensorFlow Lite也是支持的,更多示例测试和参数说明以及ARMNN C++ API/Python API开发流程可以参考NXP i.MX Machine Learning User's Guide Rev. L5.4.70_2.3.0 Chapter 5 Arm NN。 7). ONNX 测试 a). ONNX也是一款开源的机器学习推理引擎,NXP iMX8 eIQ ONNX支持特性和协议栈框图如下 ./ ONNX Runtime 1.1.2 ./ Multithreaded computation with acceleration using Arm Neon SIMD instructions on Cortex-A cores provided by the ACL and Arm NN execution providers ./ Parallel computation using GPU/NPU hardware acceleration (on shader or convolution units) provided by the VSI NPU execution provider ./ C++ and Python API (supported Python version 3) ​ b).示例应用测试 ./ ONNX Runtime提供了一个onnx_test_runner(BSP以及预装于/usr/bin)用于运行ONNX model zoo提供的测试模型,下面几个模型是在iMX8 eIQ测试过的模型 MobileNet v2, ResNet50 v2, ResNet50 v1, SSD Mobilenet v1, Yolo v3 ./ MobileNet v2模型测试 ------------------------------- ###从这里下载模型文件压缩包,然后在Apalis iMX8设备上$Home目录解压出文件夹mobilenetv2-7 $ cd /home/root/ ### Run with ARMNN backend with CPU NEON $ onnx_test_runner -j 1 -c 1 -r 1 -e armnn ./mobilenetv2-7/ … Test mobilenetv2-7 finished in 0.907 seconds, t result: Models: 1 Total test cases: 3 Succeeded: 3 Not implemented: 0 Failed: 0 Stats by Operator type: Not implemented(0): Failed: Failed Test Cases: ### Run with ACL backend with CPU NEON $ onnx_test_runner -j 1 -c 1 -r 1 -e acl ./mobilenetv2-7/ … Test mobilenetv2-7 finished in 0.606 seconds, t result: Models: 1 Total test cases: 3 Succeeded: 3 Not implemented: 0 Failed: 0 Stats by Operator type: Not implemented(0): Failed: Failed Test Cases: ### Run with GPU/NPU backend $ onnx_test_runner -j 1 -c 1 -r 1 -e vsi_npu ./mobilenetv2-7/ … Test mobilenetv2-7 finished in 0.446 seconds, t result: Models: 1 Total test cases: 3 Succeeded: 3 Not implemented: 0 Failed: 0 Stats by Operator type: Not implemented(0): Failed: Failed Test Cases: ------------------------------- c).更多示例测试和参数说明以及C++ API可以参考NXP i.MX Machine Learning User's Guide Rev. L5.4.70_2.3.0 Chapter 6 ONNX Runtime。 8). OpenCV 测试 a). OpenCV是大家熟知的一款开源的传统机器视觉库,它包含一个ML模块可以提供传统的机器学习算法,可以支持神经网络推理(DNN模型)和传统机器学习算法(ML模型),NXP iMX8 eIQ OpenCV支持特性如下 ./ OpenCV 4.4.0 ./ C++ and Python API (supported Python version 3) ./ Only CPU computation is supported ./ Input image or live camera (webcam) is supported b).示例应用测试 ./ BSP预装OpenCV测试模型数据如下 DNN示例应用- /usr/share/OpenCV/samples/bin 输入数据、模型配置文件- /usr/share/opencv4/testdata/dnn ./Image classification DNN示例应用测试 ------------------------------- ###从 这里 下载,模型文件squeezenet_v1.1.caffemodel和配置文件model.yml复制到/usr/share/OpenCV/samples/bin ###复制数据文件到执行目录 $ cp /usr/share/opencv4/testdata/dnn/dog416.png /usr/share/OpenCV/samples/bin/ $ cp /usr/share/opencv4/testdata/dnn/squeezenet_v1.1.prototxt/usr/share/OpenCV/samples/bin/ $ cp /usr/share/OpenCV/samples/data/dnn/classification_classes_ILSVRC2012.txt /usr/share/OpenCV/samples/bin/ $ cd /usr/share/OpenCV/samples/bin/ ### Run with default image $ ./example_dnn_classification --input=dog416.png --zoo=models.yml squeezenet ​ ### Run with actual camera(/dev/video2) input ./example_dnn_classification --device=2 --zoo=models.yml squeezenet ​ ------------------------------- c).更多示例测试和说明可以参考NXP i.MX Machine Learning User's Guide Rev. L5.4.70_2.3.0 Chapter 8 OpenCV machine learning demos。 9). 总结 本文基于NXP eIQ机器学习工具库在iMX8嵌入式平台简单演示了多种机器学习推理引擎示例应用,并简单对比了CPU NEON和GPU进行模型推理的性能表现,实际进行相关应用开发的时候还会遇到很多学习模型到实际推理模型转换的问题,本文就不做涉及。 参考文献 i.MX Machine Learning User's Guide Rev. L5.4.70_2.3.0 i.MX Yocto Project User's Guide Rev. L5.4.70_2.3.0 https://developer.toradex.cn/knowledge-base/board-support-package/openembedded-core
  • 热度 3
    2020-12-25 17:38
    812 次阅读|
    1 个评论
    ​By Toradex胡珊逢 CAN总线在工业、汽车行业具有非常广泛的应用,为网络中设备之间点对点通信提供一种可靠、稳定、经济的方案。伴随网络中设备节点的增加,由于1Mbps速率和最长数据8字节的限制,通信效率和总线占用问题变得愈发突出。而CAN FD正是为了应对这种挑战而出现。文章接下来将介绍CAN FD的一些新特点以及使用注意事项,最后将使用Toradex Apalis iMX8QM和Verdin iMX8M Mini计算机模块简单演示CAN FD使用。 相比于传统CAN协议,CAN FD最大的两个特点是采用可变速率和单帧最长64字节数据,另外包括控制位和CRC校验的变化。 ​ 图1:传统CAN和CAN FD帧 控制位的首位由传统CAN的RTR变为CAN FD的RRS,该位始终是显性(0)。第三个控制位在传统CAN中属于保留功能,在CAN FD位FDF,位隐性(1)。FDF位1时表示该帧是CAN FD格式。在CAN FD中紧随FDF还是一个保留功能,用于将来的扩展。BRS(Bit Rate Switch)位允许CAN FD帧以不同的速率进行传输。如果BRS为显性(0)则该帧采用和仲裁阶段(Arbitration Phase)同样的速率进行传输,既速率不发生变化。当BRS为隐性(1),该帧接下来的部分将以较高的速率传输。这里需要注意,并不是整个CAN FD帧都用高速率传输,如下图,Data Phase从BRS后的ESI位开始到CRC Delimiter位结束,该阶段的数据会以较高的速率传输。 ​ 图2:CAN FD帧结构 ESI(Error Status Indicator)通常为显性(0)。当发送方遇到通讯异常后会将其置为隐性(1)。DLC表示该帧中实际数据长度,为了于传统CAN兼容,DLC仍然采用4bit。当数据长度小于8字节时,DLC位的数值可以直接表示数据长度,但超过8字节时,由于4个位最高只能表示15,为了支持CAN FD最长64字节数据,这里采用了折中的表示方法。当数据不超过8个字节时,DLC仍直接表示数据长度。当超过8个字节,只支持12到64中部分长度的数据包,而非全部的9到64任一长度。如下表所示,当DLC为9时,CAN FD数据长度为12字节,DLC为12时,数据长度是24字节。 DLC和数据长度对应关系 DLC 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 数据长度 0 1 2 3 4 5 6 7 8 12 16 20 24 32 48 64 在实际应用中最好选择上面的其中一种长度,避免通讯效率降低。如果小于某一种长度,则需要对数据进行填充,可以用0xCC和0x55作为填充字节,这样能够在总线上产生足够的波形翻转从而使CAN节点保持同步。 在CAN FD中根据数据长度会采用不同的CRC校验方案,当小于等于16字节是为CRC-17,当数据大于16字节后则采用CRC-21。CRC Delimiter之后的格式CAN FD和传统CAN仍保持一致。 CAN FD虽然具有更长的数据包以及更快的传输速度,但是由于引入了更多的位到帧中,帧的开销也会增加。以同样发送1字节数据包为例,传统CAN 2.0标准帧和CAN FD标准帧具体组成如上方图1所示。传统CAN 2.0标准帧总共位54 bit,CAN FD为70 bit。CAN FD需要多消耗16 bit来传送同样的数据。如果CAN FD不采用更高的可变速率这就意味着同样的帧,CAN FD反而会要更长的传输时间。当CAN FD采用可变速率,那么情况将会变得不一样。假设CAN FD的仲裁速率是500 Kbps,和传统CAN的速率一致,而可变的数据传输速率提高8倍到4 Mbps。传统CAN耗时为54 bit/ 500 Kbps = 108 us。CAN FD中4 Mbps的速率只用于传输从ESI位开始到CRC Delimiter位之间的数据,所以CAN FD耗时为29 bit/500 Kbps + 41 bit/4 Mbps = 68 us。这里我们看到,在提高数据传输速率情况下,CAN FD即使有更多的帧开销,帧传输时间还是减少了40 us。更高的传输速度有利于发送节点更快得完成帧发送,减少CAN总线占用时间,这对越长数据的帧会更加明显,对CAN网络的实时性来讲是一个优势。 然而提高传输速率不仅仅是在使用的时候设置一个参数,更重要的是保障CAN总线物理链路层的质量。可以使用示波器观察总线上信号的质量。如果信号陡峭且清晰,可以尝试将数据传输速率提高到仲裁速率的2到4倍。测量点需要遍布总线上多个位置,信号在不同位置会有所差异。线路阻抗的一致性对信号质量至关重要。通常在总线交叉点的线缆没有发生物理尺寸变化,并采用具有相同介电常数的隔离器,阻抗会保持不变。这可以参考以太网和USB中使用的专门的连接器。当CAN FD采用较高的传输速率时,每处线路分叉,每个连接器都可能会影响阻抗,从而引起信号反射。这些反射信号的能量最终可以影响CAN帧每个比特位边缘的抖动。 CAN FD最长64字节的数据包使用在实际应用中也需要注意。更长的帧不可避免在传输的时候会占用总线更多的时间,而这期间其他CAN节点则无法发送数据。对于实时性需求不高的场合,如通过CAN总线升级固件,长帧能够以更小的开销完成传输。而对实时性有要求的场合,对长帧的使用需要有一定的限制。对于8字节以下的帧,CAN FD更高的数据传输速率可以有效降低总线占用时间,前提是物理链路层能够满足高速传输的要求。 对于应用开发CAN FD的使用是非常简单的。CAN FD是可以兼容传统CAN,这意味着原先基于传统CAN通信的代码可以直接运行在支持CAN FD的设备上,但不使用任何CAN FD的新功能。如果需要使用CAN FD的可变数据速率或者超过8字节数据的帧,那么代码也只需做简单的修改。我们以Linux中SocketCAN为例,使用can-utils代码进行说明。在cansend.c和candump.c中采用canfd_frame结构体来存放需要发送和接收的CAN数据。CANFD_MAX_DLEN为64,对应CAN FD最长的64字节。 ​ 然后将can socket设置CAN FD格式,使用setsockopt()函数,设置CAN_RAW_FD_FRAMES参数即可。 ​ 在发送时将struct canfd_frame frame结构体中len长度参数设置CAN FD定义几种长度。 ​ 剩余代码中的操作可以沿用传统CAN模式下的方法。最后用下面命令配置CAN设备。这里仲裁速率为500Kbps,CAN FD可变数据速率为1Mbps,在结尾添加fd on参数启用CAN FD。 ​ 接下来我们将在Apalis iMX8QM和Verdin iMX8M Mini计算机模块上演示CAN FD通信。Apalis iMX8QM 采用NXP i.MX8 QuadMax处理器,可以提供3路CAN接口。Verdin iMX8M Mini上的i.MX8 M Mini处理器本身并不支持CAN接口,我们在模块上添加了一块MCP2518实现CAN接口。 ​ Apalis iMX8QM和Verdin iMX8M Mini分别通过Ixora和Dahlia载板进行CAN接口互联。这两个底板上均引出了CAN接口,方便用户测试。 ​ Verdin iMX8M Mini作为发送端,依次运行下面命令,并发送4字节和10字节长度的帧。 ​ Apalis iMX8QM作为接收端。 ​ 上面测试可以看到Verdin iMX8M Mini发送一帧10字节长度的数据,但是Apalis iMX8QM在收到了12字节的数据。这是CAN FD定义没有10字节的帧长,适合发送10字节的是12字节长度的帧。所以看到实际收到的是“11 22 33 44 55 66 77 88 99 00 00 00”这12个字节,最后两个“00 00”是填充的数据。这部分填充数据来自lib.c代码 memset(cf, 0, sizeof(*cf)); /* init CAN FD frame, e.g. LEN = 0 */ 总结 CAN FD的新功能为满足了应用对更加高效的传输、更好实时性需求,但充分发挥这些功能还需要从应用开发到链路设计方面的优化。上面我们讨论简单地讨论一些注意事项,以及使用方法,具体的应用还要结合实际工况做调整。 参考: https://www.microcontrol.net/en/know-how/bus-systems/can-fd/ https://www.picoauto.com/library/picoscope/can-bus-serial-protocol-decoding https://www.can-cia.org/can-knowledge/can/can-fd/#:~:text=CAN%20FD%20data%20frames%20with,support%20remotely%20requested%20data%20frames.&text=The%20control%20field%20comprises%20additional,the%20Classical%20CAN%20data%20frames. https://www.eecs.umich.edu/courses/eecs461/doc/CAN_notes.pdf https://en.wikipedia.org/wiki/CAN_FD https://www.kvaser.com/wp-content/uploads/2016/04/can-fd-considerations-for-different-stakeholders.pdf https://www.kvaser.com/wp-content/uploads/2016/10/comparing-can-fd-with-classical-can.pdf
  • 热度 10
    2020-9-30 15:13
    2132 次阅读|
    1 个评论
    By Toradex 胡珊逢 1). 简介 通常当编译 Linux 、 U-Boot 相关源代码时,由于编译工具或者文件系统限制,这些任务需要在 Linux 发行版中完成,如常见的 Ubuntu 、 Fedora 、 Linux Mint 、 Arch Linux 等。在电脑安装双系统,或者虚拟机,是使用 Linux 发行版的主要方式。 Windows 推出的 WSL ( Windows Subsystem for Linux )则提供了另外一种方式来使用 Linux 系统。本文接下来将介绍如何在 Windows 10 电脑上使用 WSL 来编译使用 NXP iMX8 ARM 平台的 Linux 、 U-Boot 和 Device tree overlays 。 本文所演示的 ARM 平台来自于 Toradex 基于 NXP iMX8QM ARM 处理器的 Apalis iMX8QM ARM 嵌入式平台。 2). 编译流程 WSL 有两个版本,这里我们将使用 WSL 2 。在开始安装 WSL 之前,推荐先安装 Windows Terminal 。这是微软新推出的终端工具,可以很好的兼容 WSL 。并且还直接集成了一些 Linux 的命令工具,如 ssh 、 scp 。 WSL 具体的安装方法请参考微软官方的适用于 Linux 的 Windows 子系统安装指南 (Windows 10) 。安装完毕后我们将使用 Ubuntu-20.04 为例进行编译演示。 打开 Windows Terminal 点击标签页旁边的 + ,可以看到刚才安装的 Ubuntu-20.04 WSL 已经自动出现在其中。点击后即可启动 Ubuntu 。目前的 WSL 还不支持图形,所以接下来的操作会在 Windows Terminal 以命令行的形式完成。 进入 Ubuntu-20.04 WSL 后,命令操作的形式和通常的 Ubuntu 没有区别。首先安装一些编译所需的软件。 sudo apt update sudo apt install make bison flex sudo apt install build-essential sudo apt install libncurses-dev sudo apt install libssl-dev 交叉编译工具 gcc 的安装可以通过两种形式。在 Ubuntu-20.04 WSL 中通过 wget 等命令直接下载。另外还可以在 Windows 电脑上通过浏览器下载,然后使用 Windows 的文件浏览器直接访问 Ubuntu-20.04 WSL 的文件系统,将编译工具复制进去。交叉编译工具的选择可以参考 这里 。 在文件浏览器中输入 \\wsl$\ ,其会显示电脑上可以用的 WSL 实例文件系统。例如将适用于 Apalis iMX8QM Linux BSP 5.0 的 gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu.tar.xz 复制到 Ubuntu-20.04/home/ben 目录下。 重新回到 Windows Terminal 命令行终端,解压该工具,并设置环境变量。 tar vxf gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu.tar.xz export ARCH=arm64 export DTC_FLAGS="-@" export PATH=/home/ben/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu/bin/:$PATH export CROSS_COMPILE=aarch64-none-linux-gnu- 使用 git 工具下载 Linux 、 U-Boot 源码。 git config --global user.name "XXX" git config --global user.email your_email git clone -b toradex_imx_v2020.04_5.4.24_2.1.0 git://git.toradex.cn/u-boot-toradex.git git clone -b toradex_5.4-2.1.x-imx git://git.toradex.cn/linux-toradex.git git clone -b toradex_5.4-2.1.x-imx git://git.toradex.cn/device-tree-overlays.git 详细的编译步骤和说明可以参考我们开发者中心的相关 网页说明 。 例如编译 U-boot make apalis-imx8_defconfig &1 | tee build.log 例如编译 Linux 和 device tree make defconfig &1 | tee build.log make DTC_FLAGS="-@" freescale/fsl-imx8qm-apalis-ixora-v1.1.dtb 编译 Device tree overlays cpp -nostdinc -I ../../linux-toradex/arch/arm64/boot/dts/freescale -I ../../linux-toradex/include -undef -x assembler-with-cpp apalis-imx8_atmel-mxt_overlay.dts apalis-imx8_atmel-mxt_overlay.dts.preprocessed dtc -@ -Hepapr -I dts -O dtb -i ../../linux-toradex/arch/arm64/boot/dts/freescale -o apalis-imx8_atmel-mxt_overlay.dtbo apalis-imx8_atmel-mxt_overlay.dts.preprocessed 当这些都编译好以后,生成的文件都可以通过文件浏览器将其复制出来。 在完成编译工作后, Windows Terminal 命令行终端输入 exit 命令即可退出 WSL ,但其仍在后台运行。通过以下命令来查看仍在运行的 WSL 实例,并将其关闭。 wsl --list --running 适用于 Linux 的 Windows 子系统分发版 : Ubuntu-20.04 ( 默认 ) wsl --terminate Ubuntu-20.04 3). 总结 借助 WSL 运行 Linux 发行版,为 Linux 开发人员提供一种简便的方式,免去双系统的切换,或者安装庞大的虚拟机系统。 WSL 是直接运行在 CPU 上,避免了虚拟化技术的开销。目前该技术也有限制,如 WSL 还无法使用图形界面,从而使得一些需要借助图形化界面 IDE 如 Eclipse 完成的 C/C++ 应用开发还不是很适合。当然网络上也有关于如何在 WSL 安装 X11 并通过远程桌面的方式来开启图形界面的说明,但这会影响到 WSL 的性能。 WSL 的方式比较适合不需要借助图形界面的编译任务,如 make 、 cmake 编译,甚至是 Yocto 编译等。 ​
相关资源
广告