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

5.9 KiB
Raw Permalink Blame History

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

问题 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,被撑满后变成只读

解决方案

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

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 dumpulimit -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++

问题 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

// 修改前
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 热点连接

相关文档