Init: 导入开发日志和项目文档

This commit is contained in:
Kevin Wong
2025-12-31 16:18:28 +08:00
commit bcebc7e316
32 changed files with 9208 additions and 0 deletions

248
DevLogs/Day16.md Normal file
View File

@@ -0,0 +1,248 @@
# Day 16 - 固件重刷后问题修复与自启动配置
**日期**: 2025-12-16
**主题**: 解决固件重刷后问题、配置自启动、公网服务器配置
---
## 问题记录
### 问题 1程序无法执行 (`not found`)
**现象**
```bash
root@(none):~# /tmp/avaota_client
/bin/sh: /tmp/avaota_client: not found
```
**原因**
- 程序编译时指定的动态链接器路径为 `/lib32/ld.so.1`
- 固件实际的 musl 动态链接器在 `/lib/ld-musl-riscv32.so.1`
- 重刷固件后,之前手动创建的符号链接丢失
**解决方案**
```bash
ln -sf /lib/ld-musl-riscv32.so.1 /lib32/ld.so.1
```
**永久修复**
修改了 `avaota_app_demo/src/Makefile`,添加动态链接器路径:
```makefile
# 指定正确的动态链接器路径,避免开发板上需要手动创建 /lib32/ld.so.1 符号链接
LDFLAGS += -Wl,--dynamic-linker=/lib/ld-musl-riscv32.so.1
```
---
### 问题 2JFFS2 分区满 + overlay 只读
**现象**
```
Your JFFS2-partition seems full and overlayfs is mounted read-only.
Please try to remove files from /overlay/upper/... and reboot!
```
**原因**
- 程序崩溃时在 `/overlay/upper/core` 生成了 **1.5MB 的 core dump 文件**
- overlay 分区只有 **512KB**,被撑满后变成只读
**解决方案**
```bash
rm -rf /overlay/upper/core
reboot
```
---
### 问题 3摄像头初始化失败
**现象**
```
[Camera][E] AW_MPI_SYS_Init failed
[ERROR] [CAM] Init failed
Segmentation fault (core dumped)
```
**原因**
- 程序崩溃时 MPP 资源未正确释放
- 再次运行时资源冲突导致初始化失败
**解决方案**
重启开发板,重置 MPP 系统状态。
---
## 自启动配置
### 系统信息
- **Init 系统**: BusyBox init
- **文件系统**:
- `/overlay`: 512KB JFFS2很小不适合存放大文件
- `/mnt/UDISK`: 18MB JFFS2可用于存放程序
- `/mnt/extsd`: 14.6GB FATSD卡
### ✅ 成功方案:使用 load_script.conf
**1. 程序部署到 UDISK**
```bash
mkdir -p /mnt/UDISK/app
cp /tmp/avaota_client /mnt/UDISK/app/
chmod +x /mnt/UDISK/app/avaota_client
```
**2. 创建 init 脚本**
```bash
cat > /etc/init.d/avaota << 'EOF'
#!/bin/sh /etc/rc.common
START=99
start() {
sleep 15
ulimit -c 0
/mnt/UDISK/app/avaota_client > /tmp/avaota.log 2>&1 &
}
stop() {
killall avaota_client
}
EOF
chmod +x /etc/init.d/avaota
```
**使用方法**
- 停止:`/etc/init.d/avaota stop`
- 启动:`/etc/init.d/avaota start`
**3. 添加到启动列表**
```bash
echo "avaota" >> /etc/init.d/load_script.conf
```
**4. 确保 crond 也在启动列表**(可选):
```bash
echo "cron" >> /etc/init.d/load_script.conf
```
### ❌ 不要使用的方案
- **rc.final** - 会导致 SD 卡检测失败,需要重刷固件
- **crontab @reboot** - BusyBox crond 不支持此语法
### 注意事项
- **WiFi 自动连接**:系统会自动保存 WiFi 配置到 `/etc/wifi/wifimg.config`
- **启动延迟**`sleep 15` 等待系统就绪(音频需要更长时间初始化)
- **禁用 core dump**`ulimit -c 0` 防止撑满 overlay
---
## WiFi 配置
### 手动连接
```bash
wifi -s # 扫描
wifi -c SSID PASSWORD # 连接
ifconfig wlan0 # 查看IP
```
### 自动连接
WiFi 配置文件位置:`/etc/wifi/wifimg.config`
如需自动连接,建议将 wifi 连接命令加入启动脚本。
---
## Makefile 修改记录
文件:`avaota_app_demo/src/Makefile`
```diff
# 系统动态库
+# 指定正确的动态链接器路径,避免开发板上需要手动创建 /lib32/ld.so.1 符号链接
+LDFLAGS += -Wl,--dynamic-linker=/lib/ld-musl-riscv32.so.1
LDFLAGS += -Wl,-Bdynamic -lasound -lpthread -lm -lrt -ldl -lz -static-libstdc++
```
---
### 问题 4rc.final 导致 SD 卡检测失败(严重)
**现象**
- 创建 `/etc/init.d/rc.final` 后重启
- SD 卡设备 `/dev/mmcblk1` 完全消失
- `/mnt/extsd/` 为空,无法挂载
- 删除 rc.final 并重启后问题依然存在,需要重刷固件
**原因**
- rc.final 执行时机过早,可能干扰了 SD 卡驱动初始化
- 或 rc.final 中的脚本阻塞了系统启动流程
**结论**
- **不要使用 `/etc/init.d/rc.final` 实现自启动**
- 需要寻找其他自启动方案(如 crontab @reboot、修改 rc.local 等)
---
## 公网服务器配置
### 服务器地址修改
将服务器地址从内网 IP 改为公网 IP支持 frp 内网穿透:
**修改 `main.cpp`**
```cpp
// 修改前
const char* SERVER_HOST = "192.168.110.188";
// 修改后
const char* SERVER_HOST = "8.148.25.142";
```
### frp 配置Windows
**frpc.toml**
```toml
serverAddr = "8.148.25.142"
serverPort = 7000
auth.token = "你的token"
[[proxies]]
name = "avaota_server"
type = "tcp"
localIP = "127.0.0.1"
localPort = 8081
remotePort = 8081
```
### WiFi 热点切换
开发板支持连接不同的 WiFi 热点:
```bash
# 断开当前连接
wifi -d
# 连接新热点(例如 iPhone 热点)
wifi -c Kevin qazwsx1988
# 确认连接
ifconfig wlan0
```
系统会自动保存最后连接的 WiFi 配置。
---
## 已完成
- [x] 重新编译程序(包含正确的动态链接器路径)
- [x] 配置自启动功能(使用 load_script.conf 方案成功)
- [x] 配置 WiFi 自动连接(已确认系统自动保存配置)
- [x] 修改服务器地址支持公网访问frp 内网穿透)
- [x] 测试 iPhone 热点连接
---
## 相关文档
- [Day 9 - musl 工具链修复](file:///d:/CodingProjects/Antigravity/NaviGlass/Docs/Day9.md)
- [Day 15 - 导航性能优化](file:///d:/CodingProjects/Antigravity/NaviGlass/Docs/Day15.md)
- [任务清单](file:///d:/CodingProjects/Antigravity/NaviGlass/Docs/task_complete.md)