4G模组 ECM驱动BUG

Viewed 92

重现步骤

  1. 4G模组先上电开机
  2. K230上电开机 立即正常枚举并联网
  3. 关闭4G模组(此时K230依然是运行中的) - 并重新给4G模组上电 - 触发异常

不报错的尝试

  • K230早于4G上电后 那么4G模组随便怎样重启都可以正常枚举并使用

软硬件版本信息

  • 硬件版本信息 : 01科技K230开发板
  • 软件版本信息 : 镜像名 --> CanMV_K230_01Studio_rtsmart_local_nncase_v2.9.0
  • 开机串口打印版本信息 ↓
    #############SDK VERSION######################################
    SDK : v1.2.2-20250414-164057-moon-ubuntu-69919ab
    nncase: 2.9.0
    ##############################################################
  • SDK是 RT-SMART + CANMV 的工程 参考文档是 ↓
  • 在menuconfig中关闭了micropython的编译选项 直接当成rtos only使用 主要是考虑到后续有可能需要使用micropython 所以没有下载纯rt-smart工程
    image.png
  • USB HOST的menuconfig配置如下 ↓
  • image.png

希望达到的效果

  • 由于使用场景的原因 我无法控制4G模组开机是比我早还是比我晚
  • 希望可以任意开机时序都不报错

错误日志

image.png
image.png

2 Answers
  • 以下是串口的日志

[E/DBG] [FATAL ERROR] Exception 13:Load Page Fault
[E/DBG] scause:0x000000000000000d,stval:0x0000006212705200,sepc:0x00000000001ca5f4
--------------Dump Registers-----------------
Function Registers:
ra(x1) = 0x00000000001ca5e6()
user_sp(x2) = 0x00000000005f74e0()
gp(x3) = 0x00000000003f1218()
tp(x4) = 0x00000000deadbeef()
Temporary Registers:
t0(x5) = 0x00000000005f7528()
t1(x6) = 0x0000000000634403()
t2(x7) = 0x00000000deadbeef()
t3(x28) = 0x00000000003c03f0()
t4(x29) = 0x0000000000000030()
t5(x30) = 0x0000000000000000()
t6(x31) = 0x00000000005f7529()
Saved Registers:
s0/fp(x8) = 0x0000000000634438()
s1(x9) = 0x00000000005f7508()
s2(x18) = 0x0000000000634380()
s3(x19) = 0x00000000005f7638()
s4(x20) = 0x00000000001c5cfc()
s5(x21) = 0x00000000001c56b8()
s6(x22) = 0x00000000004a41a8()
s7(x23) = 0x0000000000426e00()
s8(x24) = 0x00000000004bd81e()
s9(x25) = 0x00000000005f76bc()
s10(x26) = 0x0000000000000004()
s11(x27) = 0x0000000000000004()
Function Arguments Registers:
a0(x10) = 0x8000000200046022()
a1(x11) = 0x00000000005f750a()
a2(x12) = 0x0000000000000000()
a3(x13) = 0x0000000000634441()
a4(x14) = 0x7252726212705200()
a5(x15) = 0x7252726212705200()
a6(x16) = 0x0000000000000008()
a7(x17) = 0x0000000000000030()
sstatus = 0x8000000200046100
Supervisor Interrupt Disabled
Last Time Supervisor Interrupt Disabled
Last Privilege is Supervisor Mode
Permit to Access User Page
Not Permit to Read Executable-only Page
satp = 0x80000000000004bf
Current Page Table(Physical) = 0x00000000004bf000
Current ASID = 0x0000000000000000
Mode = Page-based 39-bit Virtual Addressing Mode
-----------------Dump OK---------------------
riscv64-unknown-linux-musl-addr2line -e rtthread.elf -a -f 00000000001ca5f0
[E/DBG] User Fault, killing thread: usbh_hub0
(rt_object_get_type((rt_object_t)thread) == RT_Object_Class_Thread) assertion failed at function:rt_thread_control, line number:745
riscv64-unknown-linux-musl-addr2line -e rtthread.elf -a -f 0000000000163752

  • 以下是addr2line的结果

moon@ubuntu:~/zj_rtos_k230$ ^C
moon@ubuntu:~/zj_rtos_k230$ ~/.kendryte/k230_toolchains/Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.6.0/bin//riscv64-unknown-linux-gnu-addr2line -e src/rtsmart/rtsmart/kernel/bsp/maix3/rtthread.elf -a -f 00000000001ca5f0
0x00000000001ca5f0
netdev_register
/home/moon/zj_rtos_k230/src/rtsmart/rtsmart/kernel/rt-thread/components/net/netdev/src/netdev.c:89 (discriminator 3)
moon@ubuntu:~/zj_rtos_k230$ ~/.kendryte/k230_toolchains/Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.6.0/bin//riscv64-unknown-linux-gnu-addr2line -e src/rtsmart/rtsmart/kernel/bsp/maix3/rtthread.elf -a -f 0000000000163752
0x0000000000163752
_assert_backtrace_cb
/home/moon/zj_rtos_k230/src/rtsmart/rtsmart/kernel/bsp/maix3/c908/backtrace.c:81
moon@ubuntu:~/zj_rtos_k230$
image.png

我本地拉取最新代码复现到你说的Bug了,问题在于RTT的netdev_unregister没有正确处理好链表变量,netdev_list & netdev_default,这样会导致重新枚举时候netdev_register函数会访问到已经释放的内存。已经将修复的改动推上去了,你可以拉取最新代码再做一下测试。

PS:这个问题需要你插着设备开机,再去拔插才能遇到。如果是开机后,插入设备再拔插就遇不到。因为这时候netdev_list & netdev_default将不会是你当前这个设备,比较tricky的复现路径。

好的 我拉取最新代码测试一下

  1. 4G模组先上电开机
  2. K230上电开机 立即正常枚举并联网
  3. 关闭4G模组(此时K230依然是运行中的) - 并重新给4G模组上电 - 触发异常

对于你的回答,有些疑惑?
01的板子不是一个Type A的USB口,什么叫4G模组先上电开机?什么叫关闭4G模组?你是改了硬件电路图吗?

能否将更详细的描述复现步骤描述下,例如使用了什么命令?每一步都做了什么动作?以便于我本地也能复现到你的问题。

是这样 当我通过typec给K230供电 然后K230通过USBA给4G模组供电的时候会异常 电脑的USB给两个模组同时供不了电 因此我在4G模组和K230之间 使用了一条没有电源的USB线进行连接 4G模组的供电单独由外部的可调电源进行供电 因此4G模组会先上电

什么命令都没输入 唯一的动作就只是单纯的将4G早于k230上电 然后在K230运行的过程中 重启4G模组 就可以复现这个异常了

4G上电并稳定后 -- K230上电并立即枚举 上电到枚举这个间隔不足1S -- 关闭4G电源 -- K230立即打印出 :[E/USB] XactErr
[E/USB] ++Disconnect Detected Interrupt++ (Host) a_host -- 开启4G电源 -- K230异常