|
FreeRTOS + USB |
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 15)
|
Aug 6 2014, 05:21
|
Местный
  
Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102

|
Цитата(den_po @ Aug 5 2014, 17:49)  Зачем семафором? Для этого очереди есть. А что в примерах не понравилось? Там есть энное количество примеров с USB. в очередь точно... а что за примеры? где их скачать?
|
|
|
|
|
Aug 6 2014, 05:49
|
Частый гость
 
Группа: Участник
Сообщений: 139
Регистрация: 9-11-12
Из: Санкт-Петербург
Пользователь №: 74 315

|
http://www.freertos.org/ -> download в дистрибутиве папка Demo
|
|
|
|
|
Aug 6 2014, 06:03
|
Местный
  
Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102

|
Цитата(den_po @ Aug 6 2014, 09:49)  http://www.freertos.org/ -> download в дистрибутиве папка Demo это я качал, но разве там есть примеры с USB? как называются?
|
|
|
|
|
Aug 13 2014, 06:07
|
Местный
  
Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102

|
Цитата(gridinp @ Aug 8 2014, 22:36)  а что за процессор, что за USB контроллер, master or slave? плата 32F429IDISCOVERY
|
|
|
|
|
Jun 10 2015, 08:29
|

Гуру
     
Группа: Свой
Сообщений: 2 429
Регистрация: 30-11-05
Из: Ижевск
Пользователь №: 11 606

|
На STM32F103 я использую семафоры: Прерывание: Код void EP2_OUT_Callback(void) { SetEPRxStatus(ENDP2, EP_RX_VALID);
static portBASE_TYPE xHigherPriorityTaskWoken; xHigherPriorityTaskWoken = pdFALSE; xSemaphoreGiveFromISR(xSemaphoreUSB_EP2_OUT, &xHigherPriorityTaskWoken ); } Задача: Код void prvUSB( void *pvParameters ) { uint8_t answer[64]; GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //Set PA11,12 as USB_DM,DP GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12; // set DAC1 pin as analog output GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure);
xSemaphoreUSB_EP2_OUT = xSemaphoreCreateBinary();
USB_Disconnect_Config(); Set_USBClock(); USB_Interrupts_Config(); USB_Init();
while(1) { if(xSemaphoreUSB_EP2_OUT != NULL) { if( xSemaphoreTake( xSemaphoreUSB_EP2_OUT, portMAX_DELAY ) == pdTRUE ) { // в answer получаем данные с хоста USB_SIL_Read(EP2_OUT, answer);
// отправляем данные на хост USB_SIL_Write(EP1_IN, answer, 64); SetEPTxValid(ENDP1); } } } }
|
|
|
|
|
Jun 11 2015, 11:21
|
Местный
  
Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102

|
Цитата(uriy @ Jun 11 2015, 11:12)  Нет. В задаче у меня обрабатывается только поступление данных в эндпойнт. Все остальное обрабаывается внутри прерываний. Вот меня интересует как раз вопрос, когда есть смысл создавать задачу, а когда выполнять действия сразу в прерывании? Есть какие то рекомендации на этот счет?
|
|
|
|
|
Jun 24 2015, 05:44
|
Местный
  
Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102

|
В 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
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|