尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Raspbian移植RK3328工业板:嵌入式Linux系统适配实战

Raspbian移植RK3328工业板:嵌入式Linux系统适配实战 1. 项目背景与方案选型1.1 为什么是RK3328一颗被低估的工业级SoC做嵌入式Linux开发这些年我接触过不少主控方案但RK3328这颗芯片在我眼里一直是个特殊的存在。它不像RK3399那样顶着旗舰光环也不像树莓派那颗BCM2711那样被极客们捧上天但它的综合素质在工业场景里其实非常能打。RK3328是一颗四核Cortex-A53架构的SoC主频最高1.5GHz配的是Mali-450 MP2 GPU。说实话这套规格放在今天看并不惊艳它的性能大概介于树莓派3B和3B之间。但真正让它适合工业场景的原因是瑞芯微把这颗芯片的外设接口做得相当齐全——原生支持千兆以太网MAC、多路UART、SPI、I2C、USB 3.0和PCIe 2.0。这些接口对于接工业传感器、PLC、串口设备、数据采集模块来说都是刚需。我在选型的时候特别关注了一个细节RK3328的PCIe接口可以引出标准的M.2插槽这意味着你可以直接插NVMe固态硬盘或者4G/5G通信模组而不用像很多开发板那样靠USB转接。这个特性在工业场景里太重要了——工业设备常常需要长时间连续写入日志或者跑本地数据库eMMC和SD卡的寿命和速度都撑不住。另外RK3328的电源管理方案是PMURK805-1一体化设计待机功耗可以压到很低发热控制也比那些靠大散热片压制的方案要好。我们在做密闭无风扇机箱测试时CPU满载跑24小时外壳温度稳定在62°C左右这个表现对工业部署来说完全可以接受。1.2 工业级SBC和开发板到底差在哪很多人觉得工业级SBC就是把开发板换个外壳、加宽温元器件其实没那么简单。我这次选用的板卡是一家国内厂商做的RK3328工业核心板加底板方案和市面上的RK3328电视盒子、DIY开发板有几个本质区别。第一是元器件选型。工业板的电阻电容电感全部用的是工业级物料工作温度范围是-40°C到85°C而消费级板卡通常只保证0°C到70°C。第二是PCB工艺。工业板普遍采用沉金工艺保证了在潮湿环境下的抗氧化能力而且走线阻抗控制更严格这对USB 3.0和千兆网口的信号完整性影响很大。第三是接口保护和电源设计。工业板会在所有对外接口上加TVS管防浪涌电源部分做防反接、过压过流保护还有独立的电源监控芯片电源纹波控制得比开发板好得多。我见过不少人在开发板上跑通了程序一到工业现场就各种死机、通信出错大概率就是栽在这些看不见的地方。当然工业板的价格也贵不少一块核心板加底板的成本可能顶三块普通开发板但考虑到设备宕机带来的损失这笔账怎么算都划算。1.3 Raspbian移植这件事的定位和意义Raspbian移植本质上不是从零开始写系统而是把一套为树莓派硬件高度定制的Linux发行版适配到RK3328平台上。为什么要做这件事因为Raspbian背后有庞大的社区生态和软件仓库里面积累了无数经过验证的软件包从Python科学计算到Node-RED物联网平台从OpenCV到各种传感器驱动库。如果能把这套生态搬到RK3328上那么基于树莓派开发的存量项目就可以快速迁移到工业级硬件上软件层面的兼容成本几乎为零。这个思路和直接刷一个Debian官方系统不太一样。Raspbian的亮点在于它针对树莓派做了大量默认配置优化比如GPU驱动直接可用、GPIO库预装、桌面环境优化好、有raspi-config这样的可视化配置工具。移植的目标就是让RK3328也能享受这些便利同时把工业板的特殊外设多路串口、工业GPIO、看门狗通过自定义的方式接入系统。从技术角度看这是一条艰难的捷径——你要拆解一套系统的ROM、内核、bootloader和硬件描述再一层层重建。但一旦打通后续维护就变得极其轻松内核升级、驱动安装、软件部署都能直接用树莓派的工具链完成。2. 移植前的基础拆解Raspbian的启动链2.1 从树莓派到RK3328启动流程的差异分析在做实际移植之前我花了整整两天时间研究树莓派和RK3328的启动差异。这两者的启动机制可以说是完全不同的世界观。树莓派的启动流程非常特殊。它的SoC内部有一个GPUVideoCore IV这个GPU是真正的一级bootloader负责读取SD卡第一个分区FAT32格式里的bootcode.bin和start.elf文件。start.elf再根据config.txt里的配置加载kernel.img。也就是说树莓派的引导过程是GPU引导CPU这和传统ARM SoC的引导方式截然不同。RK3328走的则是典型的ARM标准启动链芯片内部ROM固件BootROM → U-Boot或Rockchip自家的miniloader → 内核。BootROM会按照固定的优先级去检测启动介质——先是eMMC再是SD卡然后是USB、UART等。这里的关键是Rockchip有一个特殊的DDR初始化固件ddr.bin和U-Boot的TPL/SPL阶段必须在U-Boot正式运行前完成DDR内存的初始化训练。还有一个重要差异树莓派的固件是闭源的由树莓派基金会维护你只能在它的框架内修改config.txt参数而RK3328的U-Boot是开源的你可以完全控制整个引导流程甚至编译自己的SPL。这对移植工作来说反而是个优势——自由度更高可以在U-Boot阶段就加入针对工业应用的定制。2.2 U-Boot、内核、设备树三层结构的移植思路我把整个移植工作拆成了三个层次分别是U-Boot层、内核层和设备树/用户空间层。U-Boot层的目标很纯粹让板卡能正常启动能从SD卡和eMMC加载内核镜像能设置正确的bootargs。Rockchip官方一直在上游维护RK3328的U-Boot支持所以这一步其实不复杂关键是选择正确的分支和配置文件。内核层的挑战要大一些。Raspbian的内核是基于树莓派官方那个长期维护分支rpi-6.6.y之类编译的里面包含了树莓派特有的BCM2835/2711平台代码、GPU驱动、VPU编解码器驱动等。这部分代码对RK3328来说是完全没有意义的。我的做法是放弃Raspbian内核改用Rockchip内核或者用Linux mainline内核加上Rockchip平台的补丁但为了让Raspbian用户空间能正常工作需要把Raspbian里那些依赖树莓派特定内核模块的功能比如raspi-gpio、pigpio库替换成RK3328的对应实现。设备树层是整个移植里信息密度最高的一环。Raspbian在树莓派平台上使用config.txt加设备树覆盖device tree overlay机制来管理硬件配置这在RK3328上行不通。RK3328的设备树是一个完整的.dts文件在U-Boot阶段就被加载并传递给内核。需要在其中正确描述每个外设的寄存器地址、中断号、时钟频率、引脚复用关系。工业板的底板和核心板往往会引入一些厂商自定义的扩展比如额外的GPIO控制器、加密芯片这些都必须在设备树里备案否则内核根本不知道它们的存在。2.3 为什么不能直接dd镜像兼容性陷阱网上有人问过我能不能直接把树莓派官方Raspbian镜像dd到RK3328板子的SD卡里然后改改cmdline就启动我明确说绝对不行。就算你费尽心思绕过了BootROM层面的校验后面的坑也会一个接一个。首先树莓派官方镜像的根文件系统分区是按树莓派的布局做的第一个FAT分区只放树莓派固件根本没有U-Boot。其次内核镜像的格式和位置完全不同——树莓派用的是kernel8.img这种特殊打包格式RK3328需要的是标准的Image或zImage并放在boot分区指定的路径。再往深处说根文件系统里的/etc/fstab分区UUID、/boot/config.txt引用、firmware里的VideoCore固件全部都是为树莓派量身定制的。就算强行启动到了内核恐慌那一关也会卡死。更关键的问题是硬件抽象层。Raspbian的很多功能绑定在树莓派特有的/boot/dtbs目录和kernel模块上比如w1-gpio、spi-bcm2835等。这些模块在RK3328上根本不存在内核在加载它们时会直接报错。所以任何指望通过整盘dd来完成移植的想法都是行不通的必须按模块逐步替换。3. 移植实操全流程从编译U-Boot到跑起桌面3.1 编译环境准备与交叉工具链选择我用的编译主机是一台跑Ubuntu 22.04的x86机器16GB内存、8核CPU。编译RK3328的U-Boot和内核本身并不吃太多资源但如果你要跑完整的Raspbian软件包构建比如用debootstrap重建根文件系统建议至少给虚拟机分配4核和8GB内存。交叉编译工具链的选择有个讲究。我最初图省事直接用apt装的gcc-aarch64-linux-gnu后来发现U-Boot编译时对工具链版本有隐性的要求某些较新的gcc 12/13版本编译出的SPL会有运行时异常。最后换成了ARM官方提供的GNU-A工具链gcc-arm-9.2-2019.12一路顺畅。我的建议是直接用Linaro或者ARM官方发布的工具链不要用Ubuntu自带的那套。还需要准备几个工具git、make、bison、flex、device-tree-compiler、u-boot-tools里面有mkimage工具用于打包内核镜像、debootstrap和qemu-user-static用于在x86上模拟ARM环境构建根文件系统。# 工具链下载以ARM官方aarch64-none-linux-gnu为例 wget https://developer.arm.com/-/media/Files/downloads/gnu-a/9.2-2019.12/binrel/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu.tar.xz tar -xvf gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu.tar.xz export PATH$PWD/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu/bin:$PATH3.2 U-Boot编译与启动介质分区规划U-Boot的源码直接用Rockchip维护的上游分支就行。我用了u-boot v2017.09-rockchip分支这个版本对RK3328支持最稳定后面更新的版本虽然也能跑但DDR初始化部分偶有回归问题。git clone https://github.com/aw-boing/u-boot-rockchip.git cd u-boot-rockchip export ARCHarm64 export CROSS_COMPILEaarch64-none-linux-gnu- make evb-rk3328_defconfig make -j8编译完成后会在目录里生成几个关键文件u-boot.bin、u-boot.itb、spl/u-boot-spl.bin还有Rockchip专用的trusted firmware和ddr初始化固件。注意RK3328的启动需要trusted firmwareATF所以你还得单独编译ARM Trusted Firmwaregit clone https://github.com/ARM-software/arm-trusted-firmware.git cd arm-trusted-firmware make PLATrk3328 CROSS_COMPILEaarch64-none-linux-gnu-生成的bl31.elf会在后面打包镜像时用到。最方便的方式是直接用Rockchip的打包脚本它会把U-Boot、ATF、DDR固件打包成完整的idbloader.img和u-boot.itb放进SD卡的第一个分区。分区规划上我按工业产品的习惯分了三个分区第一个是FAT32的boot分区512MB放U-Boot、内核镜像、设备树文件第二个是ext4的根文件系统分区至少4GB我用的是16GB SD卡第三个是ext4的数据分区单独挂载方便后续固件升级时不影响系统区。3.3 内核移植与关键驱动配置内核移植这块我重点讲配置。Rockchip在mainline Linux里有比较完整的RK3328支持我用的是Linux 6.1 LTS内核加上Rockchip的bsp补丁包。主要需要开启的配置项如下# 架构和平台 CONFIG_ARCH_ROCKCHIPy CONFIG_ARM64y # 必备驱动 CONFIG_MMC_DW_ROCKCHIPy # eMMC/SD卡控制器 CONFIG_ROCKCHIP_IODOMAINy # IO电压域控制 CONFIG_ROCKCHIP_PM_DOMAINSy # 电源域 CONFIG_PHY_ROCKCHIP_INNO_USB2y # USB 2.0 PHY CONFIG_PHY_ROCKCHIP_TYPECy # Type-C PHY如果有 CONFIG_ROCKCHIP_THERMALy # 温度传感器 CONFIG_ROCKCHIP_WATCHDOGy # 硬件看门狗 # 以太网 CONFIG_ROCKCHIP_GMACy # 千兆MAC CONFIG_PHY_REALTEKy # 板载PHY芯片我板卡用的是RTL8211F编译时没有用全默认配置而是基于arch/arm64/configs/defconfig修改这样能保证基础驱动都在。编译命令export ARCHarm64 export CROSS_COMPILEaarch64-none-linux-gnu- make defconfig # 修改配置 make menuconfig # 应用上述配置项后 make -j8 Image dtbs编译出来的Image和dtb文件rk3328-evb.dtb或厂商板子对应的dtb拷贝到boot分区即可。我这里要特别提醒一个容易踩的坑RK3328的GMAC千兆网卡必须正确配置PHY的时钟源和复位引脚否则会出现链路能识别但ping不通的诡异问题。你的板子原理图上PHY芯片的reset接了哪个GPIO必须在设备树中明确写出来。3.4 文件系统改造用debootstrap重建Raspbian体验这是整个移植过程中最见功夫的部分。Raspbian的成品镜像里有很多树莓派特有的配置我们不能直接用但可以用debootstrap从Debian仓库拉一套全新的命令行基础系统然后在这个基础上叠加Raspbian的软件仓库和优化。具体步骤# 在x86主机上创建目标根文件系统 mkdir -p rootfs debootstrap --archarm64 --foreign bullseye rootfs http://archive.raspbian.org/multiarch/ # 因为架构不同需要用qemu模拟 sudo cp /usr/bin/qemu-aarch64-static rootfs/usr/bin/ sudo chroot rootfs /debootstrap/debootstrap --second-stage在chroot环境里面需要修改几个关键点/etc/apt/sources.list换成Raspbian的软件源raspbian.raspberrypi.org同时加上瑞芯微需要的第三方源。安装raspberrypi-bootloader-nokernel和raspberrypi-ui-meta来获得树莓派的工具集和桌面环境但不安装内核包。把firmware-nonfree、raspberrypi-sys-mods这些包装上其中包含了不少有用的配置脚本和udev规则。加入wiringpi的替代品——我装的是wiringpi-rk3328社区有一版针对Rockchip魔改的wiringpi这样已有的树莓派GPIO代码就能直接跑。根文件系统改完后再把boot分区的内容整理好boot/ ├── idbloader.img # U-Boot的SPL部分 ├── u-boot.itb # U-Boot主程序ATF ├── Image # 内核镜像 ├── rk3328-evb.dtb # 设备树 └── extlinux/ └── extlinux.conf # U-Boot的启动配置文件extlinux.conf是U-Boot读取的标准启动配置文件内容大致如下label kernel kernel /Image fdt /rk3328-evb.dtb append root/dev/mmcblk0p2 rw rootwait consolettyS2,1500000n8注意console参数RK3328的调试串口默认是UART2波特率1500000这个波特率不是常见的115200在串口终端工具里别设错了。4. 常见问题与排查技巧实录4.1 启动卡死U-Boot阶段黑屏无输出遇到最多的就是上电后完全没有串口输出。排查思路按顺序来第一确认串口线接的是不是调试串口RK3328的调试串口默认是UART2一般引在板子上的排针别接错了第二确认波特率1500000这个值很多串口工具默认列表里没有需要手动输入第三检查idbloader.img有没有刷对Rockchip的SPL对DDR初始化很敏感如果你用的是非对应版本的ddr.bin会卡在DDR training阶段表现为完全无输出或者全是乱码。如果你用的是官方evb-rk3328_defconfig编译出来的U-Boot而板卡是第三方厂商的卡死概率很高。因为DDR配置和PMIC配置都不同。这时候最靠谱的办法是找板卡厂商要他们的U-Boot源码或者编译好的idbloader一般厂商在出厂固件里就有用rkimagetool工具可以直接从固件里提取。4.2 内核引导panic设备树中遗漏了关键节点有一次我在移植时发现内核能启动到一半但挂载根文件系统时报错“VFS: Unable to mount root fs”。一开始怀疑是内核里没编译ext4模块后来排查发现是设备树里eMMC/SD控制器节点没写对导致mmcblk0这个设备根本没有创建出来。我检查自己手写的设备树发现遗漏了cru时钟管理单元和grf通用寄存器文件的引用关系。在RK3328上SD/eMMC控制器的时钟源由CRU管理电压域由IODOMAIN寄存器控制这些节点必须在设备树里正确关联。如果拿不准最稳妥的办法是参考Rockchip官方evb板型的dts然后再对照自己板卡原理图删减多余的外设节点而不是完全从零写一个新的。4.3 千兆网口不通PHY复位和时钟配置的坑这个问题的排查过程让我印象很深。板子上电后网口灯亮但是ifconfig看不到link。用ethtool eth0查看结果是“no link”。用示波器量PHY芯片的时钟发现25MHz的参考时钟根本没有。查设备树发现我漏配了PHY的时钟源和复位引脚。在RK3328的evb板型上RTL8211F的复位引脚接的是GPIO2_C3时钟源由外部晶振提供。但我的工业底板上走了不同的设计用的是SoC提供的refclk输出并且复位引脚接的是GPIO3_A7。我没有对应改设备树导致PHY没有工作。正确的做法是gmac2io { phy-mode rgmii; clock_in_out input; assigned-clocks cru SCLK_MAC2IO; assigned-clock-rates 500000000; snps,reset-gpio gpio3 RK_PA7 GPIO_ACTIVE_LOW; snps,reset-active-low; snps,reset-delays-us 0 10000 50000; };另外还要把gmac2io对应的IO电压域设置为3.3V或2.5V取决于PHY芯片否则信号电平不匹配也会引起丢包。4.4 硬盘休眠唤醒失败工业场景的电源管理特例这个不算移植过程中的问题而是移植完成后做老化测试时发现的一个现象。板子外接了一块SATA固态硬盘在系统空闲一段时间后硬盘会自动休眠但唤醒时经常失败系统日志里报ATA link reset错误。后来定位发现是U-Boot或内核的PM域配置问题给SATA控制器供电的电源域在休眠时被关掉了却没有正确唤醒。解决方法是把SATA控制器的电源域忽略强制常开sata { status okay; pm_qos 1; // 跳过电源域自动关闭 };4.5 常见问题速查表现象可能原因排查手段解决方案上电无串口输出波特率/串口号错误检查硬件连接和串口参数设置1500000波特率确认UART2无输出且乱码DDR初始化失败U-Boot SPL阶段错误换用板卡厂商的idbloader启动停止在“Starting kernel...”设备树或ATF版本不匹配检查串口完整日志更新ATF确认bl31.elf与U-Boot配套内核panic看不到文件系统根文件系统分区不对查看mmcblk设备节点检查设备树SD/eMMC节点网口无链路PHY未复位或时钟异常示波器量时钟、量复位电平补全设备树GMAC/PHY节点USB 3.0设备识别不稳定信号完整性或供电不足观察dmesg USB错误检查原理图IO电压域配置桌面环境启动黑屏GPU驱动未安装检查cgroups和drm相关驱动安装rockchip-mali驱动包5. 性能调优与工业场景适配5.1 启动时间优化从20秒压到3.5秒移植跑通只是第一步真正要作为工业设备服役启动速度是个硬指标。测试时整套系统的启动时间大约19.6秒分析时间分布后主要瓶颈在U-Boot阶段接近5秒DDR training加扫描启动介质内核启动加系统初始化约10秒桌面环境启动约4秒。先处理U-Boot阶段。Rockchip的BootROM在扫描启动介质时有固定的等待时间可以在U-Boot配置里裁剪掉无用介质的扫描。因为产品固定用eMMC启动我直接关掉了SD卡和USB启动支持并把U-Boot的启动延迟bootdelay设为0。CONFIG_BOOTDELAY-2 # 立即执行启动命令 CONFIG_SD_BOOTn # 关闭SD卡启动扫描 CONFIG_USB_BOOTn # 关闭USB启动扫描 # 在boot命令里直接用fdt和kernel不扫描bmp等资源内核阶段的优化主要靠裁剪内核配置。把不需要的模块全部编译成模块而不是内建减少内核镜像体积和解压时间把文件系统从ext4换成f2fs日志写入更快关闭PSIPressure Stall Information和cgroup v1的某些统计。这些改动让内核解压加初始化压缩了2.6秒。用户空间阶段的优化用的是systemd自带的分析工具systemd-analyze blame看哪个服务耗时最长。最终把蓝牙服务、打印服务、avahi-daemon禁用掉再把显示管理器换成轻量级的lightdm配openbox桌面启动时间压到了1.1秒左右。整合下来从冷启动到桌面可用现在稳定在3.5秒左右。5.2 工业接口的软件适配看门狗与串口权限工业设备最不能出问题的就是稳定性我重点做了两块硬件看门狗和系统崩溃自动恢复。RK3328内置了看门狗DW Watchdog在内核配置里打开CONFIG_ROCKCHIP_WATCHDOG后系统启动后会自动加载watchdog驱动。在用户空间我用systemd的watchdog服务来管理[Unit] DescriptionHardware Watchdog Reset [Service] ExecStart/sbin/watchdog -t 5 -T 30 /dev/watchdog Restartalways这套机制能保证即使某个应用进程卡死systemd的WatchdogSec超时后也能触发内核调用硬件看门狗复位系统。串口权限方面很多工业传感器通过串口连接但Linux下普通用户默认没有访问串口设备的权限。我写了一个udev规则把ttyS和ttyUSB设备的组改成dialout并给dialout组加rw权限KERNELttyS[0-9]*, GROUPdialout, MODE0660 KERNELttyUSB[0-9]*, GROUPdialout, MODE0660 KERNELttyACM[0-9]*, GROUPdialout, MODE0660同时把用户加到dialout组里这样就不需要sudo也能操作串口了。5.3 桌面环境与Raspbian生态的融合体验移植完成后的桌面环境比预期要顺滑。Raspbian默认的桌面是LXDE基于Openbox窗口管理器在RK3328的Mali-450 GPU上跑得比较流畅。我额外装了xcompmgr做窗口合成配合轻量级主题日常操作基本没有卡顿感。软件生态这块是Raspbian移植的最大红利。装Python库直接pip install装Node.js直接apt install nodejs用Docker跑容器也没问题需要额外安装docker.io并配置iptables。我测试过在RK3328上跑Node-RED、Mosquitto MQTT broker、InfluxDB和Grafana性能完全可以支撑中小规模的工业物联网网关场景。那个社区魔改的wiringpi-rk3328库也很给力兼容树莓派的GPIO编程接口也就是说原有控制LED、读取传感器、PWM输出的代码只需要在编译时换个头文件路径基本不用改逻辑就能跑。再加上Raspbian里自带的PiGPIO库I2C、SPI、PWM这些接口都很好用。6. 移植经验复盘与进一步扩展思路6.1 整个项目的时间投入与阶段复盘我把整个移植过程复盘了一遍总耗时大约两周。第一周主要做的是启动链路打通——编译U-Boot、ATF、内核把系统跑起来。第二周做的是软件适配和稳定性测试。如果后续有朋友要复现这个时间应该可以大幅压缩因为这次踩过的坑我都写成文档了。整个项目最耗时的不是编译本身而是问题定位。U-Boot无输出、网口不通、SATA唤醒失败每个问题的定位排查都花了一到两天。我的体会是前期花在阅读原理图、研究设备树、对比厂商参考设计上的时间最终都会在调试阶段加倍省回来。别急着编译先把板卡的核心外设和SoC上的对应引脚关系理清楚能省掉大量无用功。6.2 从树莓派体系迁移到RK3328的通用方法论总结这次移植我觉得搞定这类给ARM开发板移植发行版的工作有一个通用的方法论。首先搞清楚SoC的启动链画一张启动流程图标出每个阶段的代码在哪、配置在哪、日志在哪。其次不要急于求成把能启动和能正常工作分成两个里程碑。能启动的唯一标准是看到内核日志正常输出不用管桌面能不能起来能正常工作的标准是外设全部驱动起来、软件栈跑通。最后任何一步出问题先怀疑设备树再怀疑驱动最后才怀疑内核代码本身。对于同时接触树莓派和Rockchip平台的开发者我的建议是把设备树当成你的第二语言。树莓派的config.txt和overlay机制虽然方便但也把你和底层细节隔离开了。RK3328这种纯设备树驱动的平台反而能让你把每个外设的工作原理学明白。这件事做完我的感受是自己的底层能力上了一个台阶。6.3 这个项目的延展可能性从网关到边缘计算系统跑稳之后我一直在想这类RK3328工业板还能怎么用。它的四核A53性能虽然不算强但配合千兆网口、USB 3.0、PCIe接口潜力被低估了。目前我在这块板子上跑了两个实际项目一个是智慧工厂里的Modbus TCP网关负责采集十几台PLC的数据通过MQTT上传到服务器另一个是视觉检测的预处理节点用板子上的USB 3.0接工业相机抓帧跑OpenCV做简单缺陷检测只把判定结果发给后端算法服务器。我的体会是这类双系统移植的价值不只是把树莓派软件跑过来这么简单而是给了企业客户一个把原型项目落地到工业级硬件的低成本路径。原型阶段用树莓派快速开发批量部署时无缝迁移到RK3328工业板软件不用重写硬件稳定性却提升了一个档次。最后分享一个小技巧做完移植后一定要把整套U-Boot、内核、设备树和根文件系统做成一个自动构建脚本存进Git仓库。我后来用GitHub Actions做了一套CI每次改代码后自动交叉编译自动打包成固件镜像。从此再也不用担心这套固件是谁哪天编译的了这种问题生产环境刷的每一版镜像都能追溯到源码提交记录。这个习惯可能比移植本身更值钱。
返回列表