STM32 USB CDC操作
STM32 USB CDC Operation
我使用 STMCubeMX 创建了一个项目,其中包含配置为虚拟 com 端口的 usbd 驱动程序。我让它工作并且可以通过 CDC_Receive_FS 回调接收数据。我的问题是这个回调是如何调用的。它是在中断级别完成的,还是有其他一些机制。特别是,如果我想将回调缓冲区中的数据复制到将由我的主代码读取的队列中,我是否需要一些并发保护(例如禁用中断)?
谢谢。
它是从 ISR 调用的。 (中断服务例程)
最有可能调用自:
OTG_HS_IRQHandler.
(中间有几层功能)。
这是断点内我的堆栈的副本。
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。
我使用 STMCubeMX 创建了一个项目,其中包含配置为虚拟 com 端口的 usbd 驱动程序。我让它工作并且可以通过 CDC_Receive_FS 回调接收数据。我的问题是这个回调是如何调用的。它是在中断级别完成的,还是有其他一些机制。特别是,如果我想将回调缓冲区中的数据复制到将由我的主代码读取的队列中,我是否需要一些并发保护(例如禁用中断)?
谢谢。
它是从 ISR 调用的。 (中断服务例程)
最有可能调用自:
OTG_HS_IRQHandler.
(中间有几层功能)。
这是断点内我的堆栈的副本。
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。