В STM-овских библиотеках сделано так: когда приходит USB запрос (неважно с данными или без) вызывается функция
Код
static int8_t CDC_Control_HS (uint8_t cmd, uint16_t index, uint16_t value, uint8_t* pbuf, uint16_t length)
{
}
Если запрос с данными от хоста, то надо прочитать по адресу pbuf, а если надо отправить на хост - записать по адресу pbuf, очевидно до выхода из функции. Если я сделаю очередь, которая вызывает задачу, то задача запуститься уже после выхода из функции CDC_Control_HS