Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
STM32H7
USB
信号量_semaphore
STM32 USB交互卡死
发布于 2022-08-30 10:08:40 浏览:672
订阅该版
使用环境:cherryusb组件+RTT 4.0.3 使用场景: 由于cherryusb未提供直接对接RTT设备层的接口,我们做了一个接口转换实现USB的接口与RTT的设备层进行对接 使用方法: read接口:根据传入的设备名称在cherryusb的的接口列表中查找对应设备,通过IN通道获取数据,100tick超时 write接口:根据传入的设备名称在cherryusb的的接口列表中查找对应设备,通过OUT通道将数据发送出去,100tick超时 USB通道传输函数: 1、获取互斥量,超时时间3000tick 2、配置USB通道,配置发送/接收数据地址 3、等待信号量,根据传入的超时时间等待 4、释放互斥量,结束 ```c int usbh_ep_bulk_transfer(usbh_epinfo_t ep, uint8_t *buffer, uint32_t buflen, uint32_t timeout) { struct dwc2_pipe *chan; int chidx; int ret; chan = (struct dwc2_pipe *)ep; #ifdef CONFIG_USB_DCACHE_ENABLE if (buffer && (((uint32_t)buffer) & 0x1f)) { return -EINVAL; } #endif #if defined(STM32F7) || defined(STM32H7) if ((buffer && (((uint32_t)buffer) & 0x24000000) != 0x24000000)) { USB_LOG_ERR("Fail to alloc mem %p\r\n", buffer); return -EINVAL; } #endif if(!chan->exclsem) { return -EINVAL; } ret = usb_osal_mutex_take(chan->exclsem); if (ret < 0) { rt_kprintf("dwc2 Fail to take muex\r\n"); goto error_out; } ret = dwc2_pipe_waitsetup(chan); if (ret < 0) { goto error_out; } chidx = chan->chidx; chan->num_packets = dwc2_calculate_packet_num(buflen, chan->ep_addr, chan->ep_mps, &chan->xferlen); #ifdef CONFIG_USB_DCACHE_ENABLE if ((chan->ep_addr & 0x80) == 0x00) { usb_dcache_clean((uintptr_t)buffer, buflen); } #endif dwc2_pipe_transfer(chidx, chan->ep_addr, (uint32_t *)buffer, chan->xferlen, chan->num_packets, chan->data_pid); ret = dwc2_pipe_wait(chan, timeout); if (ret < 0) { goto error_out; } #ifdef CONFIG_USB_DCACHE_ENABLE if ((chan->ep_addr & 0x80) == 0x80) { usb_dcache_invalidate((uintptr_t)buffer, buflen); } #endif usb_osal_mutex_give(chan->exclsem); return ret; error_out: chan->waiter = false; dwc2_halt(chidx); usb_osal_mutex_give(chan->exclsem); return ret; } ``` 应用层: 1、接收线程循环调用read接口,说到数据则处理,无数据重新等待 2、有需要发送的数据调用write接口 问题: 1、正常情况下运行没有问题 2、超大数据量,长时间运行后会出现卡在获取信号量的位置 信息: 1、获取互斥量状态,被接收线程占用,hold值为1 2、获取线程状态,所有正常 3、获取定时器状态,线程定时器未运行,超时时间为100 4、增加1条新线索,信号量等待挂起线程为空,没有等待线程 ```c //异常 msh />list_timer timer periodic timeout flag -------- ---------- ---------- ----------- usb_read 0x00000064 0x020ec66c deactivated //正常 timer periodic timeout flag -------- ---------- ---------- ----------- usb_read 0x00000064 0x04f4f427 activated ``` 定位: 经过多次增加日志打印,结合上述信息,定位到问题为信号量等待时出现异常,设置超时时间但是并没有超时返回,结合信息3可印证 解决: 由于没有时间和精力查找信号量的问题,将信号量切换为完成量,复现问题的时间变长,概率降低,但是并没有查找到真正的原因 各位大佬协助看一下问题是啥
查看更多
0
个回答
默认排序
按发布时间排序
暂无答案,快来添加答案吧
撰写答案
登录
注册新账号
关注者
1
被浏览
672
关于作者
时光念你
这家伙很懒,什么也没写!
提问
1
回答
4
被采纳
1
关注TA
发私信
相关问题
1
请教USB Host
2
STM32F4调试USB 读卡器(Slave)提示格式化
3
急求 STM32F4 USB Device MSC+SD 的相关问题
4
USB 框架问题
5
USB键盘
6
LPC17xx 如何添加USB HOST设备
7
RT-Thread目前支持USB HOST了吗?
8
USB HOST的支持问题
9
RTT 2.0.1 USB存储设备问题,枚举到USBREQ_GET_MAX_LUN后复位
10
USB库已经很久没更新了
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
2
RT-Thread 发布 EtherKit开源以太网硬件!
3
rt-thread使用cherryusb实现虚拟串口
4
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
5
《原子操作:程序世界里的“最小魔法单位”解析》
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
张世争
8
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
KunYi
6
个答案
1
次被采纳
本月文章贡献
程序员阿伟
6
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部