exponenta event banner

Соглашения по кодированию 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.

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

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

a.

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

b.

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

c.

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

d.

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

э.

Использовать переменную 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)>;

Связанные темы