Перейти к содержанию
    

переключение на задачу с меньшим приоритетом

Здравствуйте.

 

FreeRTOS 7.1.0. вытесняющая многозадачность.

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

 

 

Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

воткни в задачу с максимальным приоритетом xTaskDelay хоть на немного :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так уж устроен планировщик - если ваша высокоприоритетная задача отработала свой квант времени, то он все равно выберет ее, а не готовую к выполнению низкопроцентную.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чтоб даже если в задаче с максимальным приоритетом простой бесконечный цикл с тупым полингом какого то бита

А вот зачем в приоритетной задаче ТУПОЙ поллинг, когда есть эвенты и соответственные сервисы?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А вот зачем в приоритетной задаче ТУПОЙ поллинг, когда есть эвенты и соответственные сервисы?

Например используется сторонняя библиотека FatFs, в функциях драйвера (высокоприорететная задача) встречается тупой поллинг, хотелось чтобы в это время выполнялась менее приоритетная фоновая задача.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так уж устроен планировщик - если ваша высокоприоритетная задача отработала свой квант времени, то он все равно выберет ее, а не готовую к выполнению низкопроцентную.

 

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

 

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, изначально там вообще было много бесконечных циклов с полингом аппаратного бита.

 

Пока у меня решение только такое, что все подобные задачи ставятся с минимальным приоритетом а задачам с правильными системными вызовами и ожиданиями на задержках/семафорах/очередях ставится более высокий приоритет.

Изменено пользователем Sagittarius

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Аналогичная задача была с FatFS - я делал vTaskDelay в полингах.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

самое простое - менять приоритет на момент поллинга

А вообще, по хорошему надо переписать драйвер работы с картой, чтобы работал через DMA и семафоры

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...