Easyelectronics.ru

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

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



    • JLCPCB - Прототипы 10 PCBs всего за 2$ (100*100mm, 2-layer)
    • Как мы делаем платы, смотрите на YouTube
    • Крупнейшая китайская фабрика прототипов. 300000+ заказчиков и 10000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин комплектующих.

Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
 Заголовок сообщения: Когда нужно вызывать taskYIELD?
СообщениеДобавлено: 16 мар 2018, 18:26 
Только пришел

Зарегистрирован: 23 окт 2013, 17:53
Сообщения: 8
Откуда: Kiev
Здравствуйте!
Есть поток который обрабатывает нажатие кнопки:
Код:

  osThreadDef(defaultTask, StartDefaultTask, osPriorityHigh, 0, 128);
  defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);
...
void StartDefaultTask(void const * argument)
{
   osDelay(1000);
   for(;;)
  {
    HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);   
    osDelay(10);   
    xSemaphoreTake( xBinarySemaphore, portMAX_DELAY );
  }
}

Есть прерывание кнопки(срабатывает по спадающему фронту):
Код:
void EXTI0_IRQHandler(void)
{
  static portBASE_TYPE xHigherPriorityTaskWoken;
  xHigherPriorityTaskWoken = pdFALSE;
  extern xSemaphoreHandle xBinarySemaphore;
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
 
  xSemaphoreGiveFromISR( xBinarySemaphore, &xHigherPriorityTaskWoken );
  if( xHigherPriorityTaskWoken == pdTRUE )
  {
     /* Выдача семафора разблокирует задачу, и приоритет разблокированной
        задачи выше, чем у текущей выполняющейся задачи - поэтому контекст
        выполнения переключается принудительно в разблокированную (с более
        высоким приоритетом) задачу.
     */

     taskYIELD();
  }
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
}

Поток обработки нажатия кнопки запускается как с использованием taskYIELD() так и без.
Заметил что xHigherPriorityTaskWoken равняется pdTRUE только когда поток "StartDefaultTask" создается с высоким приоритетом.
Не могу понять зачем и когда этот taskYIELD вызывать...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Когда нужно вызывать taskYIELD?
СообщениеДобавлено: 16 мар 2018, 18:37 
Старожил
Аватара пользователя

Зарегистрирован: 18 май 2013, 20:43
Сообщения: 3694
Откуда: Кемеровская область, Киселевск
Вызов taskYIELD() информирует шедулер, что сейчас сразу
нужно переключиться к другой задаче, а не поддерживать эту задачу в
состоянии Running до окончания текущего слайса времени.

_________________
RADIOWOLF.RU


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Когда нужно вызывать taskYIELD?
СообщениеДобавлено: 16 мар 2018, 19:27 
Только пришел

Зарегистрирован: 23 окт 2013, 17:53
Сообщения: 8
Откуда: Kiev
Спасибо!


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

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


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

Сейчас этот форум просматривают: blik


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

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

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