logo
Bolshakov_Poyasnitelnaya_zapiska

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 <имя задачи>.<имя функии>

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