EASY-EAI 编译环境的部署与更新
1.1 EASY-EAI 编译环境的部署
1.1.1 EASY-EAI 编译环境概述
EASY-EAI 编译环境是自主开发的在线编译环境(开发板在线),用于建立 PC 与板卡之间的实时同步映射关系,使 PC 端交叉编译时能够实时链接开发板上的依赖库。它具有以下优点:
(1)解决传统交叉编译器中,由于 PC 与板卡之间依赖库不一致所导致的各种开发问题。
(2)省去用户设置和修改传统交叉编译器环境变量的麻烦。
(3)通过 PC 与板卡之间的实时映射,大幅提高文件传输速度,满足大文件实时传输的需求。
(4)同时支持在开发板上进行本地开发,提高开发方式的灵活性。
**💡 特别说明 **:如果用户公司内部网络将内网与互联网分离(开发者的工作终端无法访问外部互联网),请参考开发者社区中的《EASY-EAI 编译环境离线安装》。无需继续阅读本文档后续内容。
1.1.2 PC 端 Ubuntu 系统环境准备
由于 EASY-EAI 编译环境使用 Ubuntu 的 Docker 容器技术,因此 PC 端主机需要支持 Docker 命令、Docker 镜像等 Docker 容器技术相关软件。
在 PC 端 Ubuntu 系统中,使用以下命令安装 docker 命令。这会从 Ubuntu 或 Ubuntu 的 repo 镜像站点下载并安装 docker 命令。
sudo apt-get remove -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-pluginsudo rm -f /etc/apt/sources.list.d/docker.list*sudo apt-get update -y && sudo apt-get install -y docker.io将用户添加到 docker 组中(这样即可使用非 root 用户权限管理 Docker)。命令如下:
sudo groupadd dockersudo usermod -aG docker $USER要使更改生效,需要重启 PC 端 Ubuntu 系统以应用设置。这样以后在 PC 端 Ubuntu 中使用 docker 命令时即可省略 “sudo”。参考来源:https://docs.docker.com/engine/install/linux-postinstall/
1.1.3 获取 EASY-EAI 编译环境
https://dl.dragonwake.com/download/rv1126b/embedded/images/develop_environment_20260310.tar.gz
下载 EASY-EAI 编译环境工具包 “develop_environment_20250802.tar.gz”(通常推荐使用最新版本)。然后,如下图所示,将其复制并放置到 PC 的 Ubuntu 系统主目录中。

获取 EASY-EAI 编译环境
1.1.4 安装 EASY-EAI 编译环境
解压 EASY-EAI 编译环境工具包,并执行 run.sh 脚本。这样即可完成 EASY-EAI 编译环境的安装和部署。
tar -xvf develop_environment_20250802.tar.gzcd develop_environment/./run.sh 2204结果如下:

**💡 注意 **:首次执行 ./run.sh 2204 时,PC 端虚拟机需要能够访问互联网。EASY-EAI 编译环境安装成功后,即使未连接互联网,也可以通过执行 ./run.sh 2204 反复进入 EASY-EAI 编译环境。
1.1.5 使用 EASY-EAI 编译环境:文件同步
在 EASY-EAI 编译环境中查看 /opt,可以看到它是虚拟机 Ubuntu 系统的主目录。用户可以在这里放置、编辑和编译源代码。

使用 EASY-EAI 编译环境:文件同步
依赖库同步:由于交叉编译工具链与依赖库是分离的,因此需要将开发板(依赖库)单独挂载到 EASY-EAI 编译环境的 /mnt。操作如下:
通过串口调试查看开发板 IP 地址(例如:192.168.3.121)。确认 EASY-EAI 编译环境能够 ping 通后,使用 mount 命令将开发板挂载到 /mnt:
sudo mount -t nfs -o nolock 192.168.3.121:/ /mnt
使用 EASY-EAI 编译环境:文件同步
因此,只要在 EASY-EAI 编译环境中编辑 /mnt 内的文件,就会自动同步到开发板的 rootfs 根目录。
另外,如果觉得手动输入挂载命令比较麻烦,也可以使用预先提供的挂载脚本 load_rootfs:
load_rootfs 192.168.3.119
使用 EASY-EAI 编译环境:文件同步
此外,如果需要编译第三方库,并且该第三方厂商没有购买我司开发板,也可以将已导出的 rootfs.img 加载到 /mnt 中,从而编译该第三方库。

使用 EASY-EAI 编译环境:文件同步
退出 EASY-EAI 编译环境时,执行 exit 命令。
exit如果需要再次进入 EASY-EAI 编译环境,在主机上再次执行 ./run.sh 脚本。
./run.sh 2204关于 EASY-EAI 编译环境的其他使用技巧,请阅读《easyeai-compiler 使用技巧》一文。该文章介绍了【常见异常处理】、【第三方闭源库编译】以及【多人同时调试】等使用技巧。
1.2 开发环境更新
1.2.1 EASY-EAI 编译环境更新
如果需要更新 EASY-EAI 编译环境,请下载最新的 develop_environment_xxx.tar.gz 并重新解压,先执行其中的 clear.sh 2204,然后再执行 ./run.sh 2204。
1.2.2 工具链依赖库更新
由于编译工具链的依赖库部署在硬件板卡上,因此只需按照《固件烧录与更新》的步骤更新板卡系统固件,即可完成开发工具链的更新。
2 ADB、串口、SSH 调试
2.1 ADB 调试
ADB 调试使用 USB-ADB 接口。(如果 Windows 中没有 USB-ADB 驱动,则需要安装驱动。)
使用 USB Type-C 线缆连接 PC 与 EASY EAI Nano-TB。相关硬件接口如下图所示。

ADB 调试
**💡 注意 **:如果已经切换到【USB3.0 模式】,ADB 功能将失效。此时 ADB 接口仅具备【固件烧录(刷写)功能】。
2.1.1 ADB 设备分配(挂载)
首先进入 Ubuntu 系统。将 ADB 设备分配到 Ubuntu 侧有“自动分配”和“手动分配”两种方式。
自动分配(被动):虚拟机处于启动状态,且 ADB 线缆未连接(或板卡未上电)时。连接线缆(或板卡上电)后,会自动弹出如下图所示的窗口。

ADB 设备分配(挂载)
手动分配(主动):虚拟机未启动时,ADB 已经由 Windows 侧控制。此时需要按照下图手动将 ADB 设备挂载到虚拟机侧(这种方式大约需要 20 秒,ADB 环境才会准备完成)。

ADB 设备分配(挂载)
最后,请确认 ADB 设备是否已如图所示被虚拟机正确识别(挂载)。

ADB 设备分配(挂载)
2.1.2 通过 ADB 进入板卡控制台
使用快捷键【Ctrl + Alt + T】打开终端,并在终端中输入 “adb shell”。如果显示如下图所示的界面,表示已作为 root 用户成功登录开发板控制台环境。
adb shell
通过 ADB 进入板卡控制台
2.1.3 退出 ADB 环境
执行 exit 命令,即可退出板卡环境并返回 Ubuntu 本地环境。
exit
退出 ADB 环境
2.2 串口调试
2.2.1 关于连接(接线)
EASY EAI Nano-TB 支持使用串口通信进行调试。相关硬件接口如下图所示。

关于连接(接线)
串口被 Windows 正常识别后,可以在设备管理器中查看具体的 COM 端口号(例如:COM7)。请参考下图。

关于连接(接线)
2.2.2 MobaXterm 使用步骤
下面说明如何使用 MobaXterm 打开调试串口(COM7)。 从左上方菜单选择 “Session”,在连接类型中选择 “Serial”,然后选择串口为 COM7,并将 speed 设置为 1.5 Mbps。

MobaXterm 使用步骤
点击 “OK” 打开串口。请参考下图。

MobaXterm 使用步骤
打开后,会显示 EASY EAI Nano-TB 从上电开始的所有日志信息。请参考下图。

MobaXterm 使用步骤
系统完全启动后,可以输入 shell 命令进行调试。如下所示。

MobaXterm 使用步骤
2.2.3 用户名与密码
EASY EAI Nano-TB 用户名:nano
EASY EAI Nano-TB 密码:123456
2.3 SSH 调试
2.3.1 关于连接(接线)
EASY EAI Nano-TB 可以使用 MobaXterm 等 SSH 远程桌面登录工具进行调试。首先,使用网线将 EASY EAI Nano-TB 的千兆以太网口连接到与路由器 LAN 口相连的交换机,或直接连接到路由器的 LAN 口。请参考下图。

关于连接(接线)
同时也连接串口。

关于连接(接线)
通过串口通信登录 EASY EAI Nano-TB,执行 ip addr 命令,查看 eth0(有线 LAN)和 wlan0(无线 LAN)由路由器动态分配的 IP 地址。
ip addr确认结果中,分配到的 IP 地址分别如下。

关于连接(接线)
【eth0】— IP 地址:192.168.3.86,子网掩码 (24):255.255.255.0
【eth1】— 由于未连接网线,因此无 IP 信息
【wlan0】— 由于未连接,因此无 IP 信息
使用这些 IP 地址,在 PC 与板卡之间相互执行 ping。只有 ping 通(确认通信正常)后,才可以通过 SSH 登录。
2.3.2 MobaXterm 使用步骤
下面说明如何使用 MobaXterm 进行 SSH 连接。
从左侧菜单选择 “Session”,在连接类型中选择 “SSH”。输入板卡任一网络接口(这里以 eth0 为例)的 IP 地址,最后点击 “OK”。请参考下图。

MobaXterm 使用步骤
首次连接时,SSH 客户端(PuTTY)会根据 SSH 主机的 IP 地址等信息生成 SSH 密钥(主机密钥),并记录 SSH 主机与对应 IP 地址之间的绑定关系。如果 SSH 主机的 IP 地址发生变化,或其他 SSH 主机使用了此前记录的 IP 地址,导致 SSH 主机与 IP 地址不匹配,可能会无法连接。此时需要在客户端(PuTTY)侧手动清除保存的 SSH 主机与 IP 地址绑定信息。具体清除方法请根据所使用的 SSH 客户端自行查询。
点击 “Accept(同意)” 后,将要求输入登录信息。请参考下图。

MobaXterm 使用步骤
2.3.3 用户名与密码
EASY EAI Nano-TB 用户名:nano
EASY EAI Nano-TB 密码:123456
3 交叉编译、本地编译与自动启动
3.1 交叉编译
3.1.1 优点与缺点
优点:
使用 x86 架构 CPU 进行编译,因此编译速度快。
源代码编辑方便,支持 VS Code、Qt Creator 等各种 IDE 作为开发环境。
缺点:
需要安装并构建(部署)编译环境。
程序调试和执行操作与本地编译相比不够直观(步骤多一步)。
3.1.2 EASY-EAI 编译环境概述
EASY-EAI 编译环境是自主开发的在线编译环境(开发板在线)。它在 PC 端和板卡端之间建立实时同步的映射关系,保证 PC 端进行交叉编译时,能够实时链接开发板上的依赖库。
3.1.2.1 安装与部署方法
与解压工具链并设置系统环境变量的传统交叉编译环境相比,EASY-EAI 编译环境部署更加简单,并可避免各种兼容性问题。
3.1.2.2 挂载嵌入式设备(开发板)
首先,执行 run.sh 脚本进入 EASY-EAI 编译环境。

接着,使用串口调试查看设备 IP 地址。

返回 EASY-EAI 编译环境,对开发板执行 ping 以确认通信。ping 通后,使用 IP 地址,通过 mount 命令将开发板的 rootfs(根目录)挂载到 EASY-EAI 编译环境的 /mnt。命令如下:
sudo mount -t nfs -o nolock 192.168.10.194:/ /mnt
挂载嵌入式设备(开发板)
在 EASY-EAI 编译环境中编译可执行程序,并将其复制到 /mnt 中后,会自动同步到开发板的 rootfs(根目录)。
3.1.3 常见编译方式示例
链接:
这里提供了 4 种常见编译方式的示例。

常见编译方式示例
每个示例中都包含如下所示的 build.sh 脚本和源代码文件。

常见编译方式示例
进入任意示例目录,并在其中执行 ./build.sh,即会生成 hello 文件。

常见编译方式示例
随后,在 EASY-EAI 编译环境中,只需将生成的文件复制到 /mnt 下任意子目录中即可。

常见编译方式示例
通过串口调试登录板卡,进入刚才复制 hello 文件的目录。如下所示:
cd /userdata/执行 ls 命令查看目录,可以看到 hello 文件已经同步完成。
ls
常见编译方式示例
直接执行 hello 文件,即可查看运行结果。
./hello
常见编译方式示例
3.1.4 常见编译方式说明
从映射关系可以看出,EASY-EAI 编译环境中的 /mnt 目录就是开发板的根目录本身。交叉编译工具的依赖库全部位于开发板上,因此只需要在编译器中将 /mnt 指定为 sysroot 即可。
GCC / G++:
aarch64-linux-gnu-gcc --sysroot=/mnt hello_world.c -o helloaarch64-linux-gnu-g++ --sysroot=/mnt hello_world.cpp -o helloCMAKE:只需在 CMakeList.txt 文件中写入以下 include 语句即可。
include ($ENV{HOME}/configs/cross.cmake)QMAKE:由于 qmake 工具直接安装在开发板上,因此可以从 EASY-EAI 编译环境中直接执行 qmake。命令示例如下。
/mnt/usr/bin/qmake xxxxxx.promake3.2 本地编译
3.2.1 优点与缺点
优点:
可以直接将开发板当作单板计算机(超小型 PC)使用,免去繁琐的应用部署工作。
缺点:
由于使用 rv1126B 的 CPU 进行编译,性能相对较低,编译速度较慢。
源代码编辑困难,只能使用原生 vi 编辑器,无法使用各种 IDE。
3.2.2 使用方法
通过串口调试或 SSH 等方式登录开发板控制台(后台),将开发板直接当作安装了 Ubuntu 系统的 PC 使用。
3.3 自动启动设置
3.3.1 概述
自动启动涉及 4 个脚本文件,分别是 rc.local、S99_userapp、start_app.sh、stop_app.sh。
3.3.1.1 脚本说明:
/etc/rc.local:该脚本是在 Linux 文件系统启动后最先被调用的程序。它会按照名称顺序依次调用 /etc/init.d/ 下的所有脚本。(例如:A41 会先于 S41 被调用,S41 会先于 S99 被调用)
/etc/init.d/S99_userapp:这是用于管理用户应用程序启动/停止的专用脚本。
/userdata/start_app.sh:用户应用程序的启动逻辑通常写在这里,内容可自由修改。
/userdata/stop_app.sh:用户应用程序的退出逻辑通常写在这里,内容可自由修改。
3.3.1.2 调用顺序与关系:

调用顺序与关系:
3.3.2 详细说明:
3.3.2.1 /etc/init.d/S99_userapp
这是系统内置的启动脚本,可根据需要自行修改。
#!/bin/sh
if [ -e /userdata/apps/run.sh ];then cd /userdata/apps && ./run.shfi3.3.2.2 /userdata/stop_app.sh
#!/bin/sh# Kill your app when shutdown system. For example:# killall facialGate3.3.3 操作指南:
3.3.3.1 注意事项说明:
通常,用户程序一旦启动就不会退出,因此需要在程序执行命令末尾添加 “&”,使其在后台运行。这样可以避免阻塞(停止)其他启动脚本的执行。
/qSolu-facialGate &如果用户自己的动态库(共享库)位于用户空间中,也可以在启动脚本中添加环境变量。
source /etc/profileexport LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/userdata/mylib/如果需要自动启动的程序是 Qt 程序,并且 Qt 环境变量需要自定义设置,也可以继续设置 Qt 环境变量。
export QT_QPA_FB_DRM=1export QT_QPA_PLATFORM=linuxfb:rotation=0#export QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=/dev/input/event5:rotate=180