完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
static int drv_pipe_xfer(upipe_t pipe, rt_uint8_t token, void *buffer, int nbytes, int timeouts) { int timeout = timeouts; while (1) { if (!connect_status) { return -1; } rt_completion_init(&urb_completion); HAL_HCD_HC_SubmitRequest(&STM32_hhcd_fs, pipe->pipe_index, (pipe->ep.bEndpointAddress & 0x80) >> 7, pipe->ep.bmAttributes, token, buffer, nbytes, 0); rt_completion_wait(&urb_completion, timeout); rt_thread_mdelay(1); if (HAL_HCD_HC_GetState(&stm32_hhcd_fs, pipe->pipe_index) == HC_NAK) { RT_DEBUG_LOG(RT_DEBUG_USB, ("nakn")); if (pipe->ep.bmAttributes == USB_EP_ATTR_INT) { rt_thread_delay((pipe->ep.bInterval * RT_TICK_PER_SECOND / 1000) > 0 ? (pipe->ep.bInterval * RT_TICK_PER_SECOND / 1000) : 1); } HAL_HCD_HC_Halt(&stm32_hhcd_fs, pipe->pipe_index); HAL_HCD_HC_Init(&stm32_hhcd_fs, pipe->pipe_index, pipe->ep.bEndpointAddress, pipe->inst->address, USB_OTG_SPEED_FULL, pipe->ep.bmAttributes, pipe->ep.wMaxPacketSize); continue; } else if (HAL_HCD_HC_GetState(&stm32_hhcd_fs, pipe->pipe_index) == HC_STALL) { RT_DEBUG_LOG(RT_DEBUG_USB, ("stalln")); pipe->status = UPIPE_STATUS_STALL; if (pipe->callback != RT_NULL) { pipe->callback(pipe); } return -1; } else if (HAL_HCD_HC_GetState(&stm32_hhcd_fs, pipe->pipe_index) == URB_ERROR) { RT_DEBUG_LOG(RT_DEBUG_USB, ("errorn")); pipe->status = UPIPE_STATUS_ERROR; if (pipe->callback != RT_NULL) { pipe->callback(pipe); } return -1; } else if(URB_DONE == HAL_HCD_HC_GetURBState(&stm32_hhcd_fs, pipe->pipe_index)) { RT_DEBUG_LOG(RT_DEBUG_USB, ("okn")); pipe->status = UPIPE_STATUS_OK; if (pipe->callback != RT_NULL) { pipe->callback(pipe); } size_t size = HAL_HCD_HC_GetXferCount(&stm32_hhcd_fs, pipe->pipe_index); if (pipe->ep.bEndpointAddress & 0x80) { return size; } else if (pipe->ep.bEndpointAddress & 0x00) { return size; } return nbytes; } continue; } }` stm32 drv_u***h.c驱动中收到完成量后加的rt_thread_mdelay(1),这个感觉很占用时间呀,每64字节1ms,2M的数据占用30多s |
|
相关推荐
8个回答
|
|
|
|
|
|
影响读取数据的时间
|
|
|
|
这个也是,但要读写能达到系统的最佳状态是需要花点时间去修改代码的。我们常常在系统慢外设读写数据时采用块数据延时,就是这样简单。大致计算一下读写这些数据需要最大的时间,在设备状态返回完成后,加个延时,这样安全的解决了避免由于设备冲突造成下次读写的错误。但也造成了设备读写时间多了,如果要快速操作,就需要对设备状态寄存器的每种情况综合分析加以对应处理,程序量会增加很多。但有些确实是我们在运用中很少碰到。所以在硬件描述中,常常把不不考虑这些因素,用了一个偷懒的做法就是延时。
哈哈,没有办法。 就像USB、sd卡等如果我们编写一个全协议栈操作,那代码量就~。 这也是为什么有些嵌入式设备只识别某些设备,而电脑是全设备的缘故了~。 写多了,发发牢骚,就当一阵风,不要当回事哦~~ |
|
|
|
这里的延时是必须的,最近我也在调试 u*** host 的驱动,除了这里还有个地方也得添加个延时,不加会不认部分 U盘,或者识别U盘后读写数据出错,甚至把U盘的分区表写没。。。 有一次 elm 读写文件正常,放到电脑上没那个文件。。。但是 rtt 里确实读写正常。
|
|
|
|
不认部分 U盘,或者识别U盘后读写数据出错,甚至把U盘的分区表写没的延时你是加在什么地方的
|
|
|
|
去掉1ms延时,我修改成如下代码,目前枚举正常,速度一下子就上来了
static int drv_pipe_xfer(upipe_t pipe, rt_uint8_t token, void *buffer, int nbytes, int timeouts) { int timeout = timeouts; int status = 0; while (1) { if (!connect_status) { return -1; } switch(status) { case 0: rt_completion_init(&urb_completion); RT_DEBUG_LOG(RT_DEBUG_USB, ("pipe xfer:%dn", nbytes)); rt_base_t lvl = rt_hw_interrupt_disable(); HAL_HCD_HC_SubmitRequest(&stm32_hhcd_fs, pipe->pipe_index, (pipe->ep.bEndpointAddress & 0x80) >> 7, pipe->ep.bmAttributes, token, buffer, nbytes, 0); rt_hw_interrupt_enable(lvl); status = 1; case 1: RT_DEBUG_LOG(RT_DEBUG_USB, ("wait_compn")); if(rt_completion_wait(&urb_completion, timeout) != RT_EOK) { rt_kprintf("pipe xfer timeout:%dn", timeout); return -1; } status = 2; break; case 2: HCD_URBStateTypeDef urbstate = HAL_HCD_HC_GetURBState(&stm32_hhcd_fs, pipe->pipe_index); if(URB_DONE == urbstate){ pipe->status = UPIPE_STATUS_OK; if (pipe->callback != RT_NULL) { pipe->callback(pipe); } size_t size = HAL_HCD_HC_GetXferCount(&stm32_hhcd_fs, pipe->pipe_index); RT_DEBUG_LOG(RT_DEBUG_USB, ("HC_XFRC:%dn", size)); if (pipe->ep.bEndpointAddress & 0x80) { return size; } return nbytes; } else if(URB_IDLE == urbstate){ HCD_HCStateTypeDef u***state = HAL_HCD_HC_GetState(&stm32_hhcd_fs, pipe->pipe_index); RT_DEBUG_LOG(RT_DEBUG_USB, ("urb_state:%d,%dn", urbstate, u***state)); if(u***state == HC_IDLE) { HAL_HCD_HC_Halt(&stm32_hhcd_fs, pipe->pipe_index); status = 0; continue; } rt_completion_init(&urb_completion); status = 1; } else if(URB_NOTREADY == urbstate) { RT_DEBUG_LOG(RT_DEBUG_USB, ("URB_NOTREADY:%dn", HAL_HCD_HC_GetState(&stm32_hhcd_fs, pipe->pipe_index))); status = 0; } else if(URB_NYET == urbstate) { RT_DEBUG_LOG(RT_DEBUG_USB, ("URB_NYET:%dn", HAL_HCD_HC_GetState(&stm32_hhcd_fs, pipe->pipe_index))); status = 0; } else if(URB_ERROR == urbstate) { RT_DEBUG_LOG(RT_DEBUG_USB, ("URB_ERROR:%dn", HAL_HCD_HC_GetState(&stm32_hhcd_fs, pipe->pipe_index))); status = 0; } else{ rt_kprintf("urb_state:%dn", urbstate); return -1; } break; } } } |
|
|
|
|
|
|
|
只要注释掉就发现枚举都起不来,但是不注释影响读取数据的时间
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
840 浏览 0 评论
6489 浏览 0 评论
如何使用python调起UDE STK5.2进行下载自动化下载呢?
2857 浏览 0 评论
开启全新AI时代 智能嵌入式系统快速发展——“第六届国产嵌入式操作系统技术与产业发展论坛”圆满结束
3104 浏览 0 评论
获奖公布!2024 RT-Thread全球巡回线下培训火热来袭!报名提问有奖!
33438 浏览 11 评论
73694 浏览 21 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-4 13:28 , Processed in 0.879616 second(s), Total 53, Slave 47 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号