Sagittarius 0 23 января, 2012 Опубликовано 23 января, 2012 · Жалоба Здравствуйте. FreeRTOS 7.1.0. вытесняющая многозадачность. Возник вопрос, есть несколько задач в которых нет явных вызовов для переключения задач на следующую (vTaskDelay, taskYIELD). Если создать задачи с одинаковыми приоритетами то все нормально, но если какой то задаче дать приоритет больше чем у других то будет работать только она. Можно ли как то это обойти, задать какое то распределение времени пропорционально приоритету? Чтоб даже если в задаче с максимальным приоритетом простой бесконечный цикл с тупым полингом какого то бита то задача с минимальным приоритетом тоже бы выполнялась, ну хоть немного :-) ? Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Terminator 0 24 января, 2012 Опубликовано 24 января, 2012 · Жалоба воткни в задачу с максимальным приоритетом xTaskDelay хоть на немного :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sparcmaster 0 24 января, 2012 Опубликовано 24 января, 2012 · Жалоба Так уж устроен планировщик - если ваша высокоприоритетная задача отработала свой квант времени, то он все равно выберет ее, а не готовую к выполнению низкопроцентную. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 16 24 января, 2012 Опубликовано 24 января, 2012 · Жалоба Чтоб даже если в задаче с максимальным приоритетом простой бесконечный цикл с тупым полингом какого то бита А вот зачем в приоритетной задаче ТУПОЙ поллинг, когда есть эвенты и соответственные сервисы? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sparcmaster 0 24 января, 2012 Опубликовано 24 января, 2012 · Жалоба А вот зачем в приоритетной задаче ТУПОЙ поллинг, когда есть эвенты и соответственные сервисы? Например используется сторонняя библиотека FatFs, в функциях драйвера (высокоприорететная задача) встречается тупой поллинг, хотелось чтобы в это время выполнялась менее приоритетная фоновая задача. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sagittarius 0 24 января, 2012 Опубликовано 24 января, 2012 (изменено) · Жалоба Так уж устроен планировщик - если ваша высокоприоритетная задача отработала свой квант времени, то он все равно выберет ее, а не готовую к выполнению низкопроцентную. простой пример для проверки, пишем 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, изначально там вообще было много бесконечных циклов с полингом аппаратного бита. Пока у меня решение только такое, что все подобные задачи ставятся с минимальным приоритетом а задачам с правильными системными вызовами и ожиданиями на задержках/семафорах/очередях ставится более высокий приоритет. Изменено 24 января, 2012 пользователем Sagittarius Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sparcmaster 0 24 января, 2012 Опубликовано 24 января, 2012 · Жалоба Вопрос возник при использовании библиотек работы с SD-card от ST для STM32F4xx, изначально там вообще было много бесконечных циклов с полингом аппаратного бита. Аналогичная задача была с FatFS - я делал vTaskDelay в полингах. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kan35 7 24 января, 2012 Опубликовано 24 января, 2012 · Жалоба самое простое - менять приоритет на момент поллинга А вообще, по хорошему надо переписать драйвер работы с картой, чтобы работал через DMA и семафоры Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться