реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> FreeRTOS + USB
Atlantis-
сообщение Aug 5 2014, 13:24
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102



Здравствуйте!
Как правильней объединить USB (конкретно обработчик прерываний) и задачи по приему данных и обработке реквестов? надо ли всю обработку прерывания совать в задачу и потом семафором ее вызывать или можно вызывать задачу только когда пришли данные?
Go to the top of the page
 
+Quote Post
den_po
сообщение Aug 5 2014, 13:49
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 139
Регистрация: 9-11-12
Из: Санкт-Петербург
Пользователь №: 74 315



Зачем семафором? Для этого очереди есть.
А что в примерах не понравилось? Там есть энное количество примеров с USB.
Go to the top of the page
 
+Quote Post
Atlantis-
сообщение Aug 6 2014, 05:21
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102



Цитата(den_po @ Aug 5 2014, 17:49) *
Зачем семафором? Для этого очереди есть.
А что в примерах не понравилось? Там есть энное количество примеров с USB.

в очередь точно...
а что за примеры? где их скачать?
Go to the top of the page
 
+Quote Post
den_po
сообщение Aug 6 2014, 05:49
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 139
Регистрация: 9-11-12
Из: Санкт-Петербург
Пользователь №: 74 315



http://www.freertos.org/ -> download
в дистрибутиве папка Demo
Go to the top of the page
 
+Quote Post
Atlantis-
сообщение Aug 6 2014, 06:03
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102



Цитата(den_po @ Aug 6 2014, 09:49) *
http://www.freertos.org/ -> download
в дистрибутиве папка Demo

это я качал, но разве там есть примеры с USB? как называются?
Go to the top of the page
 
+Quote Post
gridinp
сообщение Aug 8 2014, 18:36
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 121
Регистрация: 7-04-08
Из: Наро-Фоминск
Пользователь №: 36 543



а что за процессор, что за USB контроллер, master or slave?
Go to the top of the page
 
+Quote Post
Atlantis-
сообщение Aug 13 2014, 06:07
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102



Цитата(gridinp @ Aug 8 2014, 22:36) *
а что за процессор, что за USB контроллер, master or slave?

плата 32F429IDISCOVERY
Go to the top of the page
 
+Quote Post
Atlantis-
сообщение Jun 9 2015, 12:44
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102



Еще вопрос: насколько правильно будет для обработки USB запросов (пользовательских конечно) сделать специальную задачу и вызывать ее из обработчика запросов с помощью отправки сообщения? запуск задачи будет же занимать какое то дополнительное время, насколько это будет корректно? то же самое с принимаемыми по USB данными, можно ли отсылать сообщение содержащее адрес первого элемента и кол-во данных, а в задаче уже обрабатывать?
Go to the top of the page
 
+Quote Post
uriy
сообщение Jun 10 2015, 08:29
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 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);
            }
        }
    }
}
Go to the top of the page
 
+Quote Post
Atlantis-
сообщение Jun 10 2015, 14:15
Сообщение #10


Местный
***

Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102



а обработка USB-запросов аналогичным образом?
Go to the top of the page
 
+Quote Post
uriy
сообщение Jun 11 2015, 08:12
Сообщение #11


Гуру
******

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



Нет. В задаче у меня обрабатывается только поступление данных в эндпойнт.
Все остальное обрабаывается внутри прерываний.
Go to the top of the page
 
+Quote Post
Atlantis-
сообщение Jun 11 2015, 11:21
Сообщение #12


Местный
***

Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102



Цитата(uriy @ Jun 11 2015, 11:12) *
Нет. В задаче у меня обрабатывается только поступление данных в эндпойнт.
Все остальное обрабаывается внутри прерываний.

Вот меня интересует как раз вопрос, когда есть смысл создавать задачу, а когда выполнять действия сразу в прерывании? Есть какие то рекомендации на этот счет?
Go to the top of the page
 
+Quote Post
uriy
сообщение Jun 11 2015, 19:04
Сообщение #13


Гуру
******

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



Для коротких прерываний нет смысла создавать задачу.
В задаче обработчике эндпойнта у меня, например, есть процедура записи параметров во флеш.
Делать это в прерывании слишком долго.
Go to the top of the page
 
+Quote Post
Atlantis-
сообщение Jun 23 2015, 07:49
Сообщение #14


Местный
***

Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102



У меня много разных USB запросов и наверно было бы правильно создать задачу для обработки запросов и из прерывания вызывать эту задачу, передавая в нее (через очередь) параметры запроса (поля и данные). Но у меня есть некоторые запросы, в которых надо отправлять данные на хост (USB запрос с данными) и тут я не понимаю, как это реализовать.
Получается, что после прихода запроса я записываю его параметры в очередь, запускается задача и все, а нужно еще в теле прерывания записать данные в буфер, чтобы они отправились на хост.
Go to the top of the page
 
+Quote Post
uriy
сообщение Jun 23 2015, 08:39
Сообщение #15


Гуру
******

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



Так в примере который я приложил тоже отправляются данные на хост из задачи.
Вовсе не обязательно данные записывать в теле прерывания
Еще коммент специально по русски написал
Код
// отправляем данные на хост
                USB_SIL_Write(EP1_IN, answer, 64);
                SetEPTxValid(ENDP1);
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th June 2025 - 18:01
Рейтинг@Mail.ru


Страница сгенерированна за 0.01471 секунд с 7
ELECTRONIX ©2004-2016