реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> переключение на задачу с меньшим приоритетом
Sagittarius
сообщение Jan 23 2012, 19:54
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 207
Регистрация: 26-01-06
Из: СПб
Пользователь №: 13 659



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

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


Спасибо.
Go to the top of the page
 
+Quote Post
Terminator
сообщение Jan 24 2012, 02:45
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 209
Регистрация: 7-12-04
Из: Томск
Пользователь №: 1 382



воткни в задачу с максимальным приоритетом xTaskDelay хоть на немного sm.gif
Go to the top of the page
 
+Quote Post
sparcmaster
сообщение Jan 24 2012, 04:29
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 93
Регистрация: 13-01-12
Из: Гатчина
Пользователь №: 69 333



Так уж устроен планировщик - если ваша высокоприоритетная задача отработала свой квант времени, то он все равно выберет ее, а не готовую к выполнению низкопроцентную.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Jan 24 2012, 04:38
Сообщение #4


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(Sagittarius @ Jan 23 2012, 23:54) *
Чтоб даже если в задаче с максимальным приоритетом простой бесконечный цикл с тупым полингом какого то бита

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


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
sparcmaster
сообщение Jan 24 2012, 04:54
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 93
Регистрация: 13-01-12
Из: Гатчина
Пользователь №: 69 333



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

Например используется сторонняя библиотека FatFs, в функциях драйвера (высокоприорететная задача) встречается тупой поллинг, хотелось чтобы в это время выполнялась менее приоритетная фоновая задача.
Go to the top of the page
 
+Quote Post
Sagittarius
сообщение Jan 24 2012, 05:31
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 207
Регистрация: 26-01-06
Из: СПб
Пользователь №: 13 659



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

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

Сообщение отредактировал Sagittarius - Jan 24 2012, 05:34
Go to the top of the page
 
+Quote Post
sparcmaster
сообщение Jan 24 2012, 05:37
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 93
Регистрация: 13-01-12
Из: Гатчина
Пользователь №: 69 333



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

Аналогичная задача была с FatFS - я делал vTaskDelay в полингах.
Go to the top of the page
 
+Quote Post
kan35
сообщение Jan 24 2012, 07:51
Сообщение #8


Знающий
****

Группа: Участник
Сообщений: 537
Регистрация: 22-02-06
Пользователь №: 14 594



самое простое - менять приоритет на момент поллинга
А вообще, по хорошему надо переписать драйвер работы с картой, чтобы работал через DMA и семафоры
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd June 2025 - 05:50
Рейтинг@Mail.ru


Страница сгенерированна за 0.01413 секунд с 7
ELECTRONIX ©2004-2016