嵌入式技术论坛
直播中

青sky

8年用户 1231经验值
擅长:模拟技术
私信 关注
[问答]

使用Cherryusb host加载u盘后shell就不能输入了是为什么?

rt-thread 4.1.1stm32f429ig使用usb_otg_hs,做host_only。在Cherryusb中执行usbh_initialize后的logo为

[2023-08-29 11:28:35.783]# RECV ASCII>
[32m[I/USB] ========== dwc2 hcd params ==========
[0m[32m[I/USB] CID:00001100
[0m[32m[I/USB] GSNPSID:4f54281a
[0m[32m[I/USB] GHWCFG1:00000000
[0m[32m[I/USB] GHWCFG2:229ed590
[0m[32m[I/USB] GHWCFG3:03f403e8
[0m[32m[I/USB] GHWCFG4:17f00030
[0m[32m[I/USB] dwc2 has 12 channels
msh />
[2023-08-29 11:28:41.130]# RECV ASCII>
[32m[I/USB] New full-speed device on Hub 1, Port 1 connected
[0m[32m[I/USB] New device found,idVendor:abcd,idProduct:1234,bcdDevice:0100
[0m[32m[I/USB] The device has 1 interfaces
[0m[32m[I/USB] Enumeration success, start loading class driver
[0m[32m[I/USB] Loading msc class driver
[0m[32m[I/USB] Get max LUN:1
[0m[32m[I/USB] Ep=01 Attr=02 Mps=64 Interval=00 Mult=00
[0m[32m[I/USB] Ep=81 Attr=02 Mps=64 Interval=00 Mult=00
然后再输入任何shell命令都没有响应了。
请教大神那里不对了我已经把栈都加大了。

回帖(2)

bigbangboom

2023-9-3 10:52:55
把shell线程的优先级调到0,看看谁卡住了。
举报

郭大

2023-9-28 09:36:40
29 11:30:56.350]# RECV ASCII>[32m[I/USB] ------ Host Initialization ------[0m[32m[I/USB] Core:2.20a[0m[32m[I/USB] Host:2.20a[0m[32m[I/USB] WCID:WINUSB[0m[32m[I/USB] Vendor-specific class:[0m

如果在使用Cherry USB Host加载U盘后,控制台无法输入命令,这可能是由于USB主机工作时中断服务例程的优先级过高,使得Shell线程的优先级被抢占,无法继续工作。解决这个问题的方法是在初始化USB主机时,将其中断优先级配置得低于Shell线程的优先级,这样Shell线程就不会被抢占了。

在RT-Thread的USB主机驱动框架中,可以通过修改USB主机HAL驱动框架中的中断配置来解决这个问题。具体方法是在usbh_initialize函数中调用HAL_NVIC_SetPriority函数设置USB主机的中断优先级。例如:

```c
void usbh_initialize(void)
{
    /* ... */

    /* configure USB interrupts */
        HAL_NVIC_SetPriority(USB_OTG_HS_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY + 1, 0);
        HAL_NVIC_EnableIRQ(USB_OTG_HS_IRQn);

    /* ... */
}
```

其中configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY是FreeRTOS中用于保护系统调用的最高优先级,因此设置USB中断优先级为它的下一级,保证Shell线程优先级较高,不会被USB中断抢占。

通过此方法,可以使得USB主机和Shell线程能够正常并发运行,从而避免了Shell线程被占用时无法输入命令的问题。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分