99
КОМПОНЕНТЫ И ТЕХНОЛОГИИ •
№ 6 '2011
www.kit3e.ru
компоненты
микроконтроллеры
пасным в многозадачной среде (thread safe).
То есть при использовании очередей авто-
матически решается проблема совместного
доступа нескольких задач к одному аппарат-
ному ресурсу, роль
которого в данном случае
играет память.
Характеристики очередей
Хранение информации в очереди
Информация хранится в очереди в виде
элементов (items) — блоков памяти фик-
сированного размера. В качестве элемента
очереди может выступать любая переменная
языка Си. В случае если это переменная типа
char, размер блока будет равен 1 байту, если
это структура или массив,
размер блока бу-
дет равен, соответственно, размеру структу-
ры или массива.
Элементы очереди в контексте обмена ин-
формацией между задачами будем называть
сообщениями.
Запись элемента в очередь приводит к со-
зданию побайтовой копии элемента в оче-
реди. Побайтовое копирование происходит
и при чтении элемента из очереди.
Очередь может хранить в себе конечное
число элементов фиксированного размера.
Максимальное
число элементов, которое
может хранить очередь, называется разме-
ром очереди. Как размер элемента, так и раз-
мер очереди задаются при создании очереди
и остаются неизменными до ее удаления.
Важно
отметить, что память выделяется
сразу
под все элементы очереди, то есть пу-
стая и заполненная очередь не отличаются
друг от друга по объему занимаемой памяти.
При записи элементов в очередь динамиче-
ского выделения памяти не происходит.
Очередь функционирует по принципу
«первым вошел — первым вышел» (First In
First Out, FIFO), то есть элемент, который
раньше остальных был помещен в очередь
(в конец очереди), будет и прочитан раньше
остальных (рис. 2).
Обычно элементы запи-
сываются в конец («хвост») очереди и считы-
ваются с начала («головы») очереди.
На рис. 2а показаны очередь длиной 5 эле-
ментов для хранения целочисленных пере-
менных, Задача 1, которая будет записывать
элементы в очередь, и Задача 2, которая будет
считывать элементы из очереди. В исходном
состоянии очередь не содержит ни одного
элемента, то есть пуста.
На рис. 2б Задача 1 записывает число «15»
в конец очереди. Так как теперь очередь со-
держит 1 элемент, то
он является одновре-
менно и началом, и концом очереди.
На рис. 2в Задача 1 записывает еще один
элемент («69») в конец очереди. Теперь оче-
редь содержит 2 элемента, причем элемент
«15» находится в
начале очереди, а элемент
«69» — в конце.
На рис. 2г Задача 2 считывает элемент, на-
ходящийся в начале очереди, то есть элемент
«15». Таким образом, выполняется принцип
«первым вошел — первым вышел», так как
элемент «15» первым записан в очередь и, со-
ответственно, первым из нее считан. Теперь
очередь снова содержит один элемент («69»)
в начале очереди, который и будет считан
при следующем чтении из очереди Задачей 2
(рис. 2д).
Следует отметить, что на рис. 2 показано
использование API-функций для работы
с очередями в упрощенном виде. Корректное
их применение будет описано ниже.
Также имеется возможность помещать
элементы в начало очереди, тогда очередь
превращается в стек, работающий по прин-
ципу «последним вошел — первым вышел»
(Last In First Out, LIFO).
Достарыңызбен бөлісу: