# Avaota F1 (Tina Linux) 编译与开发完整指南 **版本**:v1.0 **日期**:2025-11-21 **主机环境**:Ubuntu 24.04 LTS **目标平台**:Avaota F1 (全志 V821 / 32-bit RISC-V) --- ## 第一部分:编译环境准备 (针对 Ubuntu 24.04) 由于 Tina Linux SDK 依赖较旧的 32 位库和 Python 2,而 Ubuntu 24.04 已移除这些支持,必须手动修复。 ### 1. 开启 32 位架构支持 ```bash sudo dpkg --add-architecture i386 sudo apt-get update ``` ### 2. 安装基础依赖 ``` sudo apt-get install -y build-essential subversion git-core libncurses5-dev zlib1g-dev gawk flex quilt libssl-dev xsltproc libxml-parser-perl mercurial bzr ecj cvs unzip lib32z1 lib32z1-dev lib32stdc++6 libstdc++6 bison sudo apt-get install -y libc6:i386 libstdc++6:i386 ``` ### 3. 手动安装 libncurses5 (关键) Ubuntu 24.04 源中无此包,需手动下载安装: ``` wget [http://mirrors.kernel.org/ubuntu/pool/universe/n/ncurses/libtinfo5_6.3-2ubuntu0.1_i386.deb](http://mirrors.kernel.org/ubuntu/pool/universe/n/ncurses/libtinfo5_6.3-2ubuntu0.1_i386.deb) wget [http://mirrors.kernel.org/ubuntu/pool/universe/n/ncurses/libncurses5_6.3-2ubuntu0.1_i386.deb](http://mirrors.kernel.org/ubuntu/pool/universe/n/ncurses/libncurses5_6.3-2ubuntu0.1_i386.deb) sudo apt-get install ./libtinfo5_6.3-2ubuntu0.1_i386.deb ./libncurses5_6.3-2ubuntu0.1_i386.deb ``` ### 4. 修复 Python 版本问题 SDK 脚本需要 `python` 命令(指向 Py2 或兼容 Py3): ``` sudo apt-get install python-is-python3 # 或者安装 python2 并建立软链接 ``` ## 第二部分:SDK 全量编译 ### 1. 解压 SDK ``` # 假设压缩包在 Downloads mkdir -p ~/ProgramFiles/avaota_sdk tar -xvf ~/Downloads/tina-v821-v1.2.tar.xz -C ~/ProgramFiles/avaota_sdk ``` ### 2. 初始化环境 ``` cd ~/ProgramFiles/avaota_sdk/tina-v821-release source build/envsetup.sh ``` ### 3. 选择板型 ``` lunch ``` - 在菜单中选择包含 **`v821`** 和 **`avaota_f1`** 的选项(通常是数字 2)。 - 等待配置生成完成 (`configuration written to .config`)。 ### 4. 执行编译 ``` make -j8 或 make -j ``` - **耗时**:约 30-60 分钟。 - **成功标志**:无报错停止,最终出现命令行提示符。 ### 5. 打包固件 (可选) ``` pack ``` - 生成可用于 PhoenixSuit 烧录的 `.img` 文件。 ## 第三部分:C++ 应用程序开发 (核心) ### 1. 编写代码 (`main.cpp`) 在 SDK 外部建立目录: ``` mkdir -p ~/ProgramFiles/avaota_app_demo cd ~/ProgramFiles/avaota_app_demo nano main.cpp ``` 写入测试代码: ``` #include #include int main() { std::cout << "Hello Avaota F1! Running on RISC-V 32-bit!" << std::endl; return 0; } ``` ### 2. 找到正确的编译器 注意:必须使用 32位 工具链,SDK 默认提供的 prebuilt/.../riscv64 是错误的。 正确路径通常在 out 目录下: Bash ``` find ~/ProgramFiles/avaota_sdk/tina-v821-release/out -name "riscv32-unknown-linux-g++" ``` - *典型路径*:`.../out/toolchain/nds32le-linux-glibc-v5d/bin/riscv32-unknown-linux-g++` ### 3. 静态编译 (Static Linking) 为了避免板子上缺少动态库 (`ld-linux...so`),**必须**加上 `-static` 参数。 ``` # 请替换为实际查到的编译器路径 /path/to/riscv32-unknown-linux-g++ -static -o my_app main.cpp ``` ### 4. 验证产物 ``` file my_app ``` - **必须包含**:`ELF 32-bit LSB executable`, `UCB RISC-V`, `statically linked`。 ## 第四部分:部署与运行 (SD卡方式) 由于板子默认未开启 SSH/ADB 网络传输,推荐使用 SD 卡搬运。 ### 1. PC 端操作 将编译好的 `my_app` 复制到 SD 卡。 ### 2. 板子端操作 (串口终端) 插入 SD 卡,在串口终端执行: ``` # 1. 挂载 SD 卡 (如未自动挂载) mount /dev/mmcblk0p1 /mnt/extsd # 2. 复制到内存 (SD卡不支持执行权限,必须拷出来) cp /mnt/extsd/my_app /tmp/ # 3. 赋予权限 chmod +x /tmp/my_app # 4. 运行 /tmp/my_app ``` 预期输出: Hello Avaota F1! Running on RISC-V 32-bit! # Avaota F1 开发环境搭建踩坑与解决方案总结 **日期**:2025-11-21 **平台**:Avaota F1 (全志 V821 / 32-bit RISC-V) **主机环境**:Ubuntu 24.04 LTS --- ## 1. 核心架构与编译错误(最致命) ### ❌ 错误:CPU 架构位数不匹配(64-bit vs 32-bit) * **现象**:在电脑上编译出的程序,传到板子上运行报错 `/tmp/my_app: line 1: syntax error: unterminated quoted string`。 * **原因**:我们一开始使用了 SDK 自带的 **64位** 编译器 (`riscv64-unknown-linux-gnu-g++`),但 Avaota F1 (V821) 的这个固件运行的是 **32位** 的 RISC-V 系统。内核无法识别 64 位程序,Shell 尝试把它当脚本读,导致乱码报错。 * **✅ 解决**:找到了构建系统生成的 **32位** 编译器。 * **正确编译器路径**:`out/toolchain/nds32le-linux-glibc-v5d/bin/riscv32-unknown-linux-g++` ### ❌ 错误:动态链接库缺失(Dynamic Linking) * **现象**:程序在板子上找不到 `ld-linux...so` 或其他库,或者运行报错。 * **原因**:电脑上的编译环境(glibc 版本)与板子上的精简运行环境(可能为 musl 或旧版 glibc)不一致。 * **✅ 解决**:编译时加上 **`-static`** 参数,把所有依赖打包进一个文件,不再依赖板子系统库。 * **命令示例**:`.../riscv32-unknown-linux-g++ -static -o my_app main.cpp` --- ## 2. Ubuntu 编译环境配置错误 ### ❌ 错误:缺少 32 位兼容库 * **现象**:安装 `libc6:i386` 等库时提示找不到包。 * **原因**:Ubuntu 64位系统默认未开启 32 位架构支持。 * **✅ 解决**:执行 `sudo dpkg --add-architecture i386` 并更新源。 ### ❌ 错误:依赖库版本过旧(libncurses5) * **现象**:Ubuntu 24.04 已移除 `libncurses5`,但 SDK 工具链强制需要它。 * **✅ 解决**:手动下载并安装了旧版 Ubuntu (22.04) 的 `.deb` 包(`libtinfo5` 和 `libncurses5`)。 ### ❌ 错误:Python 版本冲突 * **现象**:SDK 脚本报错 `python: command not found`。 * **原因**:Ubuntu 24.04 只有 `python3`,而旧 SDK 脚本还在调用 `python`(默认为 Py2)。 * **✅ 解决**:安装 `python-is-python3` 包,或手动建立 `/usr/bin/python` 指向 `python3` 的软链接。 ### ❌ 错误:缺少构建工具 * **现象**:配置内核 (`lunch` 后自动配置) 时报错 `bison: not found`。 * **✅ 解决**:安装 `bison` 和 `flex`。 --- ## 3. 板端运行与传输错误 ### ❌ 错误:网络传输工具缺失 * **现象**:板子有网,但没有 `ssh` (dropbear没启动), `wget`, `nc`, `adb` (网络模式未开)。 * **原因**:固件被极度精简(BusyBox),文件系统只读,且未预装常用网络工具。 * **✅ 解决**:放弃网络传输,改用 **物理 SD 卡** 搬运文件。 ### ❌ 错误:SD 卡权限问题 * **现象**:直接在 `/mnt/extsd` (SD卡挂载点) 下运行程序报错 `Permission denied`。 * **原因**:SD 卡通常是 FAT32 格式,不支持 Linux 的 `chmod +x`(可执行权限)。 * **✅ 解决**: 1. 将程序 `cp` 复制到内存目录 `/tmp/` 下。 2. `chmod +x /tmp/my_app` 赋予权限。 3. 运行 `/tmp/my_app`。 --- ## 4. 经验教训 ### ❌ 风险操作:`make -j` * **问题**:执行不带数字的 `make -j` 会无限开启编译进程。 * **后果**:在内存较小的电脑上极易导致死机或内存耗尽。 * **建议**:始终指定并发数,如 `make -j8` 或 `make -j16`。 --- ## 🏆 最终验证通过的开发路径 现在你已经拥有了一套**经过实战验证的、坚不可摧的开发流程**: 1. **编写代码**:在 PC 上编写 C++ 代码 (`main.cpp`)。 2. **编译**:使用 **32位编译器** (`nds32le...riscv32-g++`) 加上 **`-static`** 参数。 3. **传输**:PC -> 复制到 SD 卡 -> 插板子 -> 板子终端 `cp /mnt/extsd/my_app /tmp/`。 4. **运行**:板子终端 `chmod +x /tmp/my_app` -> `./tmp/my_app`。