ПрагмаСофтСтудия 2.1
Для своей работы генератор программного кода (кодогенератор) использует информацию о проекте и тестовых сценариях, которые в данный момент загружены в САПР. Он генерирует набор текстовых файлов *.c, содержащих программный код, созданный с использованием языка программирования C.
Изначально модель кодогенерации разрабатывалась таким образом, чтобы не зависеть от того программного и аппаратного окружения, в котором в последующем придётся работать создаваемому программному обеспечению (ПО). Это может быть, например, персональный компьютер или блок системы индикации. Генерируемые файлы повторяют логику и математику, заложенную в проект САПР, а также могут содержать программный код подыгрыша, созданный по выбранному пользователем тестовому сценарию . При этом они не выполняют прорисовки и не занимаются вычислением многих арифметических и тригонометрических функций. Для этого они лишь вызывают функции, прототипы которых описаны в файле PSSCodeGen.h. Таким образом, генерируемые файлы являются лишь частью от того набора файлов, которые необходимо иметь, чтобы скомпилировать конечное ПО. Вторая часть создаётся вручную и обеспечивает привязку абстрактной первой части к аппаратуре и программной среде. При этом файл PSSCodeGen.h является связующим для двух частей и обеспечивает их совместную компиляцию. Кроме тел функций, описанных в файле PSSCodeGen.h, вторая часть исходников повторяет палитры профиля проекта, создавая для своей работы массивы с аналогичными значениями. Она также производит всю необходимую программно-аппаратную инициализацию и вызывает функции PssOnImitation, PssOnPaint и PssOnExtraction, создаваемые кодогенерацией.
По виду взаимодействия друг с другом, первую управляющую часть можно назвать клиентом, а вторую, выполняющую её сервисные запросы, сервером.
В идеале исходники серверной части для данной конкретной аппаратуры создаются один раз и после их тестирования и отладки уже не изменяются. Это означает, что разработчик аппаратуры, зная все нюансы её архитектуры, может создать профиль проекта, ограничивающий пользователя САПР возможностями его аппаратуры, а также набор файлов, необходимых для стыковки с генерируемыми САПР программными файлами. В последующем данный набор файлов и файл профиля проекта поставляется вместе с аппаратурой её покупателю. Тот в свою очередь, используя переданный профиль, разрабатывает в САПР проекты, выполняет кодогенерацию и компилирует полученные файлы с набором файлов сервера, что в итоге даёт нужное аппаратуре ПО. Такая организация полностью или практически полностью избавляет пользователя от необходимости программировать что-либо и позволяет сосредоточиться непосредственно на разработке индикационных кадров.
Генерируемые программные файлы, их взаимосвязь и место в конечном ПО показаны на следующем рисунке.
Описание генерируемых программных файлов приведено в следующей таблице.
PSSInputVar.c PSSInputVar.h |
Файлы содержат объявления переменных, соответствующих входным переменным |
PSSImitation.c PSSImitation.h |
В файлах PSSImitation.h и PSSImitation.c находится объявление и тело функции PssOnImitation. Функция содержит код инициализации входных переменных |
PSSOutputVar.c PSSOutputVar.h |
Файлы содержат объявления переменных, соответствующих выходным переменным |
PSSExtraction.c PSSExtraction.h |
В файлах PSSExtraction.h и PSSExtraction.c находится объявление и тело функции PssOnExtraction. При необходимости функция может быть вызвана сервером после функции PssOnPaint для сохранения результатов её выполнения в память аппаратуры. |
PSSPaint.c PSSPaint.h |
В файлах PSSPaint.h и PSSPaint.c находится объявление и тело функции PssOnPaint. Функция повторяет структуру и содержит всю ту логику и математику, которая заложена в дерево окна Прорисовка. Дополнительно в файл PSSPaint.c может помещаться реализация функций вычисления |
PSSCodeGen.h |
Файл содержит типы данных и прототипы функций, которые могут использоваться в программном коде файла PSSPaint.c. Тела этих функций должны быть дополнительно внешне реализованы с учётом возможностей среды, в которой создаваемому программному коду придётся в дальнейшем работать. |
Кодогенератор имеет режим, облегчающий создание сервера. Это так называемый режим внешней привязки. Он включается в настройках кодогенератора и приводит к формированию двух дополнительных файлов PSSCodeGenImpl.c и PSSCodeGenImpl.h. Кодогенератор сам создаёт в них тела всех функций, объявленных в файле PSSCodeGen.h, а также нужные для их работы массивы со значениями палитр профиля проекта.
Привязкой режим называется потому, что в зависимости от выбранной в настройках расширения исходной конфигурации, в файлах PSSCodeGenImpl.c и PSSCodeGenImpl.h формируется программный код максимально адаптированный под определённую аппаратно-программную платформу. Графическая прорисовка и вычисление математических функций при этом выполняются средствами доступными и максимально быстрыми для данной платформы. В целом, для прорисовки примитивов используются различные версии библиотеки OpenGL, а математические функции и функции работы со строками реализуются средствами языка C или перенаправляются в функции стандартной библиотеки языка C.
Работа с конфигурациями кодогенератора будет подробна рассмотрена в следующей статье.
Режим привязки изменяет взаимодействие клиента с сервером. Сервер перестаёт ссылаться на файл PSSCodeGen.h и начинает взаимодействовать с файлом PSSCodeGenImpl.h. Это меняет представленную выше структурную схему на следующую.
Основное назначение кодогенерации - это создание трёх функций, которые могут быть вызваны сервером в тот момент, когда ему это необходимо.
PssOnImitation. Функция работает с входными переменными , объявленными в файле PSSInputVar.h. Возможны три сценария.
Сервер вызывает функцию PssOnImitation первой, подготавливая этим исходные данные для отработки функции PssOnPaint.
PssOnPaint. Функция повторяет структуру дерева окна Прорисовка. Кроме функции PssOnPaint в файле PSSPaint.c могут создаваться другие функции. Например, реализация функций вычисления и прорисовки
, существующих в проекте, на момент кодогенерации.
PssOnExtraction. Функция работает с выходными переменными , объявленными в файле PSSOutputVar.h. Программный код внутри функции для выходной переменной
создаётся в том случае, если в проекте САПР в свойствах переменной включено сохранение её значения в память аппаратуры.
Это необязательная для вызова функция. Если разработчик сервера не предполагает, что пользователь будет что-либо сохранять в память его аппаратуры, то он может не закладывать вызов функции PssOnExtraction в программный код сервера.
Сервер организует цикл внутри себя, на каждой итерации которого, вначале для отработки подыгрыша, может быть вызвана функция PssOnImitation. Далее, он вызывает функцию PssOnPaint. Она производит вычисления и при необходимости выполняет прорисовку графики. В заключение сервер может вызвать функцию PssOnExtraction для сохранения результатов отработки функции PssOnPaint в память аппаратуры.
В следующей статье мы рассмотрим настройку кодогенератора, структуру его интерфейса и управление конфигурациями.