Easyelectronics.ru

Электроника для всех
Текущее время: 14 ноя 2019, 09:50

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



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
 Заголовок сообщения: Вызов планировщика из ISR.
СообщениеДобавлено: 14 фев 2013, 20:29 
Только пришел

Зарегистрирован: 14 янв 2013, 17:05
Сообщения: 13
Не могу найти функцию принудительного вызова планировщика из обработчика прерывания для Corttex-M3.
В примерах есть, но для других портов.
К примеру, на taskYIELD_FROM_ISR(), это из примера вызова xQueueSendToFrontFromISR(), компилятор и линкер ругаются.

Режим вытесняющей многозадачности.

Подскажите пожалуйста.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вызов планировщика из ISR.
СообщениеДобавлено: 18 фев 2013, 22:15 
Старожил

Зарегистрирован: 26 янв 2010, 21:47
Сообщения: 345
Scorpion_ak47 писал(а):
Не могу найти функцию принудительного вызова планировщика из обработчика прерывания для Corttex-M3.
В примерах есть, но для других портов.
К примеру, на taskYIELD_FROM_ISR(), это из примера вызова xQueueSendToFrontFromISR(), компилятор и линкер ругаются.

Режим вытесняющей многозадачности.

Подскажите пожалуйста.

Попробуй
Код:
portEND_SWITCHING_ISR


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вызов планировщика из ISR.
СообщениеДобавлено: 02 мар 2013, 00:42 
Только пришел

Зарегистрирован: 14 янв 2013, 17:05
Сообщения: 13
Спасибо.

Наступил на грабли с установкой приоритета прерывания, хочу поделиться, если кто не знает :).

Стоит помнить, что у Cortex M3 логический приоритет не соответствует порядковому номеру вектора прерывания.
Про это часто пишут, что это странно, хотя я как то и не задумывался, что может быть иначе, вроде в AVR(прерывания) и в Linux(потоки) так же расположены.

В файле FreeRTOSConfig.h есть три константы: (для порта Cortex M3, из примера для IAR/STM32F103xxx)
configKERNEL_INTERRUPT_PRIORITY,
configMAX_SYSCALL_INTERRUPT_PRIORITY,
configLIBRARY_KERNEL_INTERRUPT_PRIORITY.

-configKERNEL_INTERRUPT_PRIORITY - приоритет системного таймера, который отсчитывает "тики" ОС, он устанавливается с самым меньшим приоритетом, я думаю, что бы не уменьшать время реакции на другие прерывания.

-configMAX_SYSCALL_INTERRUPT_PRIORITY- максимальный (логический) приоритет прерываний из которых еще можно вызывать API функции FreeRTOS. Как я понял, при вызове API функции FreeRTOS из прерывания, происходит маскирования прерываний с приоритетами (логическими) равными и меньше чем configMAX_SYSCALL_INTERRUPT_PRIORITY , записью константы configMAX_SYSCALL_INTERRUPT_PRIORITY в регистр basepri.( в функции ulPortSetInterruptMask ), поэтому API функции FreeRTOS, вызванные в прерывании (1), не будут вызваны еще раз, не завершившись, из другого прерывания, с приоритетом(логическим) выше чем прерывание (1), но ниже чем configMAX_SYSCALL_INTERRUPT_PRIORITY. Я думаю, что эти функции не реентерабельные, поэтому нужен такой механизм.

-configLIBRARY_KERNEL_INTERRUPT_PRIORITY - не понятно зачем она, в поиске ни чего кроме её определения не находится. И ни где о ней не написано, ну я не нашел.


//==================================================================
//==================================================================
//==================================================================


В файле stm32f10x.h есть некая константа: __NVIC_PRIO_BITS, равная 4, указывающая сколько битов из 8 битного регистра приоритета прерывания используются в данном контроллере. Причем это старшие 4 бита.

В рекомендациях FreeRTOS (http://www.freertos.org/RTOS-Cortex-M3-M4.html) советуют использовать группу приоритетов NVIC_PriorityGroup_4, обеспечивающую 16 (от 0 до 15) приоритетов прерываний(pre-emption) и 0 для subpriority.

Так же желательно, для совместимости, что бы 4 младших бита были установлены в 1.

FreeRTOS работает с NVIC напрямую, без функций библиотеки STM, поэтому под константами configKERNEL_INTERRUPT_PRIORITY и configMAX_SYSCALL_INTERRUPT_PRIORITY следует подразумевать, сдвинутые влево на 4 бита числа. (255 - соответствует приоритету 15(наименьшему), а 191 - 11)).

А библиотека STM использует уровни приоритетов прерываний от 0 до 15(а не как я думал, от 0 до 255, что и приводило к зависанию ОС, я так полагаю).

Вот так я делал:

Код:
main()
{
  //.
  //.
  //.

  //до запуска планировщика
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);

  //.
  //.
  //.

  // запуск планировщика
  vTaskStartScheduler();

}

InitDMA()
{
  //.
  //.
  //.

  //Настройка NVIC для DMA IRQ
  NVIC_InitStruct.NVIC_IRQChannel = DMA2_Channel3_IRQn;
  // 12, а не 192
  NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 12;  // 12 или 1100 1111 > configMAX_SYSCALL_INTERRUPT_PRIORITY

  NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStruct);

  //.
  //.
  //.

}

void DMA2_Channel3_IRQHandler(void)
{
  //.
  //.
  //.

  rez = pdFALSE;  //ОБЯЗАТЕЛЬНО !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

  xQueueSendToFrontFromISR(qTo_Osc, (void *)&temp, &rez);
 
   //если в результате посылки сообщения была разблокирована задача с приоритетом более высоким,
   //чем та, которую прервало данное прерывание, то вызываем переключение контекста(планировщик ?),
   //что приведет к выходу из прерывания сразу в разблокированную задачу, не ожидая окончания кванта времени
   if(rez == pdTRUE)
     portEND_SWITCHING_ISR(rez);

  //.
  //.
  //.
}


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

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


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

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


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

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

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