Описание процесса сборки расчетного модуля для QNX 6 и QNX 4

Сборка по схеме расчётного модуля производится по следующему алгоритму:

А) Генератор кода SimInTech по открытой схеме в указанной в настройках папке создаёт следующие файлы:

<имя программы>.h – файл в котором декларируются привязки переменных к нужным структурам внутри расчётного модуля.

<имя программы>.inc – файл исходного текста программы, сгенерированной по схеме – главная вычислительная секция.

<имя программы>_init.inc – файл исходного текста программы, сгенерированной по схеме – секция инициализации начальных состояний переменных и констант.

<имя программы>_state.inc – файл исходного текста программы, сгенерированной по схеме – секция запоминания состояний (выполняется всегда строго после главной секции).

Имя программы – это заданное в параметрах расчёта исходной схемы имя алгоритма (расчётного модуля).

Б) Генератор кода SimInTech запускает скрипт автоматической сборки (имя скрипта может быть изменено в настройках окна «Инструменты автоматики» – см. Руководство пользователя). Данный скрипт находится в папке выбранного в настройках генератора кода шаблона кода и по умолчанию называется compile.bat. Данному скрипту сообщаются следующие параметры: директория, куда были размещены сгенерированные генератором кода файлы (*.inc и *.h), адрес сборочного сервера, пароль и логин для сборочного сервера. Данный скрипт производит копирование сгенерированных генератором кода файлов в директорию с исходным текстом расчётного модуля (<директория шаблона кода>\calc). Файлы копируются под фиксированными именами:

<имя программы>.h → prog.h

<имя программы>.inc → prog.inc

<имя программы>_init.inc → init.inc

<имя программы>_state.inc → state.inc

Далее данный скрипт запускает процедуру автоматической сборки из исходного кода исполняемого файла расчётного модуля. В разработанных шаблонах кода скрипт сборки исполняемого модуля называется build.bat. Ниже приведён текст скрипта сборки compile.bat и скрипта компиляции build.bat применительно к QNX 6. Для ОС QNX 4 отличается только скрипт build.bat.

compile.bat:

REM Скрипт сборки расчётного модуля
REM формат команды compile.bat <путь к исходникам\имя модуля>
REM Копируем файлы исходного текста из заданной директории
call clear.bat
del /q %1
copy "%~1.inc" /B calc\prog.inc /B
copy "%~1.h" /B calc\prog.h /B
copy "%~1_init.inc" /B calc\init.inc /B
copy "%~1_state.inc" /B calc\state.inc /B
REM Компилируем DLL и пишем результат компиляции в отчёт
call build.bat 2>"%~1.log"
REM Копируем результат сборки обратно
copy calc\x86\o\calc /B %1 /B

build.bat для QNX6 – сборка производится кросс-компилятором на рабочем месте пользователя:

REM Пакетная сборка расчётного модуля для QNX
REM Тут указываем пути к компилятору и вспомогательным программам
set path=%path%;"%QNX_HOST%\usr\bin\"
REM Собственно компиляция - для 6.4 под x86
i386-pc-nto-qnx6.4.0-gcc.exe -o calc\x86\o\calc calc\calcmain.c -fpack-struct=1 "-I%QNX_TARGET%\usr\include" -IDispExemod -Wconversion -l m
REM Собственно компиляция - для 6.5 под x86
i486-pc-nto-qnx6.5.0-gcc.exe -o calc\x86\o\calc calc\calcmain.c -fpack-struct=1 "-I%QNX_TARGET%\usr\include" -IDispExemod -Wconversion -l m

Как видно из вышеприведённого сборочного скрипта build.bat для QNX6 запускается кросс-компилятор под выбранную платформу из директории средств разработки, поставляемых вместе с QNX. При этом компиляция осуществляется в директорию calc шаблона расчётного модуля, а потом скомпилированный расчётный модуль копируется (и переименовывается) из неё обратно в директорию, куда были размещены файлы, сгенерированные генератором кода SimInTech (см. конец compile.bat).

build.bat для QNX4 – сборка производится нативным компилятором, непосредственно на приборе (или специально выделенном под эти цели сборочном приборе):

REM Удалённая сборка не целевой (или промежуточной тестовой) системе для QNX4

REM синтаксис build.bat <сервер> <логин> <пароль>
pushd calc
del/q buildcmds.txt
del/q calc
REM Копирование задания на сборочный сервер
ECHO open %1 > ftpcmd.txt
ECHO %2>> ftpcmd.txt
ECHO %3>> ftpcmd.txt
ECHO binary>> ftpcmd.txt
ECHO rmdir calcsrc>> ftpcmd.txt
ECHO mkdir calcsrc>> ftpcmd.txt
ECHO cd calcsrc>> ftpcmd.txt
ECHO mput *.*>> ftpcmd.txt
ECHO quit>> ftpcmd.txt
ftp -s:ftpcmd.txt -i
REM Собственно сборка (соединение через telnet) - при помощи утилиты
ECHO %2> buildcmds.txt
ECHO %3>> buildcmds.txt
ECHO cd calcsrc>> buildcmds.txt
ECHO make>> buildcmds.txt
..\..\..\telbuilder %1 buildcmds.txt
REM Копирование скомпилированного со сборочного сервера домой
ECHO open %1 > ftpcmd.txt
ECHO %2>> ftpcmd.txt
ECHO %3>> ftpcmd.txt
ECHO binary>> ftpcmd.txt
ECHO cd calcsrc>> ftpcmd.txt
ECHO get calc calc>> ftpcmd.txt
ECHO quit>> ftpcmd.txt
ftp -s:ftpcmd.txt -i
del/q ftpcmd.txt
popd

Для QNX 4 файлы сгенерированные генератором кода сначала копируются в локальную директорию calc шаблона кода QNX 4, затем по ftp вся локальная директория calc копируется на сборочный сервер (прибор), там собирается нативным компилятором, а результаты компиляции (исполняемый файл и лог компиляции) копируются по ftp обратно.

Также процесс сборки кода описан в Руководстве пользователя.

Сгенерированные генератором кода файлы (*.inc и *.h) подключаются к основному файлу шаблона расчётного модуля calcmain.c при помощи операторов #include, ниже приведён код подключения к базовой части сгенерированной части (фрагмент calcmain.c):

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <malloc.h>
#include <signal.h>
#include <string.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/kernel.h>
#include <process.h>
#include <math.h>
#pragma pack (1)
#include "c_types.h"
#include "prog.h"
#define STR_LEN 80
#define OK 0x01
#include "main_struct.h"
EXPORTED_FUNC INIT_FUNC( double step,
 double time,
 ptr_array* ext_vars_addr,
 double_array* din_vars,
 double_array* derivates,
 double_array* alg_vars,
 double_array* alg_funcs,
 t_state_vars* state_vars,
 t_consts* consts
 )
{ int ret;
#include "init.inc"
return ret;
};
EXPORTED_FUNC RUN_FUNC(
 int action,
 double step,
 double time,
 ptr_array* ext_vars_addr,
 double_array* din_vars,
 double_array* derivates,
 double_array* alg_vars,
 double_array* alg_funcs,
 t_state_vars* state_vars,
 t_consts* consts,
 t_local* locals
 )
{ int ret;
#include "prog.inc"
return ret;
};
EXPORTED_FUNC STATE_FUNC(
 int action,
 double step,
 double time,
 ptr_array* ext_vars_addr,
 double_array* din_vars,
 double_array* derivates,
 double_array* alg_vars,
 double_array* alg_funcs,
 t_state_vars* state_vars,
 t_consts* consts,
 t_local* locals
 )
{ int ret;
#include "state.inc"
return ret;
};
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Сам алгоритм генерации кода для отдельных блоков схемы находится в библиотеке get_lib.dll, исходные тексты которой находятся в папке <директория установки программы>\source\MBTY\AVRORA_GEN\

В общем виде процесс генерации кода выглядит следующим образом:

Собственно алгоритмы формирования текста для каждого из блоков находятся в модуле Blocks.pas в директории <директория установки программы>\source\MBTY\AVRORA_GEN