Easyelectronics.ru

Электроника для всех
Текущее время: 22 июн 2018, 22:12

Часовой пояс: UTC + 5 часов



    • JLCPCB - Платы прототипов всего за 2$ c бесплатной доставкой (при первом заказе)
    • 10 PCBs за $2 для 2 слоев, $15 для 4 слойной, $74 для 6 слойной платы.
    • Крупнейший китайский производитель прототипных плат. 290000+ клиентов & 8000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин радиодеталей.

Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
 Заголовок сообщения: STM32F103RC FreeRTOS+USB
СообщениеДобавлено: 13 авг 2017, 12:39 
Только пришел

Зарегистрирован: 15 июл 2017, 11:04
Сообщения: 18
УВАЖАЕМЫЕ очень прошу помощи (едет крыша).
Чистый проект, нет ничего кроме FreeRTOS и STM библиотеки USB (среда CooCox)
FreeRTOSConfig.h
Код:
#define configKERNEL_INTERRUPT_PRIORITY       5
#define configMAX_SYSCALL_INTERRUPT_PRIORITY    15


Инициализация прерываний
Код:
void USB_Interrupts_Config(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);

  /* Enable the USB interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 11;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

  /* Enable the USB Wake-up interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = USBWakeUp_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 10;
  NVIC_Init(&NVIC_InitStructure);
}




Обработчик прерывания
Код:
void USB_LP_CAN1_RX0_IRQHandler(void)
{
   static portBASE_TYPE xHigherPriorityTaskWoken;
   uint8_t byte = 1;
   BaseType_t xReturn;

   xReturn = xQueueSendToBackFromISR(xQueue_USB_LP_CAN1_RX0_IRQ, &byte, &xHigherPriorityTaskWoken);
   portEND_SWITCHING_ISR(xHigherPriorityTaskWoken);

   //USB_Istr();
}


Задача
Код:
    xQueue_USB_LP_CAN1_RX0_IRQ = xQueueCreate(1, sizeof(unsigned char));
   if (xQueue_USB_LP_CAN1_RX0_IRQ != NULL)
   {
      xTaskCreate(Task_USB_LP_CAN1_RX0_IRQ, "USB_LP_CAN1_RX0",configMINIMAL_STACK_SIZE,
               NULL, tskIDLE_PRIORITY + 3, NULL);
   }


void Task_USB_LP_CAN1_RX0_IRQ (void *pvParameter)
{
   portBASE_TYPE xStatus;
   uint8_t res_byte = 0;

   while (1)
   {
      xStatus = xQueueReceive(xQueue_USB_LP_CAN1_RX0_IRQ, &res_byte, portMAX_DELAY);
      if (xStatus == pdPASS)
      {
         USB_Istr();
      }
      portYIELD();
   }
}


Ситуация такая:
Постоянно срабатывает прерывание, при этом устройство НЕ подключено к хосту.
При просмотре отладчиком выставлены флаг ISTR_ESOF и соответственно через некоторое время 3мс ISTR_SUSP.
Отключение данного флага маской
Код:
#define IMR_MSK (CNTR_CTRM  | CNTR_WKUPM | CNTR_SUSPM | CNTR_ERRM  | [u]CNTR_SOFM[/u] \
                 | CNTR_ESOFM | CNTR_RESETM )

НИЧЕГО НЕ ДАЕТ.
Соответственно все висит потому как обрабатывается только это прерывание.
Даже не читается очередь.
ПОЖАЛУЙСТА ПОМОГИТЕ


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F103RC FreeRTOS+USB
СообщениеДобавлено: 13 авг 2017, 13:13 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 1829
Чето вы начали изучение не с того конца книги. Образно выражаясь, вы пытаетесь вычислять интегралы, не научившись считать площади прямоугольников и трапеций.
Кокос - далеко не лучшая среда для изучения. А тут еще и ФриРТОС прикручена, со своими законами. Наличие в проекте РТОС - это уже само по себе "нечто".
Начните читать книгу с начала, а не с конца...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F103RC FreeRTOS+USB
СообщениеДобавлено: 13 авг 2017, 13:30 
Только пришел

Зарегистрирован: 15 июл 2017, 11:04
Сообщения: 18
А по существу


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F103RC FreeRTOS+USB
СообщениеДобавлено: 13 авг 2017, 18:42 
Старожил
Аватара пользователя

Зарегистрирован: 27 мар 2015, 04:10
Сообщения: 1555
Откуда: Харьков
А флаг прерывания разве не нужно сбрасывать?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F103RC FreeRTOS+USB
СообщениеДобавлено: 13 авг 2017, 19:08 
Только пришел

Зарегистрирован: 15 июл 2017, 11:04
Сообщения: 18
Какой флаг. В USB_LP_CAN1_RX0_IRQHandler так пытаюсь сделать обработчик в задаче а там он и сбрасывается (USB_Istr();)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F103RC FreeRTOS+USB
СообщениеДобавлено: 13 авг 2017, 20:12 
Старожил
Аватара пользователя

Зарегистрирован: 27 мар 2015, 04:10
Сообщения: 1555
Откуда: Харьков
Так он закоменчен
//USB_Istr();


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F103RC FreeRTOS+USB
СообщениеДобавлено: 13 авг 2017, 20:27 
Старожил
Аватара пользователя

Зарегистрирован: 27 мар 2015, 04:10
Сообщения: 1555
Откуда: Харьков
Смотрите что у вас в регистре ISTR. Там биты по которым вызвалось прерывание. Вот в обработчике прерывания его нужно сбросить, а потом вызвать реакцию на соответствующий бит который был выставлен. В начале происходит прерывание по RESET.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F103RC FreeRTOS+USB
СообщениеДобавлено: 15 авг 2017, 01:19 
Только пришел

Зарегистрирован: 15 июл 2017, 11:04
Сообщения: 18
alexsam писал(а):
Смотрите что у вас в регистре ISTR. Там биты по которым вызвалось прерывание. Вот в обработчике прерывания его нужно сбросить, а потом вызвать реакцию на соответствующий бит который был выставлен. В начале происходит прерывание по RESET.


Функция USB_Istr является стандартной взятой из библиотеки. Там как Вы и пишите обрабатываются все возможный флаги прерываний для USB. Думаю что через очередь можно передавать состояние регистра ISTR и сразу сбрасывать все флаги _SetISTR(0) а в функции обработки (т.е. задаче) уже разруливать. Как думаете сработает


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F103RC FreeRTOS+USB
СообщениеДобавлено: 15 авг 2017, 09:11 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 1829
Думаю, что это ужасная идея. Такие данные через очередь не передаются. Задачи не могут выполняться в прерываниях. Передав в очередь, вы должны иметь другую задачу-приемник, которая получит из очереди. Но передавать вы хотите флаг прерывания, фактически находясь в прерывании.
Вы там ранее хотели чтобы "по существу" писали. Но, черт подери, если "по существу", то придется долго и много расписывать, что такое РТОС, задачи, очереди и как это работает. Потом еще описывать, как работает ЮСБ.
Поэтому. Уберите из проекта РТОС. Разберитесь с ЮСБ. Или наоборот, уберите ЮСБ и разберитесь как работает РТОС.
Заодним, почитайте, что такое прерывания и как они работают.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32F103RC FreeRTOS+USB
СообщениеДобавлено: 04 сен 2017, 02:01 
Заглядывает иногда

Зарегистрирован: 16 фев 2017, 17:48
Сообщения: 38
Зачем передавать флаг через очередь, если можно просто поставить в прерывании семафор, а таск запусить на постоянку и ловить там этот семафор ? Пришло прерывание - отработали.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB