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 в Компиляторе Выходного языка.

Глобальные переменные Simulink® Coder™ запускаются с rt, и глобальные функции Simulink Coder запускаются с rt_.

Постарайтесь не называть глобальные переменные в модулях, которые запускаются с rt или rt_, потому что они могут конфликтовать с глобальными переменными Simulink Coder и функциями. Эти переменные TLC объявляются в commonsetup.tlc.

Это соглашение создает сопоставимые переменные в конечных файлах. Например, блок Gain содержит следующую функцию Outputs.

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

a.

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

b.

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

c.

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

Условное включение в файлы библиотеки

Файлы библиотеки функции Компилятора Выходного языка условно включены с защитным кодом, таким образом, можно сослаться на них многократно использование %include, не волнуясь, были ли они ранее включены. Примените эту практику для файлов библиотеки TLC, которые вы создаете.

Соглашение состоит в том, чтобы использовать переменную с тем же именем как основное имя файла, верхний регистр и с символами нижнего подчеркивания, присоединенными в обоих концах. Так, файл с именем customlib.tlc должен иметь переменную _CUSTOMLIB_, охраняющую его.

Как пример, основная библиотека функции Компилятора Выходного языка, 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)>;

Похожие темы