Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: переключение на задачу с меньшим приоритетом
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > FreeRTOS
Sagittarius
Здравствуйте.

FreeRTOS 7.1.0. вытесняющая многозадачность.
Возник вопрос, есть несколько задач в которых нет явных вызовов для переключения задач на следующую (vTaskDelay, taskYIELD). Если создать задачи с одинаковыми приоритетами то все нормально, но если какой то задаче дать приоритет больше чем у других то будет работать только она. Можно ли как то это обойти, задать какое то распределение времени пропорционально приоритету? Чтоб даже если в задаче с максимальным приоритетом простой бесконечный цикл с тупым полингом какого то бита то задача с минимальным приоритетом тоже бы выполнялась, ну хоть немного :-) ?


Спасибо.
Terminator
воткни в задачу с максимальным приоритетом xTaskDelay хоть на немного sm.gif
sparcmaster
Так уж устроен планировщик - если ваша высокоприоритетная задача отработала свой квант времени, то он все равно выберет ее, а не готовую к выполнению низкопроцентную.
MrYuran
Цитата(Sagittarius @ Jan 23 2012, 23:54) *
Чтоб даже если в задаче с максимальным приоритетом простой бесконечный цикл с тупым полингом какого то бита

А вот зачем в приоритетной задаче ТУПОЙ поллинг, когда есть эвенты и соответственные сервисы?
sparcmaster
Цитата(MrYuran @ Jan 24 2012, 08:38) *
А вот зачем в приоритетной задаче ТУПОЙ поллинг, когда есть эвенты и соответственные сервисы?

Например используется сторонняя библиотека FatFs, в функциях драйвера (высокоприорететная задача) встречается тупой поллинг, хотелось чтобы в это время выполнялась менее приоритетная фоновая задача.
Sagittarius
Цитата(sparcmaster @ Jan 24 2012, 07:29) *
Так уж устроен планировщик - если ваша высокоприоритетная задача отработала свой квант времени, то он все равно выберет ее, а не готовую к выполнению низкопроцентную.


простой пример для проверки, пишем 3 функции, вместо N - '1', '2','3'

CODE

void Task_N_(void *pvParameters){
int i;
for(;;){
STM_EVAL_LEDToggle(LED_N_);
for(i=0;i<0xfffff;i++)__no_operation();
}
}


если их запустить как задачи с одинаковым приоритетом, то мигают все светодиоды. если у одной приоритет выше то мигает только ее светодиод, на остальные управление не передается вообще. Если в задаче с высоким приоритетом заменить цикл задержки на vTaskDelay то снова будут мигать все светодиоды. В описании планировщика FreeRTOS в КиТ тоже говорится именно о таком поведении: высокоприоритетная задача должна сама отдать время другим посредством вызовов системных функций ожидания.

Вопрос возник при использовании библиотек работы с SD-card от ST для STM32F4xx, изначально там вообще было много бесконечных циклов с полингом аппаратного бита.

Пока у меня решение только такое, что все подобные задачи ставятся с минимальным приоритетом а задачам с правильными системными вызовами и ожиданиями на задержках/семафорах/очередях ставится более высокий приоритет.
sparcmaster
Цитата(Sagittarius @ Jan 24 2012, 09:31) *
Вопрос возник при использовании библиотек работы с SD-card от ST для STM32F4xx, изначально там вообще было много бесконечных циклов с полингом аппаратного бита.

Аналогичная задача была с FatFS - я делал vTaskDelay в полингах.
kan35
самое простое - менять приоритет на момент поллинга
А вообще, по хорошему надо переписать драйвер работы с картой, чтобы работал через DMA и семафоры
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.