# 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)