Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Bolshakov_Poyasnitelnaya_zapiska.doc
Скачиваний:
29
Добавлен:
08.03.2015
Размер:
1.58 Mб
Скачать

2.2.2.5 Синхронные и асинхронные вызовы функций задач

Чтобы из одной задачи вызвать функцию другой задачи, необходимо, чтобы эта сторонняя задача приняла согласие на ее исполнение (то есть перешла в режим ожидания вызова данной функции). Функции задачи могут быть вызваны синхронно и асинхронно. При синхронном вызове задача-инициатор будет ждать окончания работы функции и только после этого продолжит свою работу. Асинхронный вызов предполагает передачу сообщения в очередь принимающей задачи, сам вызов фактически будет осуществлен тогда, когда это решит принимающая задача. Таким образом, вызов функции будет отложенным, то есть асинхронным по отношению к инициатору, так как инициатор после передачи сообщения продолжает исполнять свой процесс и не будет автоматически оповещен о том, когда данная функция реально исполнится в принимающей задаче.

2.2.2.6 Синхронный вызов функции пакета

Вызов функции пакета может осуществляться только синхронно, поскольку с пакетом не связана никакая очередь сообщений, которая необходима для вызова асинхронных функций.

2.2.2.7 События и подписки

С помощью механизма подписок на события одна задача может оповестить о событии множество других задач. Для этого оповещаемые задачи необходимо подписать на событие, то есть связать функции этих задач с событием, при возникновении которого и должны запускаться подписанные функции. Подписываемые на событие функции должны быть публичными и быть согласованными с сигнатурой события: список их параметров должен соответствовать списку параметров события. У событий, в отличие от функций, отсутствует понятие возвращаемого значения.

Подписка, изображаемая на диаграмме задач, является начальной (инициализационной): ее можно изменять в процессе выполнения программы. Другими словами, подписка в языке является динамической (аналогично этому, в дизайнере форм программ для ЭВМ, например, средствами интегрированной среды разработки Microsoft Visual Studio [34] или Borland Delphi [35], пользователь рисует только первоначальную конфигурацию компонентов, но может ее менять в коде, также может в процессе выполнения подменить обработчики событий). Выполнить подписку (как и отписку) можно из любого места программного кода.

При выполнении конкретной подписки, пользователь выбирает тип вызова функции. При выборе синхронного типа, вызывающая событие задача будет ждать, пока не исполнятся все подписанные функции. Поэтому использование синхронных подписок не рекомендуется, поскольку может привести к длительной задержке в работе задач.

2.2.2.8 Текстовый язык

Разработанный текстовый язык основан на концепциях языка С и Ада. Выбор именно такой базы для предлагаемого языка обуславливается следующими причинами:

1) большинство существующих разработчиков программ для микроконтроллеров создают свои программы на языке С, переход на принципиально новые нотации (например, язык Ада) усложняет выход продукта на рынок;

2) в нотацию языка С не заложено никаких средств для организации параллельного программирования.

Поэтому нотация языка является гибридом нотации языка С и Ada. Из языка Ада позаимствована нотация пакетов и задач. Таким образом, программный код представляет собой набор пакетов, функция одного из которых является точкой входа в программу. Пакеты содержат переменные, функции, задачи, события, типы данных. Задачи содержат локальные и интерфейсные переменные и функции, тело. В отличие от языка Ада, в разработанном языке нет типов задач, имеются только их экземпляры (то есть задачи не могут создаваться динамически). Данное ограничение обусловлено малым количеством ресурсов, которые доступны программе, работающей в микроконтроллере.

В качестве импортируемых ресурсов могут быть указаны как сторонние пакеты, ссылки на файлы с которыми имеются в проекте, так и файлы на языке С. Полная грамматика языка в нотации Xtext [36] приведена в приложении Б.

Вместе с концепциями пакетов и задач в дополнение к грамматике языка С были добавлены конструкции, приведенные в таблице 2.2. Пример программы на текстовом языке приведен в приложении В на рисунке В.1.

Таблица 2.2 – Добавленные в текстовый язык конструкции

Конструкция

Значение

<имя задачи>.start()

запустить задачу

<имя задачи>.stop()

остановить задачу

<имя задачи>.pause()

приостановить задачу

<имя задачи>.continue()

продолжить выполнение

delay_ms(ms_count)

выдержка паузы в данной задаче в течение количества ms_count миллисекунд

critical

{

<код>

}

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

<имя функии> ?

Имеется ли в текущий момент хотя бы один запрос на вызов функии

<имя функии> !

Дождаться, пока не произойдет запрос на вызов данной функции

send <имя задачи>.<имя функии>

Асинхронно вызвать функцию указанной задачи (отправить сообщение в очередь задачи о вызове данной функии)

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]