- •Общая форма индивидуального задания История документа
- •1.Введение
- •1.1Список сокращений
- •1.2Список литературы
- •1.3Назначение документа
- •1.4Структура документа
- •2.Общие положения
- •3.Управление задачами
- •3.1Состояния задачи
- •3.2Активизация задачи
- •3.3Приоритеты задач и переключение задач
- •3.4Завершение задачи
- •4.Управление ресурсами
- •4.1Организация управления ресурсами
- •4.2Ограничения при управлении ресурсами
- •5.Обработка прерываний
- •6.Управление событиями
- •6.1События принадлежат задаче
- •6.2Системные события
- •7.Требования к api
6.Управление событиями
В этом разделе приводится информация, необходимая для реализации управления событиями в проекте RTOS. Следование рекомендациям этого раздела является обязательным, если в ваше индивидуальное задание включено управление событиями. Далее (в разделах "Системные события" и "События принадлежат задаче") описаны два варианта реализации событий. Необходимо следовать рекомендациям только одного из этих разделов (того, который указан в вашем индивидуальном задании).
Механизм событий является способом синхронизации (события могут использоваться, например, для сигнализации истечения заданного интервала времени на таймере или приема сообщения) и инициирует перемещение задачи в и из состояния waiting.
6.1События принадлежат задаче
Любое событие в системе должно принадлежать задаче (только одной). Каждой задаче может принадлежать не более N событий (максимальное количество событий N указано в вашем индивидуальном задании). События, принадлежащие одной задаче, имеют идентификаторы EVENT_1, EVENT_2, … . Любое событие системы однозначно идентифицируется парой «Задача:Идентификатор».
Каждая задача может ожидать одно или несколько из своих событий. Эти события задаются маской событий, которая является структурой данных типа TEventMask (реализуется разработчиком ОСРВ, используется в качестве типа входного параметра в сервисах ОСРВ, связанных с событиями - см. документ "Спецификация API"). Формирование маски осуществляется операцией add_mask. Например (маска на события 1 и 12):
TEventMask mask;
mask= EVENT_1 add_mask EVENT_12;
Каждая задача имеет две маски:
Маска ожидаемых событий.
Маска произошедших (установленных) событий.
Задача, находящаяся в состоянии выполнения, может начать ожидание событий задаваемых маской и перейти в состояние waiting (предыдущая маска ожидания должна быть сброшена). Если для этой задачи будет установлено хоть одно из ожидаемый событий, задача перейдет в состояние ready (возможно running). В маске ожидаемых событий признаки ожидания произошедших событий должны быть сброшены, признаки ожидания остальных событий должны быть оставлены. В маске произошедших событий признаки произошедших событий, ожидаемых задачей (события которых «дождалась» задача) должны быть сброшены до перехода задачи в состояние ready (возможно running).
Установка событий, не ожидаемых задачей, не должна приводить к изменению состояния задачи.
Если к моменту начала ожидания хоть одно из ожидаемых событий установлено состоянии задачи не должно измениться (то есть задача не переводится в состояние waiting и в этом случае не вызывается планировщик). При этом установленные признаки события должны быть очищены, маска ожидаемых событий должна быть изменена в соответствии с приведенными правилами.
События любой задачи могут устанавливаться любой другой задачей. Маски установленных событий задачи также могут быть прочтены любой задачей.
Ожидание событий допускается лишь задачей, которой эти события принадлежат. Очистка маски произошедших событий может осуществляться только задачей «владельцем» событий.