Jump to content

    
Sign in to follow this  
Sagittarius

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

Recommended Posts

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

 

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

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

 

 

Спасибо.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
Чтоб даже если в задаче с максимальным приоритетом простой бесконечный цикл с тупым полингом какого то бита

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

Share this post


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

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

Share this post


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

 

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

 

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

Edited by Sagittarius

Share this post


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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this