Files
Docs/DevLogs/Day1.md
2025-12-31 16:18:28 +08:00

267 lines
8.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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`