Эти инструкции могут помочь вам последовательно применять стиль программирования в каждом целевом файле.
Идентификаторы в файле начинаются с заглавной буквы. Для примера,
NumModelInputs 1 NumModelOutputs 2 NumNonVirtBlocksInModel 42 DirectFeedthrough yes NumContStates 10
Потому что Name
идентификатор может быть повышен в родительские возможности, блокировать записи, которые содержат Name
идентификатор должен начинать имя с заглавной буквы. Для примера блок может содержать
Block { : : RWork [4, 0] : NumRWorkDefines 4 RWorkDefine { Name "TimeStampA" Width 1 StartIndex 0 } }
Потому что Name
идентификатор в RWorkDefine
запись повышается до PrevT
в родительских возможностях, она должна начинаться с заглавной буквы. Продвижение Name
идентификатор в родительские возможности в настоящее время сделан для Parameter
, RWorkDefine
, IWorkDefine
, и PWorkDefine
блокировать записи.
Директива назначения компилятора целевого языка (%assign
) генерирует предупреждение, если вы присвоите значение «неквалифицированному» идентификатору генератора кода. Для примера,
%assign TID = 1
приводит к ошибке, поскольку TID
идентификатор не квалифицирован по Block
. Однако «квалифицированное» назначение не генерирует предупреждение. Для примера,
%assign Block.TID = 1
не генерирует предупреждение, поскольку назначение содержит квалификатор. Поэтому компилятор целевого языка принимает, что программист намеренно изменяет идентификатор.
Назначения глобальных переменных TLC должны начинаться с заглавных букв. Глобальная переменная является переменной, объявленной в системном целевом файле (grt.tlc
, mdlwide.tlc
, mdlhdr.tlc
, mdlbody.tlc
, mdlreg.tlc
, или mdlparam.tlc
), или в рамках функции, которая использует
оператор. Глобальные назначения имеют те же возможности, что и переменные генератора кода. Пример глобальной переменной TLC, заданный в mdlwide.tlc
является
%assign InlineParameters = 1
Примером глобальной ссылки в функции является
%function foo() void %assign ::GlobalIdx = ::GlobalIdx + 1 %endfunction
Назначения локальных переменных TLC должны начинаться с строчных букв. Локальная переменная TLC является переменной, назначенной внутри функции. Для примера,
%assign numBlockStates = ContStates[0]
Когда вы объявляете функцию внутри block.tlc
файл, он должен начинаться с Fcn
. Для примера,
%function FcnMyBlockFunc(...)
Поскольку генератор кода отслеживает использование переменных и генерирует код на основе использования, вы должны использовать стандартные программы доступа вместо того, чтобы непосредственно использовать переменную. Для примера не следует использовать следующее в файле TLC:
x = %<tInf>;
Вы должны использовать
x = %<LibRealNonFinite(inf)>;
Точно так же вместо использования %<tTID>
, использовать %<LibTID()>
. Полный список функций см. в разделе Ссылки библиотеки функций TLC в Компилятор Target Language.
Simulink® Coder™ глобальные переменные начинаются с rt
и глобальные функции Simulink Coder начинаются с
rt_.
Избегайте имен глобальных переменных в модулях, которые начинаются с rt
или rt_
поскольку они могут конфликтовать с глобальными переменными и функциями Simulink Coder. Эти переменные TLC объявлены в commonsetup.tlc
.
Это соглашение создает согласованные переменные во всех целевых файлах. Например, блок Gain содержит следующее Outputs
функция.
a. | Секция кода для каждого блока начинается с комментария, задающего тип и имя блока. |
б. | Включите пустую линию сразу после окончания функции, чтобы создать последовательный интервал между блоками в коде выхода. |
c. | Попытайтесь оставаться в пределах 80 столбцов на линию для баннера функции. Можно настроить строку с комментариями столбца в верхней части каждой функции. В качестве примера см. |
d. | Для непротиворечивости используйте переменные |
e. | Используйте переменную |
f. | При наименовании переменных управления циклом используйте |
Output
функция в gain.tlc
%roll sigIdx = RollRegions, lcv = RollThreshold, ... block, "Roller", rollVars
InitializeConditions
функция в linblock.tlc
%roll xidx = [0:nStates-1], xlcv = RollThreshold,... block, "Roller", rollVars
Файлы библиотеки функций Target Language Compiler по условию включены в защитный код, поэтому вы можете ссылаться на них несколько раз, используя %include
не беспокоясь, были ли они ранее включены. Следуйте этой практике для файлов библиотеки TLC, которые вы создаете.
Условие состоит в том, чтобы использовать переменную с таким же именем, как и базовое имя файла, верхний регистр и с подчеркиванием, присоединенным на обоих концах. Итак, файл с именем customlib.tlc
должна иметь переменную _CUSTOMLIB_
охранять его.
В качестве примера - основная библиотека функций Target Language Compiler, funclib.tlc
, содержит этот код TLC для предотвращения многократного включения:
%if EXISTS("_FUNCLIB_") == 0 %assign _FUNCLIB_ = 1 . . . %endif %% _FUNCLIB_
Поскольку код, который генерирует TLC, может использоваться в ссылочных моделях в непредсказуемых контекстах, не берите слишком много о пространствах имен. Для примера при записи кода TLC для блока и добавлении typedef
, охраняйте его с if/def
, как проиллюстрирован следующий пример:
%openfile tmpBuff #ifndef RESOLUTION_TYPEDEF typedef enum { LO_RES, HI_RES } Resolution; typedef struct { Resolution res; int8_T value; } Data; #define RESOLUTION_TYPEDEF #endif /* RESOLUTION_TYPEDEF */ %closefile tmpBuff %<LibCacheTypedefs(tmpBuff)>;