Init: 导入开发日志和项目文档
This commit is contained in:
248
DevLogs/Day16.md
Normal file
248
DevLogs/Day16.md
Normal 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
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 问题 2:JFFS2 分区满 + 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 FAT(SD卡)
|
||||
|
||||
### ✅ 成功方案:使用 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++
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 问题 4:rc.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)
|
||||
Reference in New Issue
Block a user