267 lines
8.1 KiB
Markdown
267 lines
8.1 KiB
Markdown
# 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 <iostream>
|
||
#include <unistd.h>
|
||
|
||
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`。
|