Easyelectronics.ru

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

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



    • JLCPCB - Платы прототипов всего за 2$ c бесплатной доставкой (при первом заказе)
    • 10 PCBs за $2 для 2 слоев, $15 для 4 слойной, $74 для 6 слойной платы.
    • Крупнейший китайский производитель прототипных плат. 290000+ клиентов & 8000+ заказов в день!
    • 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
Сообщения: 3355
Откуда: Кемеровская область, Киселевск
Вызов taskYIELD() информирует шедулер, что сейчас сразу
нужно переключиться к другой задаче, а не поддерживать эту задачу в
состоянии Running до окончания текущего слайса времени.

_________________
RADIOWOLF.RU


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

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


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

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


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

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


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

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

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