Конвенции о кодировании TLC

Эти инструкции могут помочь вам последовательно применять стиль программирования в каждом целевом файле.

Начинайте идентификаторы с прописных букв

Идентификаторы в файле начинаются с заглавной буквы. Для примера,

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

Когда вы объявляете функцию внутри block.tlc файл, он должен начинаться с Fcn. Для примера,

%function FcnMyBlockFunc(...)

Примечание

Функции, объявленные в системном файле, являются глобальными; функции, объявленные в файле блока, являются локальными.

Не используйте переменные жесткого кода, заданные в commonsetup.tlc

Поскольку генератор кода отслеживает использование переменных и генерирует код на основе использования, вы должны использовать стандартные программы доступа вместо того, чтобы непосредственно использовать переменную. Для примера не следует использовать следующее в файле 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 функция.

Примечания об этом коде TLC

a.

Секция кода для каждого блока начинается с комментария, задающего тип и имя блока.

б.

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

c.

Попытайтесь оставаться в пределах 80 столбцов на линию для баннера функции. Можно настроить строку с комментариями столбца в верхней части каждой функции. В качестве примера см. constant.tlc.

d.

Для непротиворечивости используйте переменные sysIdx и blkIdx для системного индекса и блочного индекса, соответственно.

e.

Используйте переменную rollVars при использовании %roll конструировать.

f.

При наименовании переменных управления циклом используйте sigIdx и lcv при закольцовывании RollRegions и xidx и xlcv при цикле по состояниям.

Пример: 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)>;

Похожие темы