Easyelectronics.ru

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

Часовой пояс: 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
Сообщения: 3748
Откуда: Кемеровская область, Киселевск
Вызов 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