5.9 KiB
5.9 KiB
Day 16 - 固件重刷后问题修复与自启动配置
日期: 2025-12-16
主题: 解决固件重刷后问题、配置自启动、公网服务器配置
问题记录
问题 1:程序无法执行 (not found)
现象:
root@(none):~# /tmp/avaota_client
/bin/sh: /tmp/avaota_client: not found
原因:
- 程序编译时指定的动态链接器路径为
/lib32/ld.so.1 - 固件实际的 musl 动态链接器在
/lib/ld-musl-riscv32.so.1 - 重刷固件后,之前手动创建的符号链接丢失
解决方案:
ln -sf /lib/ld-musl-riscv32.so.1 /lib32/ld.so.1
永久修复:
修改了 avaota_app_demo/src/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,被撑满后变成只读
解决方案:
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:
mkdir -p /mnt/UDISK/app
cp /tmp/avaota_client /mnt/UDISK/app/
chmod +x /mnt/UDISK/app/avaota_client
2. 创建 init 脚本:
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. 添加到启动列表:
echo "avaota" >> /etc/init.d/load_script.conf
4. 确保 crond 也在启动列表(可选):
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 配置
手动连接
wifi -s # 扫描
wifi -c SSID PASSWORD # 连接
ifconfig wlan0 # 查看IP
自动连接
WiFi 配置文件位置:/etc/wifi/wifimg.config
如需自动连接,建议将 wifi 连接命令加入启动脚本。
Makefile 修改记录
文件:avaota_app_demo/src/Makefile
# 系统动态库
+# 指定正确的动态链接器路径,避免开发板上需要手动创建 /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:
// 修改前
const char* SERVER_HOST = "192.168.110.188";
// 修改后
const char* SERVER_HOST = "8.148.25.142";
frp 配置(Windows)
frpc.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 热点:
# 断开当前连接
wifi -d
# 连接新热点(例如 iPhone 热点)
wifi -c Kevin qazwsx1988
# 确认连接
ifconfig wlan0
系统会自动保存最后连接的 WiFi 配置。
已完成
- 重新编译程序(包含正确的动态链接器路径)
- 配置自启动功能(使用 load_script.conf 方案成功)
- 配置 WiFi 自动连接(已确认系统自动保存配置)
- 修改服务器地址支持公网访问(frp 内网穿透)
- 测试 iPhone 热点连接