Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

ОС реального времени FreeRTOS

Глава 3 из книги "Архитектура приложений с открытым исходным кодом", том 2.
Оригинал: FreeRTOS
Автор: Christopher Svec
Перевод: Н.Ромоданов

3.3. Планирование задач: Краткий обзор

Приоритеты задач и список готовности

Каждая задача имеет приоритет, назначенный пользователем, который равен от 0 (самый низкий приоритет) и до значения времени компиляции configMAX_PRIORITIES-1 (самый высокий приоритет). Например, если configMAX_PRIORITIES установлен равным 5, то система FreeRTOS будет использовать 5 уровней приоритета: 0 (самый низкий приоритет), 1, 2, 3, и 4 (наивысший приоритет).

В системе FreeRTOS используется «список готовности» («ready list») для отслеживания всех задач, которые в настоящее время готовы к запуску. В ней список готовности реализуется как массив списков задач наподобие следующего:

static xList pxReadyTasksLists[ configMAX_PRIORITIES ];  /* Задачи, готовые согласно приоритетам.  */

Список pxReadyTasksLists[0] является списком всех готовых задач с приоритетом 0, список pxReadyTasksLists[1] является списком всех готовых задач с приоритетом 1 и так далее до списка pxReadyTasksLists[configMAX_PRIORITIES-1].

Тактовая частота системы

Пульсом системы FreeRTOS является ее тактовая частота. Система FreeRTOS настраивается таким образом, чтобы периодически выдавать прерывания. Пользователь может регулировать частоту рерываний, которая обычно находится в диапазоне миллисекунд. Каждый раз, когда возникает прерывание, вызывается функция vTaskSwitchContext(). Функция vTaskSwitchContext() выбирает задачу с наибольшим приоритетом готовности и помещает ее в переменную pxCurrentTCB, например, следующим образом:

/* Поиск очереди с наивысшим приоритетом, в которой есть готовые к запуску задачи. */
while( listLIST_IS_EMPTY( &( pxReadyTasksLists[ uxTopReadyPriority ] ) ) )
{
    configASSERT( uxTopReadyPriority );
    --uxTopReadyPriority;
}

/* listGET_OWNER_OF_NEXT_ENTRY проходит по списку, поскольку задачи с одинаковым приоритетом 
получают одинаковое право пользоваться процессорным временем. */
listGET_OWNER_OF_NEXT_ENTRY( pxCurrentTCB, &( pxReadyTasksLists[ uxTopReadyPriority ] ) );

Перед тем как будет запущен цикл, гарантируется, что значение uxTopReadyPriority будет больше или равно приоритету задаче, готовой к запуску и имеющей наивысший приоритет. Цикл while() начинается с уровня приоритета uxTopReadyPriority и двигается вниз по массиву pxReadyTasksLists[] с тем, чтобы самый высокий уровень приоритета с задачами, готовыми к запуску. Затем функция listGET_OWNER_OF_NEXT_ENTRY() забирает следующую готовую к запуску задачу из списка готовых задач с этим уровнем приоритета.

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

Эти девять строк кода являются, по настоящему, сердцем системы FreeRTOS. Остальные более 8900 строк системы FreeRTOS существуют лишь для того, чтобы удостовериться, что эти девять строк делают все необходимое, чтобы поддерживать выполнение задачи с наибольшим приоритетом.

На рис.3.2 приведена общая схема того, как выглядит список задач, готовых к выполнению. В этом примере есть три уровня приоритета, с одной задачей на уровне приоритета 0, без задач на уровне приоритета 1 и с тремя задачами на уровне приоритета 2. Эта картина абсолютно точная, но не полная, здесь не хватает нескольких деталей, которые мы добавим позже.

Рис.3.2: Общая схема списка готовности задач Ready List в системе FreeRTOS

Теперь, когда у нас есть общая схема пути, давайте погрузимся в детали. Мы рассмотрим три основные структуры данных системы FreeRTOS: задачи, списки и очереди.


Продолжение статьи: Задачи