tag 标签: arm

相关博文
  • 2025-4-2 16:39
    34 次阅读|
    0 个评论
    近日,飞凌嵌入式FET3576-C核心板正式发布了新系统Forlinx Desktop 24.04。至此,FET3576-C核心板已完成Linux 6.1、Android 14、Forlinx Desktop 24.04等多种操作系统的适配,充分展现了其在系统丰富性方面的卓越实力。 1、多系统适配,满足多样化需求 飞凌嵌入式FET3576-C核心板基于Rockchip RK3576处理器开发设计,该处理器集成了4个ARM Cortex-A72和4个ARM Cortex-A53高性能核,内置6TOPS超强算力NPU,为AI应用赋能,多种操作系统的适配,则进一步拓宽了其应用场景。 Linux 6.1系统的加入,使得飞凌嵌入式FET3576-C核心板在开源、稳定、高效等方面表现出色;Android 14系统的适配,则让飞凌嵌入式FET3576-C核心板在智能移动终端、边缘计算等领域大放异彩。 此次新发布的Forlinx Desktop 24.04系统,针对嵌入式设备进行了深度优化,提供了更加直观、易用的用户界面和丰富的应用生态,满足用户在工业控制、智能家居、数字多媒体等多个领域的需求。 2、多重测试,确保稳定运行 飞凌嵌入式深知稳定性对于用户的重要意义,因此对FET3576-C核心板进行了多重测试。这些测试涵盖了硬件可靠性、系统稳定性、性能表现等多个方面,确保核心板在各种复杂环境下都能稳定运行。 3、广泛应用,助力产品快速上市 得益于其卓越的系统丰富性和稳定性,飞凌嵌入式FET3576-C核心板在工业、AIoT、边缘计算、智能移动终端以及其他多种数字多媒体相关的应用领域都展现出了广泛的应用前景。无论是需要高性能计算能力的工业控制设备,还是需要智能交互功能的智能家居产品,FET3576-C核心板都能提供更具优势的解决方案。 此外,飞凌嵌入式还拥有强大的技术支持服务能力,助力客户快速完成产品开发、测试和上市。 总结来说,飞凌嵌入式FET3576-C核心板与多种操作系统的深度适配,不仅充分发挥了核心板硬件的卓越性能,还通过系统的优化与升级,为用户带来了更加流畅、智能、安全的使用体验。对于工业、AIoT、边缘计算、智能移动终端以及其他多种数字多媒体相关的应用领域的专业用户而言,飞凌嵌入式FET3576-C核心板都是一个值得信赖的选择。
  • 2025-4-2 11:12
    164 次阅读|
    0 个评论
    NXP iMX8MP ARM 平台 EMQX 部署测试
    B y Toradex 秦海 1). 简介 EMQX 是一款基于 Erlang/OTP 平台开发的开源 MQTT 消息服务器,广泛应用于物联网( IoT )领域,以实现设备到服务器以及服务器到设备的消息传递与控制 , 文本就基于 NXP i.MX8M Plus ARM 处理器平台,通过在 Yocto Linux BSP 中集成 Docker 环境来部署测试 EMQX 。 本文所演示的平台来自于 Toradex Verdin i.MX8MP 嵌入式平台 。 2. 准备 a). Verdin i.MX8MP ARM 核心版配合 Dahlia 载板, 并连接调试串口用于测试 。 3). Verdin i.MX8MP Yocto Linux 编译部署 a). 首先 参考 这里 说明创建 Yocto /Openembedded 编译 框架 , 当前最新版本是对应于 Toradex Yocto Linux BSP 7.x 版本的 scarthgap-7.x.y branch 。 b). 增加包含 Docker 支持的 meta-virtualization layer 。 ------------------------------- ### add meta-virtualization ### $ cd OE_ROOT_PATH/layers $ git clone -b scarthgap git://git.yoctoproject.org/meta-virtualization ### add meta-clang layer for PySide6 ### $ git clone -b kirkstone https://github.com/kraj/meta-clang.git ------------------------------- c). 创建定制化 layer meta-customer-demos ,用于添加 Docker 需要的额外修改和配置,首先添加 layer 配置文件 --------------------------------------- $ mkdir -p ../oe_core/layers/meta-customer-demos/conf $ cd .../oe_core/layers/meta-customer-demos/conf ### create layer.conf file ### # We have a conf and classes directory, append to BBPATH BBPATH .= ":${LAYERDIR}" # We have recipes-* directories, add to BBFILES BBFILES += "${LAYERDIR}/recipes-*/*/*.bb ${LAYERDIR}/recipes-*/*/*.bbappend" BBFILE_COLLECTIONS += "customer-demos" BBFILE_PATTERN_customer-demos = "^${LAYERDIR}/" BBFILE_PRIORITY_customer-demos = "24" # Let us add layer-specific bbappends which are only applied when that # layer is included in our configuration BBFILES += "${@' '.join('${LAYERDIR}/%s/recipes*/*/*.bbappend' % layer \ for layer in BBFILE_COLLECTIONS.split())}" # Add layer-specific bb files too BBFILES += "${@' '.join('${LAYERDIR}/%s/recipes*/*/*.bb' % layer \ for layer in BBFILE_COLLECTIONS.split())}" LAYERDEPENDS_customer-demos = " \ core \ yocto \ openembedded-layer gnome-layer multimedia-layer networking-layer \ " LAYERSERIES_COMPAT_customer-demos = "hardknott honister kirkstone scarthgap" --------------------------------------- d). 在定制化 layer meta-customer-demos 下面添加 Docker bbapend 文件,配置 Docker 可以启动自动加载 --------------------------------------- $ cd .../oe_core/layers/meta-customer-demos/ $ mkdir -p recipes-containers/docker $ cd recipes-containers/docker ### cteate docker-moby_git.bbappend file ### FILES:${PN} += "${sysconfdir}/systemd/system/docker.service" SYSTEMD_SERVICE:${PN} = "docker.service" SYSTEMD_AUTO_ENABLE:${PN} = "enable" --------------------------------------- e). Docker daemon 启动需要额外比如 IPSec/Netfilter/NF_table 等网络相关的 Kernel Modules ,因此如下增加额外的 Linux Kernel 配置。 --------------------------------------- $ cd .../oe_core/layers/meta-customer-demos/ $ mkdir -p recipes-kernel/linux/ $ cd recipes-kernel/linux ### cteate linux-toradex%.bbappend file ### SRCREV_meta-custom = "1e293f75e7e5569f0d86d752fbf4180dd3fac6eb" SRCREV_meta-custom:use-head-next = "${AUTOREV}" KMETABRANCH = "scarthgap-7.x.y" KMETAVIRTUALITION = "kernel-meta-custom" KMETAREPOSITORY="github.com/toradex/toradex-kernel-cache.git" KMETAPROTOCOL="https" SRC_URI += "git://${KMETAREPOSITORY};protocol=${KMETAPROTOCOL};type=kmeta;name=meta-custom;branch=${KMETABRANCH};destsuffix=${KMETAVIRTUALITION}" ## Compose additional .scc file including docker requirement and include it to our build. KERNEL_FEATURES += "bsp/${MACHINE}-${LINUX_KERNEL_TYPE}-torizon.scc" --------------------------------------- f). 最终完整 meta-customer-demos layer 文件结构如下 meta-customer-demos ├── conf │ └── layer.conf ├── recipes-containers │ └── docker │ └── docker-moby_git.bbappend └── recipes-kernel └── linux └── linux-toradex % .bbappend g). 修改 bblayers.conf 和 local.conf 文件 ------------------------------- ### modify bblayer.conf ### --- a/build/conf/bblayers.conf +++ b/build/conf/bblayers.conf @@ -34,7 +34,7 @@ ${TOPDIR}/../layers/meta-openembedded/meta-python \ ${TOPDIR}/../layers/meta-freescale-distro \ ${TOPDIR}/../layers/meta-toradex-demos \ + ${TOPDIR}/../layers/meta- virtualization \ + ${TOPDIR}/../layers/meta- customer-demos \ \ \ ${TOPDIR}/../layers/meta-toradex-distro \ ### add below to local.conf ### # enable meta-virtualization DISTRO_FEATURES:append = " virtualization" # enable docker support IMAGE_INSTALL:append = " docker docker-compose" # add Freescale EULA ACCEPT_FSL_EULA = "1" ------------------------------- h ). 编译 Yocto Linux image ------------------------------- # ## compile Reference-Multimedia image ### $ MACHINE="verdin- imx8mp " bitbake tdx-reference-multimedia-image ------------------------------- i ). Yocto Linux image 部署 参考 这里 通过 Toradex Easy installer 将上面编译好的 image 更新部署到模块 4 ). EMQX 部署测试 a ). 关于 EMQX 的更多说明和介绍可以参考如下 https://docs.emqx.com/en/emqx/latest/getting-started/getting-started.html b ). 在 Verdin i.MX8MP 设备上面通过如下命令确认 Docker daemon 已经成功运行 ------------------------------- root@verdin-imx8mp-06849028:~# systemctl is-enabled docker.service enabled root@verdin-imx8mp-06849028:~# systemctl status docker.service * docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; preset: enabled) Active: active (running) since Fri 2025-03-28 01:54:37 UTC; 5h 16min ago TriggeredBy: * docker.socket Docs: https://docs.docker.com Main PID: 685 (dockerd) Tasks: 19 Memory: 99.6M (peak: 146.5M) CPU: 14.376s CGroup: /system.slice/docker.service `-685 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock ... Mar 28 01:54:37 verdin-imx8mp-06849028 dockerd : time="2025-03-28T01:54:37.583078000Z" level=info msg="Daemon has completed initialization" Mar 28 01:54:37 verdin-imx8mp-06849028 dockerd : time="2025-03-28T01:54:37.684308375Z" level=info msg="API listen on /run/docker.sock" Mar 28 01:54:37 verdin-imx8mp-06849028 systemd : Started Docker Application Container Engine. ------------------------------- c). 参考 这里 通过如下命令安装并运行 EMQX ARM64 Docker Image ,本文采用 offline 方式,如果网络条件允许也可以 online 方式安装。 ------------------------------- ### download $ wget https://www.emqx.com/en/downloads/broker/5.8.6/emqx-5.8.6-docker-arm64.tar.gz ### install $ docker load emqx-5.8.6-docker-arm64.tar.gz ### $ docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p 8084:8084 -p 8883:8883 -p 18083:18083 emqx/emqx:5.8.6 ------------------------------- d ). 此时在开发主机,通过浏览器通过如下网址可以查看已经运行的 EMQX 控制台页面,默认登录信息为 admin/public ,可以后续自行更改密码。 ------------------------------- http:// verdin_imx8mp_ip_address :18083/ ------------------------------- e). 通过如下自带的基于 Websocket 的 MQTT 客户端进行测试 ./ 进入客户端后,首先连接 Verdin i.MX8MP 核心节点设备 ./ 然后再订阅默认的 “ testtopic ” 主题 ./ 最后可以修改 payload 内容后,点击发布,可以看到核心节点可以正常接收数据 5 ). 总结 本文 基于 NXP i.MX8MP 处理器简单演示了通过 Docker 环境部署运行 EMQX MQTT 消息服务器。
  • 2025-3-21 10:51
    452 次阅读|
    0 个评论
    B y Toradex 胡珊逢 简介 Apalis iMX8QM 使用了 NXP 的 iMX8 Quad Max 处理器。该 CPU 提供 A72 和 A53 Application Processor 和 M4 MCU。文章将介绍如何在硬件层面上隔离 AP 和 MCU 的资源,从而提高系统的可靠性。 System Controller Unit (SCU)System Controller Unit 是 iMX8 Quad Max 处理器上的一个专用 M4 核,连接 PMIC 和控制处理器上的子系统,为处理器的硬件功能提供抽象接口,供子系统使用。其主要管理以下功能和资源: 系统初始化与启动系统控制器通信电源管理资源管理引脚配置定时器中断处理 默认情况下,AP 核和 M4 核均能够使用 Apalis iMX8QM 的所有资源,包括 DDR RAM。SCU 可以通过分区 partition 的方式,将 AP 和 M4 之间,以及两个 M4 核之间所使用的资源从硬件上隔离开。一个分区中除了处理器核心外,还可以有外设、引脚 Pads 和内存区域。处理器核只能访问位于同一个分区内的资源。如果尝试访问其他分区的资源,则会返回总线错误。 当 AP 核和 M4 核在同一个分区时,AP 上的 Linux 虽然可以通过 reserved memory 方式不去使用相关 RAM 区域,但是直接物理地址访问的方式仍起作用。这对于 M4 端也是如此。使用 SCU 的分区,可以从底层规避该问题。除此之外,AP 和 M4 使用独立 Power Domain,在隔离分区情况下,对于 M4 的实时关键任务和 AP 上基于富操作系统 Linux 的应用独立运行提供可能。 在刚启动时,系统会划分三个分区。 SCU:包含所有运行 SCFW 固件所需的 Pads、外设和内存区域SECO:Security Controller 运行所需的相关资源Boot:系统剩余的所有资源如 Pads、外设和内存区域都将会划分到该分区 当系统继续启动时,如果不做进一步的分区,默认情况下 AP 和 M4 核都将运行在 Boot 分区中,它们之间只能通过软件的方式隔离各自的资源。为了实现 AP 和 M4 之间的硬件隔离,可以采用下面分区。 AP0:拥有运行 U-boot,Linux 的分区MCU0 和 MCU1:两个 Cortex-M4 核各自运行的分区Shared:共享资源的分区,例如将一段用于 rpmsg 通信的 RAM 区域划分到其中,AP 和 M4 就能够相互发送消息 分区的创建和资源划分在 SCU 的固件 SCFW 中调整。 SCU 固件 SCFW SCFW 的下载和编译方法参考 Build Custom i.MX 8/8X System Controller Firmware (SCFW) 。接下来将针对上面使用 AP0、MCU0、MCU1 和 Shared 分区案例进行说明。按照上面方法下载的 SCFW 源码中,mx8qm_apalis/board.c 已经包含上面分区的实现代码,所以无需额外的修改。在组装 Boot Container 时传入特定的 Flags 值可以启用。 在 platform/board/mx8qm_apalis/board.c 中配置分区和资源。宏定义 PARTITION_NAME 命令系统启动时的设置三个分区名字。 PARTITION_NAME (SC_PT, "SCU"); PARTITION_NAME (SECO_PT, "SECO"); PARTITION_NAME (pt_boot, "BOOT"); 检测标志位判断是否需要创建 AP0、MCU0、MCU1 和 Shared 分区。 if (alt_config != SC_FALSE) { 在需要进行分区时,PARTITION_NAME 设置相应分区的名称。 PARTITION_NAME (pt_boot, "AP0"); ... PARTITION_NAME (pt_m4_0, "MCU0"); ... PARTITION_NAME (pt_m4_1, "MCU1"); ... PARTITION_NAME (pt, "Shared"); 这里以 MCU0 分区为例, rsrc_list 中包含了划分到 MCU0 分区的资源,如 M4 中断、Message Unit、定时器等。 static const sc_rsrc_t rsrc_list = { SC_R_SYSTEM, SC_R_IRQSTR_M4_0, SC_R_MU_5B, SC_R_MU_7A, SC_R_MU_8B, SC_R_GPT_4, SC_R_SECO_MU_4 }; pad_list 中包含 MCU0 分区所使用的引脚范围。 static const sc_pad_t pad_list = { RM_RANGE (SC_P_M40_I2C0_SCL, SC_P_M40_GPIO0_01) }; 结合 sc_fw_api_qm_b0.pdf 文档,index 7~10 的引脚都将在划分到 MCU0 分区。 sc_rm_mem_list_t 配置了包括 RAM 在内的可使用存储空间。 static const sc_rm_mem_list_t mem_list = { {0x088000000ULL, 0x0887FFFFFULL}, {0x008081000ULL, 0x008180FFFULL} }; rm_partition_create 使用上面配置的所有资源创建 MCU0 分区。 BRD_ERR (rm_partition_create(pt_boot, pt_m4_0, SC_FALSE, SC_TRUE, SC_FALSE, SC_TRUE, SC_FALSE, SC_R_M4_0_PID0, rsrc_list, ARRAY_SIZE(rsrc_list), pad_list, ARRAY_SIZE (pad_list), mem_list, ARRAY_SIZE (mem_list))); 组装 Boot Container NXP i.MX 8QuadMax 处理器使用前面提到的 SCU 来启动系统。启动时除了加载 SCFW,它还可以加载 ATF 和 U-Boot,以及直接加载 M4 核的固件。Boot Container 组装方法参考 Specifics: Build U-Boot for NXP i.MX 8/8X-based SoMs 。默认情况下,如网页描述,使用下面命令组装 Boot Container。该方法生成的 flash.bin 文件中并不包含 M4 核的固件,并且 AP 和 M4 在同一个分区。M4 的固件在 U-Boot 启动时,使用 bootaux 命令从 eMMC 上加载后运行。 make SOC=iMX8QM flash_b0 为了使用上面 SCFW 中划分的分区,使用下面命令组装 Boot Container。 make SOC=iMX8QM flash_regression_linux_m4 编译目标来自 imx-mkimage/iMX8QM/soc.mak 中的定义。flash_regression_linux_m4: $(MKIMG) $(AHAB_IMG) \ scfw_tcm. bin u-boot-atf. bin m4_image. bin m4_1_image. bin \ ./$( MKIMG ) -soc QM -rev B0 -append $( AHAB_IMG ) \ -c -flags 0x00200000 -scfw scfw_tcm.bin \ -ap u-boot-atf.bin a53 0x80000000 \ -p3 -m4 m4_image. bin 0 0x34FE0000 \ -p4 -m4 m4_1_image. bin 1 0x38FE0000 \ - out flash.bin -flags 0x00200000 向 SCFW 的 board.c 传递,SCU 在启动时将会创建 AP0、MCU0、MCU1 和 Shared 的分区。 if (alt_config != SC_FALSE) { sc_fw_port.pdf 中说明了 Bit 21 SCFW_SC_BD_FLAGS_ALT_CONFIG 为更改 SCFW 配置的位,对应 0x00200000。 上面命令中 m4_image.bin 和 m4_1_image.bin 为两个 M4 各自的固件,从各自的 TCML 运行。因此,在执行上面命令前,需要把两个 M4 的固件复制到 imx-mkimage/iMX8QM 目录下。 如下修改 U-boot 源码中 U-boot/cmd/booti.c,重新编译后将 u-boot.bin 复制到 imx-mkimage/iMX8QM 目录下。 if (dest gd - ram_base || dest gd - ram_top) { puts ( "kernel_comp_addr_r is outside of DRAM range!\n" ); //return -EINVAL; } Linux device tree 更新 接下来的演示中,我们在 M4 上使用 multicore_examples/rpmsg_lite_pingpong_rtos 作为演示,在 AP 上的 Linux 系统中也需要开启 rpmsg 节点并加载驱动。针对 Apalis iMX8 BSP 7 的 imx8qm-apalis-v1.1-ixora-v1.2.dtb 需要打 该补丁 。 更新 Boot Container 文件 上面命令执行成功后生成的 flash.bin,需要更新到 Apalis iMX8 模块上的 eMMC 上。对于使用 Toradex Easy Installer 进行批量烧写或者重装系统,可以将 flash.bin 重名为 imx-boot,替换原来的烧录文件中 imx-boot。在开发期间,使用 U-Boot 直接更新 flash.bin 会更加方便,免于重装整个系统镜像。 将 flash.bin 复制到的一台 TFTP 服务器的下载目录中。然后在 U-Boot 中配置 Apalis iMX8 和 TFTP 服务器 IP 地址。 Apalis iMX8 # setenv ipaddr 192.168.3.181 Apalis iMX8 # setenv serverip 192.168.3.196 Apalis iMX8 # saveenv 使用 tftpboot 和 mmc 命令将 flash.bin 下载并写入到 eMMC 上。 mmc write $loadaddr 0 0x973 中最后的数值是写入的 block 数量。tftpboot 在下载时会显示文件大小,例如这里为 1238016 字节。需要写入的 block = (1238016+511)/512,计算结果向上取整,并转为十六进制数值。 Apalis iMX8 # tftpboot $loadaddr flash.bin Using ethernet @5b040000 device TFTP from server 192.168.3.196 ; our IP address is 192.168.3.181 Filename 'flash.bin' . Load address : 0 x95400000 Loading: ################################################## 1.2 MiB 3.4 MiB/s done Bytes transferred = 1238016 ( 12 e400 hex) Apalis iMX8 # mmc dev 0 1 Apalis iMX8 # mmc write $loadaddr 0 0x973 测试 在 U-Boot 中配置启动时加载的 device tree 文件。 Apalis iMX8 # setenv fdtfile imx8qm-apalis-v1.1-ixora-v1.2.dtbApalis iMX8 # saveenvApalis iMX8 # reset 启动后可以在 Linux 和两个 M4 的调试串口上看到启动内容。 Linux 中进入 kernel modules 驱动目录 kernel/drivers/rpmsg,加载 imx_rpmsg_pingpong.ko。两个 M4 上的固件在发现 rpmsg 通道后,自动向 Linux 发送消息。 # insmod imx_rpmsg_pingpong .ko ... get 91 ( src : 0 x1f) get 101 ( src : 0 x1e) imx_rpmsg_pingpong virtio1 .rpmsg-openamp-demo-channel .-1 .30 : goodbye ! get 93 ( src : 0 x1f) get 95 ( src : 0 x1f) get 97 ( src : 0 x1f) get 99 ( src : 0 x1f) get 101 ( src : 0 x1f) imx_rpmsg_pingpong virtio3 .rpmsg-openamp-demo-channel-1 .-1 .31 : goodbye ! 总结 文章介绍了如何使用 SCU 划分不同的分区,将 AP 和 M4 之间做硬件隔离,并使用 SCFW 直接加载 M4 的固件,不仅提高系统可靠性,也将 M4 运行提前到 U-Boot 之前,加快启动速度。更多关于 SCU 的高级高级功能,可以参考 SCFW 的说明文档。 ​
  • 热度 1
    2025-3-6 15:17
    782 次阅读|
    0 个评论
    by Toradex Allan Kamimura 边缘计算机视觉 为何选择边缘计算? 嵌入式设备日益智能化,许多机器学习和计算机视觉任务正被推向边缘设备。在此类设备上运行 AI 模型虽具挑战性,却带来诸多优势: 降低延迟: 在设备端处理数据,避免了向云端或中央处理器传输数据的等待时间 增强隐私保护:敏感数据保留在设备内,确保符合严格的隐私法规要求。 节省带宽成本:边缘处理减少了对集中式服务器发送大量数据的需求。 提升可靠性:系统可在无网络连接的情况下独立运作。 为何需要外部 AI 加速器? Toradex 提供多种计算机模块(SoM),其中一些集成了神经网络处理单元(NPU),能够应对不同的 AI 工作负载。例如,Verdin iMX8M Plus, Verdin iMX95和 Aquila AM69 均配备了专为边缘推理加速设计的 NPU,使其适用于众多计算机视觉和机器学习应用。 尽管这些模块提供了强大的 AI 解决方案,但诸如 Hailo-8、EdgeX、MemryX 及 Google Coral 等外部 AI 加速器通过提供模块化、解耦且可扩展的边缘 AI 推理方案来应对挑战。这带来了更高的灵活性和面向未来的 AI 能力。 1. 将 AI 处理与 SoC 供应商软件解耦 在边缘运行机器学习面临的一大挑战是将模型适配到特定硬件或运行库上。无论是 NXP 的 eiQ平台、TI 的 Edge AI Studio 还是 ONNX 导出工具,每种都有其专属的 AI 工具包和优化策略。外部 AI 加速器将 AI 工作负载从其他硬件中分离出来,提供了一个统一的跨多硬件平台的运行环境。 示例: 一个基于 x86 设备并使用 Hailo-8 AI 加速器开发的计算机视觉解决方案,可以无缝迁移至搭载 Hailo-8 的 Aquila AM69 模块上而无需重构整个 AI 堆栈。这种解耦确保了仅需最小调整即可完成迁移,大大缩短了产品上市时间。 2. 模块化与可扩展性 AI 应用具有动态特性,随着工作负载复杂度的增加或新功能的创建,性能需求可能会发生变化。虽然内置的 NPU 能提供坚实的解决方案,但有时它们可能难以适应新的场景。 Hailo简介 Hailo是一家 AI 处理器制造商,其产品旨在边缘端上运行先进的机器学习应用,能够广泛应用于智慧城市、汽车、制造、农业、零售等多个行业和领域。 我们使用 Hailo-8 M.2 模块在多款 Toradex 模块上进行了测试。Hailo-8 M.2 模块是一款具备 26 TOPS 算力及 PCIe Gen-3.0 4通道 M-key 接口的 AI 加速器模块。该 M.2 模块可插入多种 Toradex 载板中,实现实时的深度神经网络推理。 如何 Hailo 充分利用 Toradex 生态系统? 释放预处理和后处理任务 来源:https://hailo.ai/blog/customer-case-study-developing-a-high-performance-application-on-an-embedded-edge-ai-device/ 典型的计算机视觉流程遵循线性模式。从摄像头捕捉源开始,直到应用程序采取行动,图像必须经过每一个处理步骤。这意味着如果任何一个步骤比下一个耗时更长,那就是瓶颈所在。 通常,在比较机器学习模型或硬件时,我们会非常关注推理速度,但这只是问题的一部分。 完整的软件堆栈 Hailo 是一个完整的人工智能解决方案,支持常见机器学习工作流中的大部分步骤。 性能评估 TAPPAS是一个包含应用示例的代码库。 Model Zoo不仅提供了一些模型的基准测试结果,还包括预训练模型。 模型训练 部分预训练模型附带了再训练环境。 编译器和运行库 Hailo Dataflow 编译器 pyHailoRT 和 GStreamer 插件 从 Toradex 方面来看,这一工作流程可以通过使用 Torizon 云平台得到补充。 监控性能 提前识别任何问题,确保系统可靠性。 OTA 更新 轻松更新量产设备。 支持 Toradex 模块硬件 硬件 支持的硬件配置 系列 模块 载板 Hailo Aquila TI AM69 (1+2 x PCIe 3.0) Clover (M.2 key B+M) Hailo-8 Hailo-8L Aquila NXP i.MX 95 (1 x PCIe 3.0) Clover (M.2 key B+M) Hailo-8 Hailo-8L Verdin NXP i.MX 95 (1 x PCIe 3.0) Mallow (M.2 key B) Hailo-8 Hailo-8L Verdin NXP i.MX 8M Plus (1 x PCIe 3.0) Mallow (M.2 key B) Hailo-8 Hailo-8L Verdin NXP i.MX 8M Mini (1 x PCIe 2.0) Mallow (M.2 key B) Hailo-8 Hailo-8L Apalis NXP i.MX8 (2 x PCIe 3.0) Ixora (Mini PCIe) Hailo-8R mPCIe 软件 OS 版本 其他的资源 Torizon OS BSP 7 meta-hailo layer (即将上线) Torizon OS BSP 6 runtime container (即将上线) Torizon OS Minimal BSP 6 meta-hailo kirkstone OpenEmbedded layer for GStreamer 1.0 tdx-reference-multimedia BSP 6 meta-hailo kirkstone YOLOv5 示例 在本例中,我们将运行来自 Tappas 的演示应用程序: 完成此示例后,您应得到类似以下的输出。以 60+ FPS 的速度运行(取决于您的摄像头)。 我们将使用: 摄像头 如果使用 USB 摄像头,由于摄像头的捕捉速度,帧率可能会非常低。 显示器 Verdin i.MX8MP+Mallow Carrier 载板 Verdin iMX8M Plus QuadLite 1GB IT (0065) 不兼容 Framos 摄像头。 Hailo AI Accelerator 步骤: 从源码构建 Torizon OS 构建基础 Torizon OS 添加依赖项 硬件设置 连接Hailo设备 连接摄像头 安装新镜像 检查所有配置 运行示例 从源代码构建 Torizon OS 完整指南 首先,您可能需要检查计算机的 RAM 和磁盘空间 用于 Yocto 项目构建的计算机 构建 Torizon OS 基础镜像 我们将使用 CROPS 容器来构建以下镜像: Torizon OS Disto Machine Torizon OS Image Target 版本 torizon verdin-imx8mp torizon-minimal 6.8.0 创建工作目录 cd ~ mkdir ~/yocto-workdir 运行容器(这将构建基础镜像) 这将占用大量内存,并需要几个小时才能完成。 命令的第二行将主机卷映射到容器的 workdir 目录。请注意,此文件夹 ~/yocto-workdir 是在上一步中创建的。 docker run --rm -it --name=crops \ -v ~/yocto-workdir:/workdir \ --workdir=/workdir \ -e MACHINE="verdin-imx8mp" \ -e IMAGE="torizon-minimal" \ -e DISTRO="torizon" \ -e BRANCH="refs/tags/6.8.0" \ -e MANIFEST="torizoncore/default.xml" \ -e ACCEPT_FSL_EULA="1" \ -e BB_NUMBER_THREADS="2" \ -e PARALLEL_MAKE="-j 2" \ # not sure if I can pass those like this torizon/crops:kirkstone-6.x.y startup-tdx.sh 将依赖项添加到镜像 要添加依赖项,首先进入 ~/yocto-workdir/layers 文件夹。 cd ./layers 我们将添加下面 layers: meta-hailo meta-gstreamer1.0 meta-toradex-framos 更多关于 meta layers 的内容,请参考完整的文档。 在 torizon/crops:kirkstone-6.x.y 容器中, 运行 bitbake add layers 命令。 bitbake-layers add-layer meta-hailo/meta-hailo-accelerator bitbake-layers add-layer meta-hailo/meta-hailo-libhailort bitbake-layers add-layer meta-hailo/meta-hailo-tappas bitbake-layers add-layer meta-hailo/meta-hailo-vpu bitbake-layers add-layer meta-toradex-framos bitbake-layers add-layer meta-gstreamer1.0 在 build-torizon/conf/local.conf 文件中添加 packages。在末尾添加下面内容。 IMAGE_INSTALL:append = " libhailort hailortcli pyhailort libgsthailo hailo-pci hailo-firmware" IMAGE_INSTALL:append = " gstreamer1.0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad" IMAGE_INSTALL:append = " v4l-utils" 使用新的 layers 编译镜像。 bitbake torizon-minimal 你可以在下面位置找到兼容 Toradex Easy Installer 的安装镜像 ~/yocto-workdir/build-torizon/deploy/images/verdin-imx8mp/torizon-minimal-verdin-imx8mp-Tezi_6.8.0-devel-date+build.0.tar. 硬件设置 连接Hailo设备 将 Hailo 设备插入 Mallow 载板的 M.2 插槽中。 连接摄像头 将摄像头连接到 Mallow 载板的 MIPI-CSI 接口上。 安装新的 Torizon OS 镜像 使用 Toradex Easy Installer (Tezi) 将新镜像刷入设备。 下载Tezi 将设备置于恢复模式 安装新编译的镜像 检查安装情况 Hailo 设备 sudo su hailocli scan hailocli device-info 这些命令的输出应能检测到设备已正确连接且驱动程序正常工作。 显示屏 gst-launch-1.0 videotestsrc ! videoconvert ! autovideosink 您应该在屏幕上看到一些彩色图案。 Camera 设备 此步骤可能因使用的相机而异。 v4l2-ctl -d2 -D v4l2-ctl --list-formats-ext -d /dev/video2 对于 Framos 相机,输出如下。 root@verdin-imx8mp-15445736:~# v4l2-ctl --list-formats-ext -d /dev/video2 ioctl: VIDIOC_ENUM_FMT Type: Video Capture : 'YUYV' (YUYV 4:2:2) Size: Stepwise 176x144 - 4096x3072 with step 16/8 : 'NV12' (Y/CbCr 4:2:0) Size: Stepwise 176x144 - 4096x3072 with step 16/8 : 'NV16' (Y/CbCr 4:2:2) Size: Stepwise 176x144 - 4096x3072 with step 16/8 : 'RG12' (12-bit Bayer RGRG/GBGB) Size: Stepwise 176x144 - 4096x3072 with step 16/8 在演示中,我们将使用 YUYV 格式。因此请记住其中的数值。 gst-launch-1.0 -v v4l2src device=/dev/video2 ! video/x-raw ! videoconvert ! autovideosink 运行示例 某些摄像头会指定分辨率和帧数,因此需相应调整这些值。这可以通过修改 PIPELINE变量的 framerate 值来实现。 sudo su cd ~/apps/detection/ ./detection.sh
  • 热度 1
    2025-3-6 12:00
    227 次阅读|
    0 个评论
    B y Toradex 秦海 1). 简介 基于 ARM 平台 Yocto Linux BSP 开发嵌入式设备,开发完成后需要生成用于量产的 Yocto Linux BSP 镜像,本文就基于 Toradex Yocto Linux BSP 镜像进行量产定制做流程说明。 2. 准备 a). Toradex Yocto Linux BSP 提供预编译好的基于 Downstream/Mainline Linux Kernel 版本的 Minimal 或者 Multimedia 镜像供客户测试开发,具体可以从下面地址下载。 https://developer.toradex.cn/software/toradex-embedded-software/toradex-download-links-torizon-linux-bsp-wince-and-partner-demos/#toradex-embedded-linux---yocto-project-reference-images b ). Toradex ARM 核心板 产品出厂预装 Toradex Easy Installer 工具软件,便于进行量产安装,因此对应使用的 Yocto Linux BSP 镜像也是适用于通过 Toradex Easy Installer 安装的镜像,具体关于 Toradex Easy Installer 的更详细介绍请见如下。 https://developer.toradex.cn/easy-installer/toradex-easy-installer/toradex-easy-installer-overview/ c). 如果熟悉 Yocto Project 编译环境,可以参考如下文章通过 Yocto Project 来定制编译用于量产的 BSP 镜像,本文不做赘述。 https://www.toradex.cn/blog/tong-guo-ycoto-project-ding-zhi-qian-ru-shi-ycoto-linux-jing-xiang 3). 定制流程 a). 本文以适用于 Verdin i.MX8M Plus 的 Yocto Linux Mutimedia BSP Reference Image 镜像为例进行示例,其他平台和版本的 BSP 方法思路都一致。 b). 从 这里 下载针对 Verdin i.MX8M Plus 的 Yocto Linux Mutimedia BSP Reference Image V7.x 版本,并解压后包含文件如下。 ------------------------------- $ tar xvf Verdin-iMX8MP_Reference-Multimedia-Image-Tezi_7.1.0+build.3.tar $ cd Verdin-iMX8MP_Reference-Multimedia-Image-Tezi_7.1.0+build.3/ $ tree -L 1 . ├── image.json ├── imx-boot ├── LA_OPT_NXP_SW.html ├── marketing.tar ├── prepare.sh ├── Reference-Multimedia-Image-verdin-imx8mp.rootfs.bootfs.tar.xz ├── Reference-Multimedia-Image-verdin-imx8mp.rootfs.tar.xz ├── toradexlinux.png ├── u-boot-initial-env-sd └── wrapup.sh 0 directories, 10 files ------------------------------- c). image.json 是 BSP 镜像配置文件, Toradex Easy Installer 软件就是通过读取这个文件来进行 BSP 镜像更新的 ./ image.json 配置文件详细说明请见如下文章,不同的硬件平台具体的文件会有不同,尤其是底层 bootloader 相关的 binary 文件。本文只将和定制量产镜像相关的参数着重说明。 https://developer.toradex.cn/easy-installer/toradex-easy-installer/toradex-easy-installer-configuration-files ./ “ autoinstall ” 参数定义了是否自动安装 BSP 镜像 ------------------------------- false - 不自动安装 (default) true - 自动安装 ------------------------------- ./ “u_boot_env” 参数定义了 U-Boot 启动动态加载的环境变量参数,可以将自定义的 U-Boot 环境变量参数更新到这个文件,刷写 BSP 镜像后启动即可以生效。 ------------------------------- u-boot-initial-env-sd (default) ------------------------------- ./ “ prepare_script ” 参数定义了 Toradex Easy Installer 工具进行分区和烧写镜像操作前需要进行的操作 ------------------------------- prepare.sh (default) ------------------------------- ./ “wrapup_script” 参数定义了 Toradex Easy Installer 工具完成分区和烧写镜像操作后需要进行的操作 ------------------------------- wrapup.sh (default) ------------------------------- ./ “blockdevs” 参数下面就定义了实际需要烧写的镜像以及分区,当然也可以参考上述配置文件说明定制添加自己需要的分区或者只读文件系统等。 // 通常首先是一个 FAT32 分区,用于烧写包括 Linux Kernel Image/Device-Tree Binary/Device-Tree Overlay Binary 等启动文件, ” filename ” 参数定义了写入的文件压缩包, "uncompressed_size" 定义了要写入文件未压缩前的大小 (MB) 。如果定制镜像过程中修改了压缩包文件的名字和文件大小就需要修改对应修改这两个参数。 ------------------------------- "label": "BOOT", "filesystem_type": "FAT", "mkfs_options": "", " filename ": "Reference-Multimedia-Image-verdin-imx8mp.rootfs.bootfs.tar.xz", " uncompressed_size ": 8.671875 ------------------------------- // 然后是一个 EXT4 分区,用于烧写 Linux Rootfs 文件系统文件, ” filename ” 参数定义了写入的文件压缩包, "uncompressed_size" 定义了要写入文件未压缩前的大小 (MB) 。如果定制镜像过程中修改了 Rootfs 文件系统压缩包文件的名字和文件大小就需要修改对应修改这两个参数。 ------------------------------- "label": "RFS", "filesystem_type": "ext4", "mkfs_options": "-E nodiscard", " filename ": "Reference-Multimedia-Image-verdin-imx8mp.rootfs.tar.xz", " uncompressed_size ": 1272.7109375 ------------------------------- // 最后是 Raw 分区,用于烧写包括 Bootloader Binary 等在内的底层引导固件文件,文件可能是一个文件或者多个文件,根据不同的硬件平台不一致。 ” filename ” 参数定义了写入的 Binary 固件文件,比如 Verdin i.MX8MP 平台对应的是 imx-boot 文件就是一个包含 ATF/DDR Firmware/SPL/U-Boot 等的 Boot Container ,而比如 Verdin AM62 平台则每个固件都是分开的单独文件。 ------------------------------- "filesystem_type": "raw", "rawfiles": ------------------------------- d). “ imx-boot ” 如章节 (c) 说明是 Verdin i.MX8MP 平台对应的 Boot Container 文件,如果需要修改底层 Bootloader ,可以参考如下文章修改编译生成新的 “ imx-boot ” 文件后替换 BSP Image 镜像里面的文件。 https://developer.toradex.cn/linux-bsp/os-development/build-u-boot-and-linux-kernel-from-source-code/build-u-boot/ e). “prepare.sh” 如章节 (c) 说明是烧写镜像前需要进行的操作,通常不需要修改。 f). “ wrapup .sh” 如章节 (c) 说明是烧写镜像后进行的操作,如果使能了 “ autoinstall ” 自动安装可以增加如下内容在完成自动安装后自动重启。 ------------------------------- reboot -f exit 0 ------------------------------- g). “Reference-Multimedia-Image-verdin-imx8mp.rootfs.bootfs.tar.xz” 压缩包文件如章节 (c) 说明是 FAT32 启动分区文件,请注意不同 Yocto Linux BSP 版本命名方式可能略有不同。 ./ 解压后内容如下 ------------------------------- $ cd Verdin-iMX8MP_Reference-Multimedia-Image-Tezi_7.1.0+build.3/ $ mkdir bootfs $ tar Jxf Reference-Multimedia-Image-verdin-imx8mp.rootfs.bootfs.tar.xz -C bootfs/ $ cd bootfs $ tree -L 1 . ├── boot.scr ├── Image.gz ├── imx8mp-verdin-nonwifi-dahlia.dtb ├── imx8mp-verdin-nonwifi-dev.dtb ├── imx8mp-verdin-nonwifi-ivy.dtb ├── imx8mp-verdin-nonwifi-mallow.dtb ├── imx8mp-verdin-nonwifi-yavia.dtb ├── imx8mp-verdin-wifi-dahlia.dtb ├── imx8mp-verdin-wifi-dev.dtb ├── imx8mp-verdin-wifi-ivy.dtb ├── imx8mp-verdin-wifi-mallow.dtb ├── imx8mp-verdin-wifi-yavia.dtb ├── overlays └── overlays.txt 1 directory, 13 files ------------------------------- ./ “ boot.scr ” 文件是 Linux U-Boot Distroboot 配置文件,如果定制 BSP 镜像涉及 Linux Kernel 启动参数相关配置,可以参考 这里 修改并重新生成这个文件后替换原有文件。 ./ 其他文件都是包含 Linux Kernel Image / Device-Tree Binary / Device-Tree Overlay Binary 等文件,如果定制 BSP 涉及了相关修改可以在这里替换原有文件。 ./ 修改完成所有要修改的文件后,可以通过如下命令重新压缩,如果命名不变则无需修改 image.json 文件,否则就要对应修改。 ------------------------------- $ cd Verdin-iMX8MP_Reference-Multimedia-Image-Tezi_7.1.0+build.3/bootfs/ $ tar Jcf ../Reference-Multimedia-Image-verdin-imx8mp.rootfs.bootfs.tar.xz * $ cd .. $ rm -rf bootfs/ ------------------------------- h). “Reference-Multimedia-Image-verdin-imx8mp.rootfs.tar.xz” 压缩包文件如章节 (c) 说明是 EXT4 Linux Rootfs 文件系统分区文件,请注意不同 Yocto Linux BSP 版本命名方式可能略有不同。 ./ 解压后内容如下 ------------------------------- $ cd Verdin-iMX8MP_Reference-Multimedia-Image-Tezi_7.1.0+build.3/ $ mkdir rootfs $ sudo tar Jxf Reference-Multimedia-Image-verdin-imx8mp.rootfs.bootfs.tar.xz -C rootfs/ $ cd rootfs $ tree -L 1 . ├── bin - usr/bin ├── boot ├── dev ├── etc ├── home ├── lib - usr/lib ├── media - run/media ├── mnt ├── opt ├── proc ├── root ├── run ├── sbin - usr/sbin ├── srv ├── sys ├── tmp ├── unit_tests ├── usr └── var 18 directories, 1 file ------------------------------- ./ 在这里可以进行 Linux Rootfs 相关的修改适配,比如部署应用程序以及相关运行库,配置应用程序开机自启动等,下面是几个简单示例。 ------------------------------- ### modify below default autorun systemd service file to make customized application autorun ### rootfs/lib/systemd/system/wayland-app-launch.service ... ExecStart=/usr/share/cinematicexperience-1.0/Qt5_CinematicExperience --fullscreen ... ### modify below splash picture to adapt customized splash after enabling plymouth in Yocto project ### rootfs/usr/share/plymouth/themes/spinner/watermark.png ### modify weston configuration file if needed, below for example to hide weston normal shell ### rootfs/ etc/xdg/weston/weston.ini ... shell=kiosk-shell.so ... ------------------------------- ./ 修改完成所有要修改的文件后,可以通过如下命令重新压缩,如果命名和大概文件大小不变则无需修改 image.json 文件,否则就要对应修改。 ------------------------------- $ cd Verdin-iMX8MP_Reference-Multimedia-Image-Tezi_7.1.0+build.3/rootfs/ $ sudo tar Jcf ../Reference-Multimedia-Image-verdin-imx8mp.rootfs.tar.xz * $ cd .. $ sudo rm -rf rootfs/ ------------------------------- i). “u-boot-initial-env-sd” 如章节 (c) 说明是 U-Boot 环境变量配置文件,可以将定制需要的环境变量修改或者添加在这个文件。比如这里示例添加为了显示 Plymouth Splash 以及关闭 log 输出的环境变量定义。 ------------------------------- tdxargs = quiet logo.nologo vt.global_cursor_default=0 plymouth.ignore-serial-consoles splash fbcon=map:3’ bootdelay = 0 ------------------------------- j). 定制完成后将完整 BSP image 文件复制到 U 盘或者 SD 卡,通过模块 Toradex Easy Installer 工具安装到模块进行量产即可。 4 ). 总结 本文 基于 Toradex i.MX8MP ARM 处理器平台示例了 Yocto Linux 量产 BSP 镜像定制流程,其他平台定制思路都是基本一致的。
相关资源