首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >STM32 USB操作

STM32 USB操作
EN

Stack Overflow用户
提问于 2018-05-08 15:22:41
回答 1查看 1.3K关注 0票数 1

我使用STMCubeMX创建了一个项目,其中包括配置为虚拟com端口的usbd驱动程序。我让它正常工作,可以通过CDC_Receive_FS回调接收数据。我的问题是怎么回电话。它是在中断级别完成的,还是有其他机制。特别是,如果我想将数据从回调缓冲区复制到一个队列中,该队列将由我的主代码读取,那么是否需要对并发性进行保护(例如禁用中断)?

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-08 15:59:19

它是从ISR调用的。(中断服务例程)

它很可能是从以下几个方面调用的:

代码语言:javascript
复制
OTG_HS_IRQHandler.  

(两者之间有几个级别的功能)。

这里是断点内部我的堆栈的一个副本。

代码语言:javascript
复制
CDC_Receive_HS() at usbd_cdc_if.c:456 0x801c758 
USBD_CDC_DataOut() at usbd_cdc.c:699 0x8031592  
USBD_LL_DataOutStage() at usbd_core.c:331 0x80318aa 
HAL_PCD_DataOutStageCallback() at usbd_conf.c:249 0x801e486 
HAL_PCD_IRQHandler() at stm32f7xx_hal_pcd.c:359 0x802d264   
OTG_HS_IRQHandler() at stm32f7xx_it.c:288 0x801ab74 

您很可能不需要仅为了将此数据复制到另一个缓冲区而禁用其他中断。我认为它所使用的缓冲区只应由usb接收者使用。将数据复制到单独的缓冲区。当在此中断之外使用时,新缓冲区将需要并发保护。

如果您正在使用FreeRTOS,我建议使用"xQueue“类型作为缓冲区。它是线程安全的。在中断中使用xQueueSendToBackFromISR,在中断之外使用xQueueSendToBack。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50237128

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档