portTickType и portBASE_TYPE:
1. portTickType может быть целым беззна-
ковым 16- или 32-битным. Он определяет
тип системной переменной, которая ис-
пользуется для подсчета количества си-
стемных квантов, прошедших с момента
старта планировщика. Таким образом,
portTickType задает максимальный вре-
менной интервал, который может быть
отсчитан средствами FreeRTOS. В случае
16-битного portTickType максимальный
интервал составляет 65 536 квантов, в слу-
чае 32-битного — 4 294 967 296 квантов.
Использование 16-битного счетчика кван-
тов оправдано на 8- и 16-битных платфор-
мах, так как позволяет значительно повы-
сить их быстродействие.
2. portBASE_TYPE определяет тип, актив-
но используемый в коде ядра FreeRTOS.
Операции с типом portBASE должны вы-
полняться как можно более эффективно
на данном МК, поэтому разрядность типа
portBASE_TYPE устанавливается идентич-
ной разрядности целевого МК. Например,
для 8-битных МК это будет char, для
16-битных — short.
Идентификаторы макроопределений так-
же начинаются с префикса, который опреде-
ляет, в каком файле этот макрос находится
(табл. 3).
Задачи
Любая программа, которая выполняется
под управлением FreeRTOS, представляет со-
бой множество отдельных независимых задач.
Каждая задача выполняется в своем собствен-
ном контексте без случайных зависимостей
от других задач и ядра FreeRTOS. Только одна
задача из множества может выполняться
в один момент времени, и планировщик от-
ветственен, какая именно. Планировщик оста-
навливает и возобновляет выполнение всех
задач по очереди, чтобы достичь эффекта од-
новременного выполнения нескольких задач
на одном процессоре. Так как задача «не зна-
ет» об активности планировщика, то он отве-
чает за переключение контекста при смене вы-
полняющейся задачи. Для достижения этого
каждая задача имеет свой собственный стек.
При смене задачи ее контекст сохраняется в ее
собственном стеке, что позволяет восстано-
вить контекст при возобновлении задачи [4].
Как было сказано выше, при грубом при-
ближении задача может находиться в двух со-
стояниях: выполняться и не выполняться. При
подробном рассмотрении состояние «задача
не выполняется» подразделяется на несколько
различных состояний в зависимости от того,
как она была остановлена (рис. 5).
Подробно рассмотрим состояния зада-
чи в FreeRTOS. Говорят, что задача выпол-
няется (running), если в данный момент
времени процессор занят ее выполнением.
Состояние готовности (ready) характеризу-
ет задачу, готовую к выполнению, но не вы-
полняющуюся, так как в данный момент вре-
мени процессор занят выполнением другой
задачи. Готовые к выполнению задачи (с оди-
наковым приоритетом) по очереди переходят
в состояние выполнения и пребывают в нем
в течение одного системного кванта, после
чего возвращаются в состояние готовности.
Задача находится в блокированном состоя-
нии, если она ожидает наступления временно-
го или внешнего события (event). Например,
вызвав API-функцию vTaskDelay(), задача
переведет себя в блокированное состояние
до тех пор, пока не пройдет временной период
задержки (delay): это будет временное событие.
Задача блокирована, если она ожидает собы-
тия, связанного с другими объектами ядра —
очередями и семафорами: это будет внешнее
(по отношению к задаче) событие. Нахождение
задачи в блокированном состоянии ограниче-
Достарыңызбен бөлісу: |