exponenta event banner

Директивы компилятора целевого языка

Управление формированием кода из моделей осуществляется главным образом путем написания или изменения сценариев, в которых применяются директивы TLC и встроенные функции. Используйте следующие разделы в качестве основной ссылки на синтаксис и формат конструкций целевого языка, а также MATLAB ®tlc сама команда.

Директива целевого языка должна быть первым непустым символом в строке и начинаться с % персонаж. Строки, начинающиеся с %% являются комментариями TLC и не передаются в выходной поток. Строки, начинающиеся с /* являются комментариями C и передаются в выходной поток.

Синтаксис

Файл целевого языка состоит из ряда инструкций любой формы:

  • [text | %<expression>]* 

    Текст литерала передается в выходной поток без изменений, а выражения, заключенные в %< > оцениваются перед записью в выходные данные (отбрасываются %< >).

  • %keyword [argument1, argument2, ...]

    %keyword представляет одну из директив компилятора целевого языка, и [argument1, argument2, ...] представляет выражения, определяющие требуемые параметры. Например, оператор

    %assign sysNumber = sysIdx + 1

    использует %assign директива для определения или изменения значения sysNumber параметр.

Директивы

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

%% text

Однострочный комментарий, где text является комментарием.

/% text%/

Однострочный (или многострочный) комментарий, где text является комментарием.

%matlab

Вызывает функцию MATLAB, которая не возвращает результат. Например, %matlab disp(2.718).

%<expr>

Вычисляемые выражения целевого языка. Например, при наличии переменной TLC, созданной с помощью %assign varName = "foo", то %<varName> будет расширяться до foo. Выражения также могут быть вызовами функций, как в %<FcnName(param1,param2)>. В строках директивы TLC-выражения не должны помещаться в %<> синтаксис. Это приводит к двойной оценке. Например, %if %<x> == 3 обрабатывается путем создания скрытой переменной для вычисленного значения переменной x. %if затем оператор оценивает эту скрытую переменную и сравнивает ее с 3. Эффективным способом выполнения этой операции является запись %if x == 3. В нотации MATLAB это будет равняться записи, если eval('x') == 3 в отличие от if x = 3. Исключение из этого - во время %assign для управления форматом, как в

 %assign str = "value is: %<var>"

Примечание: Вложенные выражения оценки (например, %<foo(%<expr>)> ) не поддерживаются.

Не существует штрафа за скорость для оценок внутри строк, таких как

%assign x = "%<expr>"

Избегайте оценок за пределами строк, например, в следующем примере.

%assign x = %<expr>

%if expr
%elseif expr
%else
%endif

Условное включение, где константное выражение expr должен вычисляться как целое число. Например, следующий код проверяет, является ли параметр, k, имеет числовое значение 0,0 путем выполнения функции библиотеки TLC для проверки равенства.

%if ISEQUAL(k, 0.0)
  <text and directives to be processed if k is 0.0>
%endif

В этой и других директивах нет необходимости расширять переменные или выражения с помощью %<expr> нотация, если expr отображается в строке. Например,

%if ISEQUAL(idx, "my_idx%<i>"), где idx и i являются обеими строками.

Как и в других языках, логические оценки имеют короткое замыкание (останавливаются, когда результат известен).

%switch expr
  %case expr
  %break
  %default
  %break
%endswitch

%switch директива аналогична языку C switch заявление. Выражение expr должен быть типа, который можно сравнить для равенства с помощью == operator. Если %break не включен после %case заявление, затем оно перейдет к следующему заявлению.

%with
%endwith

%with recordName является оператором области действия. Используйте его, чтобы поместить именованную запись в текущую область, чтобы оставаться до соответствия %endwith встречается (%with директивы могут быть вложены по желанию).

Обратите внимание, что в левой части %assign операторы, содержащиеся в %with / %endwith , ссылки на поля записей должны быть полностью определены (см. раздел Присвоение значений полям записей), как в следующем примере.

%with CompiledModel
	 %assign oldName = name
	 %assign CompiledModel.name = "newname"
 	%endwith

%setcommandswitch string

Изменяет значение параметра командной строки в соответствии со строкой аргумента. Поддерживаются только следующие коммутаторы:

v, m, p, O, d, r, I, a

В следующем примере устанавливается уровень детализации 1.

%setcommandswitch "-v1"

См. также Аргументы командной строки.

%assert expr

Проверяет значение логического выражения. Если выражение имеет значение false, TLC выдает сообщение об ошибке, трассировку стека и выход из него; в противном случае выполнение продолжается нормально. Чтобы включить оценку утверждений вне среды генератора кода, используйте параметр командной строки -da. При построении из генератора кода этот флаг игнорируется, так как он заменяется флажком Enable TLC assertion в разделе TLC process панели Code Generation > Debug. Для управления обработкой утверждений из окна команд MATLAB используйте

set_param(model, 'TLCAssertion', 'on|off')

для установки этого флага вкл или выкл. Значение по умолчанию - Выкл. Для просмотра текущей настройки используйте

get_param(model, 'TLCAssertion')

%error
%warning
%trace
%exit

Директивы управления потоком:

%error tokens

tokens разворачиваются и отображаются.

%warning tokens

tokens разворачиваются и отображаются.

%trace tokens

tokens разворачиваются и отображаются только в том случае, если опция командной строки подробного вывода -v или -v1 указывается.

%exit tokens

tokens разворачиваются, отображаются и TLC выходит.

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

%exit Error Message

Если вы добавляете код подтверждения (то есть код, который никогда не должен быть достигнут), используйте

%setcommandswitch "-v1" %% force TLC stack trace 
%exit Assert message

%assign

Создает идентификаторы (переменные). Общая форма:

%assign [::]variable = expression 

 :: указывает, что создаваемая переменная является глобальной переменной; в противном случае это локальная переменная в текущей области действия (т.е. локальная переменная в функции).

Если необходимо отформатировать переменную, например, в строке на основе других переменных TLC, то следует выполнить двойную оценку, как в

%assign nameInfo = "The name of this is %<Name>"

или поочередно

%assign nameInfo = "The name of this is " + Name

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

%createrecord

Создает записи в памяти. Эта команда принимает список из одной или нескольких спецификаций записи (например, { foo 27 }). Каждая спецификация записи содержит список нулевых или более пар имя-значение (например, foo 27), которые становятся членами создаваемой записи. Сами значения могут быть спецификациями записи, как показано ниже.

%createrecord NEW_RECORD { foo 1 ; SUB_RECORD {foo 2} }
%assign x = NEW_RECORD.foo                  /* x = 1 */
%assign y = NEW_RECORD.SUB_RECORD.foo       /* y = 2 */

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

%createrecord RECORD_ARRAY { foo 1 } ...
							        { foo 2 } ...
							        { bar 3 } 
%assign x = RECORD_ARRAY[1].foo             /* x = 2 */
%assign y = RECORD_ARRAY[2].bar             /* y = 3 */

Обратите внимание, что можно создавать и индексировать массивы субзаписей, указывая %createrecord с одинаковыми субзаписями, как показано ниже:

%createrecord RECORD_ARRAY { SUB_RECORD { foo 1 } ... 
                             SUB_RECORD { foo 2 } ... 
                             SUB_RECORD { foo 3 } }
%assign x = RECORD_ARRAY.SUB_RECORD[1].foo  /* x = 2 */
%assign y = RECORD_ARRAY.SUB_RECORD[2].foo  /* y = 3 */

Если оператор разрешения области (::) - первый маркер после %createrecord token, запись создается в глобальной области.

Примечание

Не следует создавать массив записей с помощью %createrecord внутри цикла.

%addtorecord

Добавляет поля к существующей записи. Новые поля могут быть парами «имя-значение» или псевдонимами уже существующих записей.

%addtorecord OLD_RECORD foo 1

Если добавляемое новое поле является записью, то %addtorecord создает псевдоним для этой записи вместо глубокой копии. чтобы сделать глубокую копию, используйте %copyrecord.

%createrecord NEW_RECORD { foo 1 }
%addtorecord OLD_RECORD NEW_RECORD_ALIAS NEW_RECORD

%mergerecord

Добавляет (или объединяет) одну или несколько записей в другую. Первая запись будет содержать результаты объединения первой записи плюс содержимое других записей, указанных командой. Содержимое второй (и последующих) записей глубоко копируется в первую (т.е. они не являются ссылками).

%mergerecord OLD_RECORD NEW_RECORD

Если в объединяемых записях существуют повторяющиеся поля, то поля исходной записи не перезаписываются.

%copyrecord

Создание глубокой копии существующей записи. Он создает новую запись аналогично %createrecord за исключением того, что компоненты записи глубоко скопированы из существующей записи. Псевдонимы заменяются копиями.

%copyrecord NEW_RECORD OLD_RECORD

%realformat

Указывает, как форматировать реальные переменные. Для форматирования в экспоненциальной нотации с 16 цифрами точности используйте

%realformat "EXPONENTIAL"

Для форматирования без потери точности и минимального количества символов используйте

%realformat "CONCISE"

При встраивании S-функций для формата устанавливается значение concise. Можно переключиться на exponential, но должен переключить его обратно на concise когда это будет сделано.

%language

Это должно появиться перед первым GENERATE или GENERATE_TYPE вызов функции. Здесь указывается имя языка в виде строки, создаваемой как в %language "C". Как правило, он добавляется в системный целевой файл.

Единственное допустимое значение: C который обеспечивает поддержку C и C++ создание кода в соответствии с параметром конфигурации TargetLang(дополнительные сведения см. в разделе Язык).

%implements

Размещено в пределах .tlc файл для определенного типа записи, при сопоставлении через %generatefile. Синтаксис: %implements "Type" "Language". При встраивании S-функции в C или C++ это должна быть первая строка без комментариев в файле, как в

%implements "s_function_name" "C"

Следующими не комментирующими строками будут %function директивы, определяющие функциональность S-функции.

См. раздел %language и GENERATE описания функций для получения дополнительной информации.

%generatefile

Обеспечивает сопоставление между записью Type и функции, содержащиеся в файле. Каждая запись может иметь функции одного и того же имени, но различное содержимое, отображаемое на нее (т.е. полиморфизм). Как правило, это используется для отображения Block отчет Type в .tlc файл, реализующий функциональные возможности блока, как в

%generatefile "Sin" "sin_wave.tlc"

%filescope

Ограничивает область переменных файлом, в котором они определены. A %filescope директива в любом месте файла объявляет, что переменные в файле видны только в этом файле. Обратите внимание, что это ограничение также применяется к файлам, вставленным через %include директива, в файл, содержащий %filescope директива.

Вы не должны использовать %filescope директива в рамках функций или GENERATE функции.

%filescope полезен при сохранении памяти. Переменные, область действия которых ограничена %filescope выйти из области после завершения выполнения файла, содержащего их. Это освобождает память, выделенную таким переменным. Напротив, глобальные переменные сохраняются в памяти на протяжении всего выполнения программы.

%include

Использовать %include "file.tlc"для вставки указанного целевого файла в текущей точке.

%include директивы ведут себя так, как будто они находятся в глобальном контексте. Например,

%addincludepath "./sub1"
%addincludepath "./sub2"

в .tlc позволяет неявно ссылаться на любую подпапку:

%include "file_in_sub1.tlc"
%include "file_in_sub2.tlc"

Используйте косую черту для имен папок, поскольку они работают как в UNIX ®, так и в ПК. Однако если вы используете обратную косую черту в именах папок ПК, обязательно избегайте их, например ,"C:\\mytlc". Можно также выразить имя папки ПК как литерал, используя спецификатор формата L, как в L"C:\mytlc".

%addincludepath

Использовать %addincludepath "folder" добавление дополнительных путей для поиска. Несколько %addincludepath могут появиться директивы. Компилятор оценивает несколько %addincludepath директивы снизу вверх.

Используя %addincludepath директивы устанавливают глобальный контекст. Например,

%addincludepath "./sub1"
%addincludepath "./sub2"

в .tlc позволяет неявно ссылаться на любую подпапку:

%include "file_in_sub1.tlc"
%include "file_in_sub2.tlc"

Используйте косую черту для имен папок, поскольку они работают как в UNIX, так и в ПК. Однако если вы используете обратную косую черту в именах папок ПК, обязательно избегайте их, например, "C:\\mytlc". Можно также выразить имя папки ПК как литерал, используя спецификатор формата L, как в L"C:\mytlc".

%roll
%endroll

Многократное включение плюс сворачивание внутреннего цикла на основе заданного порога. Эта директива может использоваться большинством блоков Simulink ®, имеющих концепцию общей ширины блока, которая обычно является шириной сигнала, проходящего через блок .

Этот пример %roll директива для операции усиления, y=u*k:

%function Outputs(block, system) Output
  /* %<Type> Block: %<Name> */
  %assign rollVars = ["U", "Y", "P"]
  %roll sigIdx = RollRegions, lcv = RollThreshold, block,... 
        "Roller", rollVars
    %assign y = LibBlockOutputSignal(0, "", lcv, sigIdx)
    %assign u = LibBlockInputSignal(0, "", lcv, sigIdx)
    %assign k = LibBlockParameter(Gain, "", lcv, sigIdx)
      %<y> = %<u> * %<k>;
  %endroll
%endfunction

%roll директива аналогична %foreach, за исключением того, что он итерирует идентификатор (sigIdx в этом примере) по областям крена. Области рулона вычисляются путем просмотра входных сигналов и формирования областей, где входные сигналы являются смежными. Для блоков переменная RollRegions автоматически вычисляется и помещается в Block запись. Примером вектора областей рулона является [0:19, 20:39], где имеются два смежных диапазона сигналов, проходящих через блок. Первый - 0:19 и второй - 20:39. Каждая область рулона либо помещается в тело петли (например, язык Си). for оператор) или встроенный, в зависимости от того, меньше ли длина области, чем порог крена.

Каждый раз через %roll петля, sigIdx - целое число для начала текущей области крена или смещение относительно общей ширины блока, когда текущая область крена меньше порога крена. Глобальная переменная TLC RollThreshold - общее значение для всей модели, используемое для принятия решения о том, когда поместить заданную область рулона в контур. Когда принимается решение поместить заданную область в цикл, переменная управления циклом является действительным идентификатором (например, "i"); в противном случае это "".

block параметр является текущим блоком, который катится. "Roller" параметр задает имя для внутреннего GENERATE_TYPE вызовы, выполненные %roll. Дефолт %roll обработчик - "Roller", который отвечает за настройку структур качения цикла блоков по умолчанию (например, C for цикл).

rollVars (переменные крена) передаются в "Roller" для создания структур рулона. Определенные переменные цикла относительно блока:

"U"

Входы в блок. Предполагается, что вы используете LibBlockInputSignal(portIdx, "", lcv, sigIdx) для доступа к каждому входу, где portIdx начинается с 0 для первого входного порта.

"ui"

Аналогично "U", за исключением конкретных входных данных, i. "u" должен быть строчным или интерпретироваться как "U" выше.

"Y"

Выходы блока. Предполагается, что вы используете LibBlockOutputSignal(portIdx, "", lcv, sigIdx) для доступа к каждому выходу, где portIdx начинается с 0 для первого выходного порта.

"yi"

Аналогично "Y", за исключением конкретных выходных данных, i. "y" должен быть строчным или интерпретироваться как "Y" выше.

"P"

Параметры блока. Предполагается, что вы используете LibBlockParameter(name, "", lcv, sigIdx) для доступа к ним.

"<param>/name"

Аналогично "P", за исключением конкретного name.

rwork

RWork векторы блока. Предполагается, что вы используете LibBlockRWork(name, "", lcv, sigIdx) для доступа к ним.

"<rwork>/name"

Аналогично RWork, за исключением конкретного name.

dwork

DWork векторы блока. Предполагается, что вы используете LibBlockDWork(name, "", lcv, sigIdx) для доступа к ним.

"<dwork>/name"

Аналогично DWork, за исключением конкретного name.

iwork

IWork векторы блока. Предполагается, что вы используете LibBlockIWork(name, "", lcv, sigIdx) для доступа к ним.

"<iwork>/name"

Аналогично IWork, за исключением конкретного name.

pwork

PWork векторы блока. Предполагается, что вы используете LibBlockPWork(name, "", lcv, sigIdx) для доступа к ним.

"<pwork>/name"

Аналогично PWork, за исключением конкретного name.

"Mode"

Вектор режима. Предполагается, что вы используете LibBlockMode("",lcv,sigIdx) для доступа к нему.

"PZC"

Предыдущее состояние пересечения нуля. Предполагается, что вы используете LibPrevZCState("",lcv, sigIdx) для доступа к нему.

Чтобы свернуть собственный вектор на основе областей крена блока, необходимо пройтись по указателю на вектор. Предполагая, что на ваш вектор указывает первый PWork, вызываемый name,

datatype *buf = (datatype*)%<LibBlockPWork(name,"","",0)
%roll sigIdx = RollRegions, lcv = RollThreshold, block, ...
      "Roller", rollVars
  *buf++ = whatever;
%endroll

Примечание: В приведенном выше примере sigIdx и lcv являются локальными по отношению к телу цикла.

%breakpoint

Устанавливает точку останова для отладчика TLC. См. директиву% breakpoint.

%function
%return
%endfunction

Функция, возвращающая значение, определяется как

%function name(optional-arguments) 
    %return value 
  %endfunction

Функция void не производит вывод и не должна возвращать значение. Он определяется как

%function name(optional-arguments) void 
  %endfunction

Функция, которая выдает выходные данные в текущий поток и не должна возвращать значение, определяется как

%function name(optional-arguments) Output 
  %endfunction

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

%function BlockInstanceSetup(block,system) void

Вызывается для каждого экземпляра блока в модели.

%function BlockTypeSetup(block,system) void

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

%function Enable(block,system) Output

Используйте этот параметр, если блок помещен в включенную подсистему и должен выполнять определенные действия, когда подсистема включена. Поместите в подсистему подпрограмму включения.

%function Disable(block,system) Output

Используйте этот параметр, если блок помещен в отключенную подсистему и должен выполнять определенные действия при отключенной подсистеме. Поместите в подсистему подпрограмму отключения.

%function Start(block,system) Output

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

%function InitializeConditions(block,system) Output

Используйте эту функцию, если ваш блок имеет состояние, которое должно быть инициализировано в начале выполнения и когда включенная подсистема сбрасывает состояния. Место в MdlStart и/или процедуры инициализации подсистемы.

%function Outputs(block,system) Output

Основная функция вашего блока. Место в MdlOutputs.

%function Update(block,system) Output

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

%function Derivatives(block,system) Output

Используйте эту функцию, если блок имеет производные.

%function ZeroCrossings(block,system) Output

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

%function Terminate(block,system) Output

Используйте эту функцию, если ваш блок имеет действия, которые должны быть в MdlTerminate.

%foreach
%endforeach

Множественное включение, которое итерируется из 0 в upperLimit-1 константное целое выражение. Каждый раз через цикл, loopIdentifier, (например, x) назначается текущее значение итерации.

%foreach loopIdentifier = upperLimit 
   %break -- use this to exit the loop 
   %continue -- use this to skip the following code and  
                continue to the next iteration 
%endforeach

Примечание: upperLimit выражение приводится к целочисленному значению TLC. loopIdentifier является локальным по отношению к телу цикла.

%for

Директива множественного включения с синтаксисом

%for ident1 = const-exp1, const-exp2, ident2 = const-exp3
  %body
    %break
    %continue
  %endbody
%endfor

Первая часть %for директива идентична директиве %foreach заявление. %break и %continue директивы действуют так же, как и в %foreach директива. const-exp2 - логическое выражение, указывающее, следует ли поворачивать цикл (см. %roll выше).

Если const-exp2 вычисляется как TRUE, ident2 присваивается значение const-exp3. В противном случае ident2 назначается пустая строка.

Примечание: ident1 и ident2 указанные выше являются локальными по отношению к телу петли.

%openfile
%selectfile
%closefile

Они используются для управления созданными файлами. Синтаксис:

%openfile streamId="filename.ext" mode  {open for writing} 
%selectfile streamId                   {select an open file} 
%closefile streamId                     {close an open file}

Обратите внимание, что "filename.ext"является необязательным. Если имя файла не указано, переменная (строковый буфер) с именем streamId создается, содержащий выходные данные. Аргумент режима необязателен. Если указано, это может быть "a" для добавления или "w" для написания.

Обратите внимание, что специальная строка streamIdNULL_FILE указывает на отсутствие выходных данных. Специальная строка streamIdSTDOUT определяет вывод на терминал.

Чтобы создать буфер текста, используйте

%openfile buffer
text to be placed in the 'buffer' variable.
%closefile buffer

Сейчас buffer содержит развернутый текст, указанный между %openfile и %closefile директивы.

%generate

%generate blk fn эквивалентно GENERATE(blk,fn).

%generate blk fn type эквивалентно GENERATE(blk,fn,type).

См. разделы СОЗДАНИЕ и GENERATE_TYPE функций.

%undef

%undef var удаляет переменную var из области применения. Если var - поле в записи, %undef удаляет это поле из записи. Если var является массивом записей, %undef удаляет весь массив записей.

Комментарии

Комментарии можно размещать в любом месте целевого файла. Чтобы включить комментарии, используйте /%...%/ или %% директивы. Например:

/%
    Abstract:    Return the field with [width], if field is wide
%/

или

%endfunction %% Outputs function

Используйте %% конструкция для комментариев на основе строк. Символы из %% до конца строки стать комментарием.

Неориентированные строки, то есть строки, которые не имеют % в качестве первого непустого символа копируются в выходной буфер. Например,

/* Initialize sysNumber */
int sysNumber = 3;

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

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

Примечание

Если в функции появляется неориентированная строка, она не копируется в выходной буфер, если функция не является выходной функцией или вы специально выбираете выходной файл с помощью %selectfile директива. Дополнительные сведения о функциях см. в разделе Функции целевого языка.

Продолжение строки

Можно использовать язык C \ символ или последовательность MATLAB ... для продолжения строки. Если директива слишком длинна для удобного размещения на одной строке, это позволяет разделить директиву на несколько строк. Например:

%roll sigIdx = RollRegions, lcv = RollThreshold, block,\ 
      "Roller", rollVars

или

%roll sigIdx = RollRegions, lcv = RollThreshold, block,... 
      "Roller", rollVars

Примечание

Использовать \ подавление линейной подачи к выходу и многоточию ... для указания продолжения строки. Обратите внимание, что \ и многоточие ... не может использоваться внутри строк.

Типы значений целевого языка

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

Строка типа значенияПример Описание

"Boolean"

1==1

Результат сравнения или другого логического оператора. Результат будет TLC_TRUE или TLC_FALSE.

"Complex"

3.0+5.0i

64-разрядное комплексное число двойной точности (double на целевой машине).

"Complex32"

3.0F+5.0Fi

32-разрядное комплексное число одинарной точности (float на целевой машине).

"File"

%openfile x

Буфер строк открыт с помощью %openfile.

"File"%openfile x = "out.c"

Файл открыт с помощью %openfile.

"Function"

%function foo...

Определяемая пользователем функция и TLC_FALSE в противном случае.

"Gaussian"

3+5i

32-разрядное целое воображаемое число (int на целевой машине).

"Identifier"abc

Значения идентификаторов могут отображаться только в пределах model.rtw файл и не может отображаться в выражениях (в контексте выражения идентификаторы интерпретируются как значения). Для сравнения со значением идентификатора используйте строку; идентификатор будет преобразован в строку.

"Matrix"

Matrix (3,2) [ [ 1, 2]; [3 , 4]; [ 5, 6] ]

Матрицы - это просто списки векторов. Отдельные элементы матрицы не обязательно должны быть одного типа и могут быть любого поддерживаемого типа, кроме векторов или матриц. Matrix (3,2) текст в примере является необязательным.

"Number"

15

Целое число (int на целевой машине).

"Range"

[1:5]

Диапазон целых чисел от 1 до 5 включительно.

"Real"3.14159

Число с плавающей запятой (double на целевой машине), включая экспоненциальную нотацию.

"Real32"

3.14159F

32-разрядное одинарное число с плавающей запятой (float на целевой машине).

"Scope"

Block { ... }

Блокирующая запись.

"Special"

FILE_EXISTS

Специальная встроенная функция, например FILE_EXISTS.

"String"

"Hello, World"

Строки символов ASCII. Во всех контекстах две строки в строке объединяются для формирования конечного значения, как в "Hello, " "World", который объединяется в форму "Hello, World". Эти строки включают стандартные escape-последовательности ANSI ® C, такие как\n, \r, \tи т.д. Использование символов продолжения строки (т. е. \ и ...) внутри строк недопустимо.

"Subsystem"

<sub1>

Идентификатор подсистемы. В контексте расширения будьте осторожны, чтобы избежать разделителей на идентификаторе подсистемы, как в %<x == <sub\>>.

"Unsigned"

15U

32-разрядное беззнаковое целое число (unsigned int на целевой машине).

"Unsigned Gaussian"

3U+5Ui

32-разрядное комплексное беззнаковое целое число (unsigned int на целевой машине).

"Vector"

[1, 2] or BR Vector(2) [1, 2]

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

Выражения целевого языка

Можно включить выражение формы %<expression> в целевом файле. Компилятор целевого языка заменяет %<expression> с вычисленным значением замены, основанным на типе переменных в %<> оператор. Целочисленные константные выражения сворачиваются и заменяются результирующим значением; строковые константы объединяются (например, две строки в строке) "a" "b", заменены на "ab").

%<expression>                /* Evaluates the expression.  
  * Operators include most standard C
  * operations on scalars. Array indexing
  * is required for certain parameters that 
  * are block-scoped within the .rtw file.*/

В контексте выражения каждый идентификатор должен вычисляться как идентификатор или аргумент функции, находящийся в данный момент в области действия. Вы можете использовать %< > директива в строке для выполнения подстановки текста. Чтобы включить > символ в замене, вы должны избежать его с помощью \ персонаж. Например:

%<x \> 1 ? "ABC" : "123">

Операторы, которым требуется > ниже перечислены символы, которые должны быть сброшены:

ОператорОписаниеПример
>

больше, чем

y = %<x \> 2>;
>=

больше или равно

y = %<x \>= 3>;
>>

правая смена

y = %<x \>\> 4>;

В таблице Выражения целевого языка перечислены операторы, разрешенные в выражениях. В этой таблице выражения перечислены в порядке от наивысшего до низшего приоритета. Горизонтальные линии различают порядок операций.

Как и в выражениях C, условные операторы короткозамкнуты. Если выражение включает вызов функции с эффектами, эффекты замечаются, как если бы все выражение не было полностью оценено. Например:

%if EXISTS(foo) && foo == 3

Если первый член выражения имеет логическое значение false (т. е. foo не существует), второй срок (foo == 3) не оценивается.

В предстоящей таблице обратите внимание, что numeric является одним из следующих:

  • Boolean

  • Number

  • Unsigned

  • Real

  • Real32

  • Complex

  • Complex32

  • Gaussian

  • UnsignedGaussian

Также обратите внимание, что integral является одним из следующих:

  • Number

  • Unsigned

  • Boolean

Сведения о рекламных акциях, возникающих при работе компилятора целевого языка с выражениями смешанного типа, см. в разделе Рекламные акции TLC Data Promotions.

Выражения целевого языка

Выражение

Определение

constant

Постоянное значение параметра. Значение может быть вектором или матрицей.

variable-name

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

::variable-name

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

expr[expr]

Индексировать в параметр массива. Диапазон индексов массива: 0 кому N-1. Этот синтаксис используется для индексирования в векторы, матрицы и повторяющиеся переменные области действия.

expr([expr[,expr]...])

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

Примечание.Макросы основаны на тексте; они не могут использоваться в том же выражении, что и другие операторы.

expr . expr

Первое выражение должно иметь допустимую область действия; второе выражение является именем параметра в этой области.

(expr)

Использовать () для переопределения приоритета операций.

!expr

Логическое отрицание (генерирует TLC_TRUE или TLC_FALSE). Аргумент должен быть числовым или логическим.

-expr

Унарный минус сводит на нет выражение. Аргумент должен быть числовым.

+expr

Никакого эффекта; операнд должен быть числовым.

~expr

Битовое отрицание операнда. Аргумент должен быть целым числом.

expr * expr

Умножает два выражения; операнды должны быть числовыми.

expr / expr

Делит два выражения; операнды должны быть числовыми.

expr % expr

Принимает целое число по модулю выражений; операнды должны быть целыми числами.

expr + expr

Работает с числовыми типами, строками, векторами, матрицами и записями следующим образом:

Числовые типы: добавление двух выражений; операнды должны быть числовыми.

Строки: Строки сцеплены.

Векторы: Если первый аргумент является вектором, а второй - скаляром, скаляр добавляется к вектору.

Матрицы: Если первый аргумент является матрицей, а второй - вектором той же ширины столбца, что и матрица, вектор добавляется в качестве другой строки матрицы.

Записи: Если первый аргумент является записью, второй аргумент добавляется в качестве идентификатора параметра (с его текущим значением).

Обратите внимание, что оператор сложения является ассоциативным.

expr - expr

Вычитает два выражения; операнды должны быть числовыми.

expr << expr

Левый операнд смещается на величину, равную правому операнду; аргументы должны быть целыми числами.

expr >> expr

Смещение вправо левого операнда на величину, равную правому операнду; аргументы должны быть целыми числами.

expr > expr

Проверяет, больше ли первое выражение, чем второе; аргументы должны быть числовыми.

expr < expr

Проверяет, меньше ли первое выражение, чем второе; аргументы должны быть числовыми.

expr >= expr

Проверяет, больше или равно ли первое выражение второму выражению; аргументы должны быть числовыми.

expr <= expr

Проверяет, меньше или равно ли первое выражение второму выражению; аргументы должны быть числовыми.

expr == expr

Проверяет, равны ли эти два выражения.

expr != expr

Проверяет, не равны ли эти два выражения.

expr & expr

Выполняет битово И двух аргументов; аргументы должны быть целыми числами.

expr ^ expr

Выполняет побитовое XOR двух аргументов; аргументы должны быть целыми числами.

expr | expr

Выполняет побитовое ИЛИ двух аргументов; аргументы должны быть целыми числами.

expr && expr

Выполняет логическое И двух аргументов и возвращает TLC_TRUE или TLC_FALSE. Это можно использовать для числовых или логических аргументов.

expr || expr

Выполняет логическое ИЛИ двух аргументов и возвращает TLC_TRUE или TLC_FALSE. Это можно использовать для числовых или логических аргументов.

expr ? expr : expr

Проверяет первое выражение для TLC_TRUE. Если true, возвращается первое выражение; в противном случае возвращается второе выражение.

expr , expr

Возвращает значение второго выражения.

Примечание

Реляционные операторы ( <, =<, >, >=, !=, == ) может использоваться с нефинитными значениями.

Нет необходимости размещать выражения в %< > eval формат, когда они появляются в строках директивы. Это приводит к двойной оценке.

Рекламные мероприятия по передаче данных TLC

Когда компилятор целевого языка работает со смешанными типами выражений, он продвигает результаты в общие типы, указанные в следующей таблице.

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

B

Булев

N

Число

U

Неподписанный

F

Real32

D

Реальный

G

Гауссовский

UG

UnsignedGaussian

C32

Complex32

C

Комплекс

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

Например, если операция включает логическое выражение (B) и неподписанное выражение (U), результатом будет выражение без знака (U).

Типы данных, являющиеся результатом выражений смешанного типа

 BNUFDGUGC32C
BBNUFDGUGC32C
NNNUFDGUGC32C
UUUUFDUGUGC32C
FFFFFDC32C32C32C
DDDDDDCCCC
GGGUGC32CGUGC32C
UGUGUGUGC32CUGUGC32C
C32C32C32C32C32CC32C32C32C
CCCCCCCCCC

Форматирование

По умолчанию компилятор целевого языка выводит числа с плавающей запятой в экспоненциальном представлении с 16 цифрами точности. Чтобы переопределить значение по умолчанию, используйте директиву

%realformat string

Если string является "EXPONENTIAL"используется стандартная экспоненциальная нотация с 16 цифрами точности. Если string является "CONCISE"компилятор использует внутреннюю эвристику для вывода значений в более читаемой форме при сохранении точности. %realformat директива задает формат по умолчанию для Real число, выводимое на выбранный стиль для оставшейся части обработки или до тех пор, пока он не встретится с другим %realformat директива.

Условное включение

Условные директивы включения:

%if constant-expression
%else
%elseif constant-expression
%endif

%switch constant-expression
%case constant-expression
%break
%default
%endswitch

% если

constant-expression должен вычисляться как целочисленное выражение. Он управляет включением следующих строк, пока не встретит %else, %elseif, или %endif директива. Если constant-expression вычисляется как 0строки, следующие за директивой, не включены. Если constant-expression возвращает целое значение, отличное от 0, строки, следующие за %if директива включена до %endif, %elseif, или %else директива.

Когда компилятор встречает %elseif директива, и никаких предыдущих %if или %elseif имеет значение, отличное от нуля, компилятор оценивает выражение. Если значение равно 0, строки, следующие за %elseif директива не включена. Если значение не равно нулю, строки, следующие за %elseif директива включается до следующего %else, %elseif, или %endif директива.

%else директива начинает включение исходного текста, если предыдущий %elseif инструкции или оригинал %if оператор вычисляется как 0; в противном случае это предотвращает включение последующих линий до и включая следующие %endif.

constant-expression может содержать любое выражение, указанное в выражениях целевого языка.

% switch

%switch оператор вычисляет константное выражение и сравнивает его с выражениями, появляющимися на %case селекторы. Если найдено совпадение, тело %case включено; в противном случае %default включен.

%case ... %default тела текут вместе, как в C, и %break должен использоваться для выхода из инструкции switch. %break выходит из ближайшего корпуса %switch, %foreach, или %for цикл, в котором он появляется. Например,

%switch(type)
%case x         
	/* Matches variable x. */
	/* Note: Any valid TLC type is allowed. */
%case "Sin"
	/* Matches Sin or falls through from case x. */
   %break
	/* Exits the switch. */
%case "gain"
	/* Matches gain. */
   %break
%default
	/* Does not match x, "Sin," or "gain." */
%endswitch

В целом, это более читаемая форма для %if/%elseif/%else строительство.

Множественное включение

% foreach

Синтаксис %foreach директива множественного включения

%foreach identifier = constant-expression
   %break
   %continue
%endforeach

constant-expression должно вычисляться до целого выражения, которое затем определяет количество раз для выполнения foreach цикл. identifier приращения от 0 на единицу меньше указанного числа. В пределах foreach loop, можно использовать x, где x - идентификатор для доступа к переменной идентификатора. %break и %continue являются необязательными директивами, которые можно включить в %foreach директива:

  • Использовать %break выход из ближайшего корпуса %for, %foreach, или %switch заявление.

  • Использовать %continue для начала следующей итерации цикла.

% для

Примечание

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

Синтаксис %for директива множественного включения

%for ident1 = const-exp1, const-exp2, ident2 = const-exp3
  %body
    %break
    %continue
  %endbody
%endfor

Первая часть %for директива идентична директиве %foreach оператор в том, что он вызывает выполнение цикла из 0 кому N-1 раз за тело петли. В обычном случае он включает только строки между %body и %endbodyи линии между %for и %body, и игнорирует строки между %endbody и %endfor.

%break и %continue директивы действуют так же, как и в %foreach директива.

const-exp2 - логическое выражение, указывающее, следует ли поворачивать цикл. Если const-exp2 true, ident2 получает значение const-exp3; в противном случае он получает пустую строку. При накате контура линии между %for и %endfor включаются в выходные данные ровно один раз. ident2 указывает идентификатор, используемый для проверки того, был ли цикл свернут внутри тела. Например,

%for Index = <NumNonVirtualSubsystems>3, rollvar="i"

    {
        int i;

        for (i=0; i< %<NumNonVirtualSubsystems>; i++)
        {
          %body
	x[%<rollvar>] = system_name[%<rollvar>];
          %endbody

        }
    }
%endfor

Если количество невиртуальных подсистем (NumNonVirtualSubsystems) больше или равно 3, цикл прокатывается, в результате чего код в цикле генерируется ровно один раз. В этом случае Index = 0.

Если цикл не свернут, текст до и после тела цикла игнорируется, и тело генерируется NumNonVirtualSubsystems времена.

Этот механизм позволяет каждому отдельному контуру управлять тем, следует ли его прокатывать.

% крена

Синтаксис %roll директива множественного включения

%roll ident1 = roll-vector-exp, ident2 = threshold-exp, ... 
               block-exp [, type-string [,exp-list] ]
  %break
  %continue
%endroll

В этой инструкции используется roll-vector-exp для расширения тела %roll оператор несколько раз, как в %foreach заявление. Если диапазон указан в roll-vector-expи этот диапазон больше, чем threshold-exp выражение, цикл будет вращаться. Когда петля вращается, тело петли расширяется один раз и идентификатор (ident2) для порогового выражения устанавливается имя переменной управления циклом. Если диапазон не превышает указанное пороговое значение, этот оператор идентичен %foreach заявление. Например,

%roll Idx = [ 1 2 3:5, 6, 7:10 ], lcv = 10, ablock
%endroll

В этом случае тело %roll оператор расширяется в 10 раз, как в %foreach оператор, поскольку нет областей, больших или равных 10. Idx подсчитывает от 1 до 10, и lcv имеет значение NULL, "".

Когда компилятор целевого языка определяет, что данный блок будет вращаться, он выполняет GENERATE_TYPE вызов функции для вывода различных частей цикла (кроме тела). Используемый по умолчанию тип: Roller; можно переопределить этот тип с помощью указанной строки. Дополнительные аргументы переданы %roll утверждения приводятся в качестве аргументов для этих специальных функций. Вызываемая функция является одной из следующих четырех функций:

RollHeader(block, ...).  Эта функция вызывается один раз в первом разделе этого вектора крена, который будет фактически крен. Он должен возвращать строку, которая назначена lcv внутри тела %roll заявление.

LoopHeader(block, StartIdx, Niterations, Nrolled, ...).  Эта функция вызывается один раз для каждой секции, которая будет вращаться перед телом %roll заявление.

LoopTrailer(block, Startidx, Niterations, Nrolled, ...).  Эта функция вызывается один раз для каждого раздела, который будет вращаться после тела %roll заявление.

RollTrailer(block, ...).  Эта функция вызывается один раз в конце %roll оператор, если какой-либо из диапазонов вызвал качание цикла.

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

Пример Roller.tlc файл -

%implements Roller "C"
%function RollHeader(block) Output
	{
		int i;
	%return ("i")
%endfunction
%function LoopHeader(block,StartIdx,Niterations,Nrolled) Output
 	for (i = %<StartIdx>; i < %<Niterations+StartIdx>; i++)
	{
%endfunction
%function LoopTrailer(block,StartIdx,Niterations,Nrolled) Output
	}
%endfunction
%function RollTrailer(block) Output
	}
%endfunction

Примечание

Библиотека функций компилятора целевого языка, поставляемая с генератором кода, имеет возможность извлекать ссылки на векторы блочного ввода-вывода и других генераторов кода, которые значительно упрощают тело %roll заявление. Эти функции включают LibBlockInputSignal, LibBlockOutputSignal, LibBlockParameter, LibBlockRWork, LibBlockIWork, LibBlockPWork, LibDeclareRollVars, LibBlockMatrixParameter, LibBlockParameterAddr, LibBlockContinuousState, и LibBlockDiscreteState. (См. страницы ссылок на функции в разделах Функции входного сигнала, Функции выходного сигнала, Функции параметров, Состояние блока и Функции рабочего вектора.) Эта библиотека также включает реализацию по умолчанию Roller.tlc в виде «плоского» валика.

Распространение первого примера на петлю, которая катится,

%language "C"
%assign ablock = BLOCK { Name "Hi" }
%roll Idx = [ 1:20, 21, 22, 23:25, 26:46], lcv = 10, ablock
	Block[%< lcv == "" ? Idx : lcv>] *= 3.0;
%endroll

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

{
	int             i;
	for (i = 1; i < 21; i++)
	{
	    Block[i] *= 3.0;
	}
	Block[21] *= 3.0;
	Block[22] *= 3.0;
	Block[23] *= 3.0;
	Block[24] *= 3.0;
	Block[25] *= 3.0;
	for (i = 26; i < 47; i++)
	{
	    Block[i] *= 3.0;
	}
}

Объектно-ориентированное средство для создания целевого кода

Компилятор целевого языка обеспечивает простую объектно-ориентированную функцию. Языковые директивы:

%language string
%generatefile
%implements

Это средство было разработано специально для настройки кода для блоков Simulink, но может использоваться и для других целей.

% язык

%language указывает создаваемый целевой язык. Она необходима в качестве проверки согласованности для проверки файлов реализации, найденных для создаваемого языка. %language директива должна появиться до первой GENERATE или GENERATE_TYPE вызов встроенной функции. %language задает язык в виде строки. Например:

%language "C"

Блоки Simulink имеют Type параметр. Этот параметр является строкой, указывающей тип блока, например "Sin" или "Gain". Объектно-ориентированное средство использует этот тип для поиска пути к файлу, реализующему блок. По умолчанию имя файла - Type блока с .tlc добавляется, например, если Type является "Sin" компилятор будет искать "Sin.tlc" вдоль пути. Это имя файла по умолчанию можно переопределить с помощью %generatefile директива для указания имени файла, которое необходимо использовать для замены имени файла по умолчанию. Например,

%generatefile "Sin" "sin_wave.tlc"

Файлы, реализующие код, специфичный для блока, должны содержать %implements директива, указывающая как тип, так и язык реализации. Компилятор целевого языка приведет к ошибке, если %implements директива не соответствует ожидаемой. Например,

%implements "Sin" "Pascal"

приводит к ошибке, если был выбран начальный язык C.

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

%implements "Sin" "C"

Наконец, с помощью подстановочного знака можно реализовать несколько типов (*) для поля типа:

%implements * "C"

Примечание

Использование подстановочного знака (*) не рекомендуется, потому что это ослабляет проверку ошибок для %implements директива.

СОЗДАНИЕ и GENERATE_TYPE функций

Компилятор целевого языка имеет две встроенные функции, которые отправляют объектно-ориентированные вызовы, GENERATE и GENERATE_TYPE. Функцию, появляющуюся в файле реализации (вне указанного файла), можно вызвать только с помощью GENERATE и GENERATE_TYPE специальные функции.

ГЕНЕРИРОВАТЬ.   GENERATE функция принимает два или более входных аргументов. Первый аргумент должен быть допустимой областью, а второй - строкой, содержащей имя вызываемой функции. GENERATE функция передает первый блочный аргумент и любые дополнительные аргументы, указанные для вызываемой функции. Возвращаемый аргумент - это значение, если оно есть, возвращаемое вызываемой функцией. Обратите внимание, что компилятор автоматически «копирует» или добавляет первый аргумент в список искомых областей, как если бы он появился в %with строка директивы. (См. раздел Область действия переменных.) Эта область удаляется при возврате функции.

GENERATE_TYPE.   GENERATE_TYPE функция принимает три или более входных аргументов. Он обрабатывает первые два аргумента идентично GENERATE вызов функции. Третьим аргументом является тип; тип, указанный в блоке Simulink, игнорируется. Эта функция используется для обработки генерации кода S-функции процессом построения. То есть тип блока: S-function, но компилятор целевого языка генерирует его как определенную S-функцию, указанную GENERATE_TYPE. Например,

GENERATE_TYPE(block, "Output", "dp_read")

указывает, что S-функция block имеет тип dp_read.

block и любые дополнительные аргументы передаются вызываемой функции. Как и GENERATE встроенная функция, компилятор автоматически определяет область первого аргумента перед GENERATE_TYPE вводится функция, а затем удаляется область при возврате.

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

Примечание

Это не ошибка для GENERATE и GENERATE_TYPE директивы на отсутствие совпадающих функций. Это необходимо для предотвращения необходимости использования пустых спецификаций для всех аспектов создания блочного кода. Используйте GENERATE_FUNCTION_EXISTS или GENERATE_TYPE_FUNCTION_EXISTS директивы для определения того, существует ли на самом деле указанная функция.

Управление выходными файлами

Структура управляющей конструкции выходного файла:

%openfile string optional-equal-string optional-mode
%closefile id
%selectfile id

% openfile

%openfile директива открывает файл или буфер для записи; требуемая строковая переменная становится переменной типа file. Например,

%openfile x               /% Opens and selects x for writing. %/
%openfile out = "out.h"   /% Opens "out.h" for writing. %/

% selectfile

%selectfile директива выбирает файл, указанный переменной, в качестве текущего выходного потока. Вывод в этот файл до тех пор, пока не будет выбран другой файл с помощью %selectfile. Например,

%selectfile x               /% Select file x for output. %/

% closefile

%closefile директива закрывает указанный файл или буфер. Если закрытый объект является текущим выбранным выходным потоком, %closefile призывает %selectfile для повторного выбора ранее выбранного выходного потока.

Есть два возможных случая, которые %closefile должен обрабатывать:

  • Если поток является файлом, связанная переменная удаляется, как если бы %undef.

  • Если поток является буфером, связанная переменная получает текст, который был выведен в поток. Например,

    %assign x = ""                 /% Creates an empty string. %/
    %openfile x
    "hello, world"
    %closefile x		 /% x = "hello, world\n"%/

При необходимости можно добавить в выходной файл или строку с помощью дополнительного режима. a, как в

%openfile "foo.c", "a"             %% Opens foo.c for appending.

Управление входными файлами

Директивами управления входными файлами являются

%include string
%addincludepath string

% включают

%include директива ищет путь к целевому файлу, указанному string и включает содержимое файла в строке в точке, где %include Появится инструкция.

% addincludepath

%addincludepath директива добавляет дополнительный путь включения для поиска при ссылке компилятора целевого языка %include или блокировать целевые файлы. Синтаксис:

%addincludepath string

string может быть абсолютным или явным относительным путем. Например, чтобы задать абсолютный путь, используйте

%addincludepath "C:\\folder1\\folder2"     (PC)
%addincludepath "/folder1/folder2"         (UNIX)

Чтобы указать относительный путь, путь должен явно начинаться с .. Например,

%addincludepath ".\\folder2"                  (PC)
%addincludepath "./folder2"                   (UNIX)

Обратите внимание, что для ПК обратная косая черта должна быть устранена (удвоена).

Если указан явный относительный путь, папка, добавляемая в путь поиска компилятора целевого языка, создается путем объединения местоположения целевого файла, содержащего %addincludepath директива и явный относительный путь.

Компилятор целевого языка выполняет поиск целевых или включенных файлов в папках в следующем порядке:

  1. Текущая папка.

  2. Включить пути, указанные в %addincludepath директивы. Компилятор оценивает несколько %addincludepath директивы снизу вверх.

  3. Включить пути, указанные в командной строке через -I . Компилятор оценивает несколько -I справа налево.

Как правило, %addincludepath директивы должны быть указаны в целевом системном файле. Несколько %addincludepath директивы будут добавлять несколько путей к пути поиска компилятора целевого языка.

Примечание

Компилятор не выполняет поиск по пути MATLAB и не находит файл, доступный только по этому пути. Компилятор выполняет поиск только описанных выше расположений.

Утверждения, ошибки, предупреждения и отладочные сообщения

Связанные директивы утверждения, ошибки, предупреждения и сообщения отладки:

%assert expression
%error tokens
%warning tokens
%trace tokens
%exit tokens

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

Компилятор целевого языка размещает сообщения, созданные %trace на stderr если и только если указан переключатель подробного режима (-v) в компилятор целевого языка. Дополнительные сведения о коммутаторах см. в разделе Аргументы командной строки.

%assert директива вычисляет выражение и создает трассировку стека, если выражение получает логическое значение false.

Примечание

Для %assert Чтобы оценить директивы, необходимо выбрать параметр «Включить утверждение TLC» в разделе процесса TLC панели «Создание кода» > «Отладка». Действие по умолчанию для %assert директивы не подлежат оценке.

%exit директива сообщает об ошибке и останавливает дальнейшую компиляцию.

Встроенные функции и значения

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

Встроенные функции и значения TLC

Имя встроенной функцииРасширение

CAST(expr, expr)

Первое выражение должно быть строкой, соответствующей одному из имен типов в таблице Target Language Value Types, а второе выражение будет приведено к этому типу. Типичным использованием может быть приведение переменной к реальному формату, как в

CAST("Real", variable-name) 

Примером этого является работа со значениями параметров для S-функций. Чтобы использовать их в коде C или C++, необходимо ввести их в real чтобы значение, такое как 1 будет отформатирован как 1.0 См. также %realformat).

EXISTS(var)

Если var идентификатор в данный момент не находится в области, результат: TLC_FALSE. Если идентификатор находится в области действия, результатом является TLC_TRUE. var может быть одним идентификатором или выражением, включающим . и [] операторов.

FEVAL(matlab-command,
   TLC-expressions)

Выполняет анализ в MATLAB. Например,

%assign result = FEVAL("sin",3.14159)

%matlab может использоваться для вызова функции MATLAB, которая не возвращает результат. Например,

%matlab disp(2.718)

Примечание.Если функция MATLAB возвращает более одного значения, TLC получает только первое значение.

FILE_EXISTS(expr)

expr должна быть строкой. Если файл по имени expr не существует на пути, результат: TLC_FALSE. Если файл с таким именем существует в пути, результатом будет TLC_TRUE.

FORMAT(realvalue, format)

Первое выражение является Real значение для форматирования. Второе выражение: EXPONENTIAL или CONCISE. Выводит Real значение в назначенном формате, где EXPONENTIAL использует экспоненциальную нотацию с 16 цифрами точности, и CONCISE выводит число в более читаемом формате при сохранении числовой точности.

FIELDNAMES(record)

Возвращает массив строк, содержащих имена полей записей, связанных с записью. Поскольку он возвращает отсортированный список строк, функция O(n*log(n)).

GETFIELD(record,
   "fieldname"
)

Возвращает содержимое указанного имени поля, если имя поля связано с записью. Функция использует хэш-поиск и, следовательно, выполняется в постоянное время.

GENERATE(record,
   function-name,  ...)

Выполняет вызовы функций, сопоставленные с определенным типом записи (т.е. функции блочной записи). Например, используется для выполнения функций в .tlc файлы для встроенных блоков. Не то, чтобы TLC автоматически «копировал» или добавлял первый аргумент в список искомых областей, как если бы он появился на %with строка директивы.

GENERATE_FILENAME(type)

Для указанного типа записи выполняет .tlc файл существует? Используйте это, чтобы увидеть, если GENERATE_TYPE вызов будет успешным.

GENERATE_FORMATTED_VALUE
   (expr, string, expand)

Возвращает потенциально многострочную строку, которая может использоваться для объявления значений expr на текущем целевом языке. Второй аргумент - это строка, которая используется в качестве имени переменной в описательном комментарии в первой строке возвращаемой строки. Если второй аргумент является пустой строкой, "", то в выходную строку не помещается описательный комментарий. Третий аргумент является логическим, что когда TRUE причины expr должен быть развернут в необработанный текст перед выводом. expand = TRUE использует гораздо больше памяти, чем по умолчанию (FALSE); набор expand = TRUE только если текст параметра необходимо обработать по какой-либо причине перед записью на диск.

Например,

static const unsigned char contents[] =

%assign value = GENERATE_FORMATTED_VALUE(SFcnParamSettings.CONTENTS, "", TLC_FALSE)

;

дает этот код C:

static const unsigned char contents[] = { 0U, 1U, 2U, 3U, 4U };

GENERATE_FUNCTION_EXISTS
   (record, function-name)

Определяет, существует ли данная функция блока. Первое выражение совпадает с первым аргументом для GENERATE, а именно переменная в области блока, содержащая Type. Второе выражение является строкой, которая должна соответствовать имени функции.

GENERATE_TYPE
   (record, function-name,
   type, ...)

Аналогично GENERATE, за исключением того, что type переопределяет Type поле записи. Это используется при выполнении функций, сопоставленных с определенными записями блоков S-функций на основе имени S-функции (т.е. имя становится типом).

GENERATE_TYPE_FUNCTION_EXISTS
   (record, function-name,
   type)

То же, что и GENERATE_FUNCTION_EXISTS за исключением того, что он переопределяет Type встроена в запись.

GET_COMMAND_SWITCH

Возвращает значения параметров командной строки. Поддерживаются только следующие коммутаторы:

v, m, p, O, d, dr, r, I, a
См. также Аргументы командной строки.

IDNUM(expr)

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

IDNUM("ABC123") урожаи ["ABC", 123]

IMAG(expr)

Возвращает мнимую часть комплексного числа.

INT8MAX

127

INT8MIN

-128

INT16MAX

32767

INT16MIN

-32768

INT32MAX

2147483647

INT32MIN

-2147483648

INTMIN

Минимальное целое значение на хост-машине.

INTMAX

Максимальное целое значение на хост-машине.

ISALIAS(record)

Прибыль TLC_TRUE если запись является ссылкой (символьной ссылкой) на другую запись, и TLC_FALSE в противном случае.

ISEQUAL(expr1, expr2)

Где типы данных обоих выражений числовые: возвращает TLC_TRUE если первое выражение содержит то же значение, что и второе выражение; прибыль TLC_FALSE в противном случае.

Где тип данных любого выражения не является числовым (например, строка или запись): возвращает TLC_TRUE если и только если оба выражения имеют одинаковый тип данных и содержат одинаковое значение; прибыль TLC_FALSE в противном случае.

ISEMPTY(expr)

Прибыль TLC_TRUE если выражение содержит пустую строку, вектор или запись, и TLC_FALSE в противном случае.

ISFIELD(record, "fieldname")

Прибыль TLC_TRUE если имя поля связано с записью, и TLC_FALSE в противном случае.

ISINF(expr)

Прибыль TLC_TRUE если значение выражения inf, и TLC_FALSE в противном случае.

ISNAN(expr)

Прибыль TLC_TRUE если значение выражения NAN, и TLC_FALSE в противном случае.

ISFINITE(expr)

Прибыль TLC_TRUE если значение выражения не равно +/- inf или NAN, и TLC_FALSE в противном случае.

ISSLPRMREF(param.value)

Возвращает логическое значение, указывающее, является ли его аргумент ссылкой на параметр Simulink или нет. Эта функция поддерживает совместное использование параметров с Simulink; с его помощью можно экономить память и время при создании кода. Например,

%if !ISSLPRMREF(param.Value) 
  assign param.Value = CAST("Real", param.Value) 
%endif

NULL_FILE

Предопределенный файл без выходных данных, который можно использовать в качестве аргумента для %selectfile для предотвращения вывода.

NUMTLCFILES

Количество целевых файлов, использованных на данный момент при расширении.

OUTPUT_LINES

Возвращает число строк, записанных в текущий выбранный файл или буфер. Не работает для STDOUT или NULL_FILE.

REAL(expr)

Возвращает действительную часть комплексного числа.

REMOVEFIELD(record, "fieldname")

Удаляет указанное поле из содержимого записи. Прибыль TLC_TRUE если поле было удалено; в противном случае возвращает TLC_FALSE.

ROLL_ITERATIONS()

Возвращает число закольцовываний текущих областей рулона или NULL если не внутри %roll конструкция.

SETFIELD(record, "fieldname", value)

Задает содержимое имени поля, связанного с записью. Прибыль TLC_TRUE если поле было добавлено; в противном случае возвращает TLC_FALSE.

SIZE(expr[,expr])

Вычисляет размер первого выражения и генерирует двухэлементный вектор строки. Если указан второй операнд, он используется как целочисленный индекс в этом векторе строки; в противном случае возвращается весь вектор строки. SIZE(x) применяется к скалярным возвращениям [1 1]. SIZE(x) , примененный к области, возвращает количество повторяющихся записей этого типа области. Например, SIZE(Block) прибыль

[1,<number of blocks>]

SPRINTF(format,var,...)

Форматирование данных в переменной var (и в любых дополнительных аргументах переменной) под управлением указанной строки формата и возвращает строковую переменную, содержащую значения. Работает как библиотека C sprintf(), за исключением того, что выходные данные представляют собой возвращаемое значение, а не содержатся в аргументе для sprintf.

STDOUT

Предопределенный файл для stdout выход. Это можно использовать в качестве аргумента для %selectfile для принудительного вывода в stdout.

STRING(expr)

Разворачивает выражение в строку; знаки \, \n, и " ускользают, предваряя их \ (обратная косая черта). Escape-последовательности ANSI преобразуются в строковую форму. Если %<> находится в выражении, оно выходит, так что заключенная строка не подлежит дальнейшей TLC интерпретации.

STRINGOF(expr)

Принимает вектор значений ASCII и возвращает строку, которая создается путем обработки каждого элемента в качестве кода ASCII для одного символа. Используется главным образом для строковых параметров S-функции.

SYSNAME(expr)

Поиск специально отформатированных строк формы <x>/y и возвращает x и y как двухэлементный строковый вектор. Используется для разрешения имен подсистем. Например,

%<sysname("<sub>/Gain")>

прибыль

["sub","Gain"]

В Block записи, имя блока записывается <sys/blockname>, где sys является S# или Root. Полное имя пути можно получить путем вызова LibGetBlockPath(block); это будет включать в себя новые строки и другие проблемные символы, которые вызывают трудности отображения. Чтобы получить полное имя пути, подходящее для однострочных комментариев, но не идентичное имени пути Simulink, используйте LibGetFormattedBlockPath(block).

TLCFILES

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

TLC_FALSE

Логическая константа, равная отрицательному вычисляемому логическому выражению.

TLC_TRUE

Логическая константа, равная положительному вычисленному логическому выражению.

TLC_TIME

Дата и время составления.

TLC_VERSION

Версия и дата компилятора целевого языка.

TYPE(expr)

Оценивает expr и определяет тип результата. Результатом этой функции является строка, соответствующая типу данного выражения. Возможные значения см. в столбце «Строка типа значения» таблицы «Типы значений целевого языка».

UINT8MAX

255U

UINT16MAX

65535U

UINT32MAX

4294967295U

UINTMAX

Максимальное целое число без знака на хост-машине.

WHITE_SPACE(expr)

Принимает строку и возвращает 1, если строка содержит только символы пробела ( , \t, \n, \r); в противном случае возвращает 0.

WILL_ROLL(expr1, expr2)

Первое выражение является вектором крена, а второе выражение является порогом крена. Эта функция возвращает true если вектор содержит диапазон, который будет развернут.

Функция FEVAL

FEVAL встроенная функция вызывает файловые функции MATLAB и MEX-функции. Структура:

%assign result = FEVAL( matlab-function-name, rhs1, rhs2, ... 
	rhs3, ... );

Примечание

  • При использовании допускается только один левый аргумент FEVAL.

  • Если оценка функции MATLAB приводит к ошибке, компилятор TLC не завершает, а продолжает выполнение. Директива FEVAL возвращает TLC пустое значение.

В этой таблице показаны преобразования, выполняемые при использовании FEVAL.

Преобразования MATLAB

Тип TLCТип MATLAB
"Boolean"Boolean (скаляр или матрица)
"Number"Double (скаляр или матрица)
"Real"Double (скаляр или матрица)
"Real32"Double (скаляр или матрица)
"Unsigned"Double (скаляр или матрица)
"String"String
"Vector"Если вектор однороден, он преобразуется в вектор MATLAB. Если вектор является гетерогенным, он преобразуется в массив ячеек MATLAB.
"Gaussian"Complex (скаляр или матрица)
"UnsignedGaussian"Complex (скаляр или матрица)
"Complex"Complex (скаляр или матрица)
"Complex32"Complex (скаляр или матрица)
"Identifier"String
"Subsystem"String
"Range"Расширенный вектор Doubles
"Idrange"Расширенный вектор Doubles
"Matrix"Если матрица однородна, она преобразуется в матрицу MATLAB. Если матрица является гетерогенной, она преобразуется в массив ячеек MATLAB. (Массивы ячеек могут быть вложенными.)
"Scope" или "Record"Структура с элементами
Scope или Record псевдонимСтрока, содержащая полное имя псевдонима
Scope или Record множествоМассив ячеек структур
Другой тип, не указанный вышеПреобразование не поддерживается

Когда значения возвращаются из MATLAB, они преобразуются, как показано в этой таблице. Следует отметить, что преобразование матриц с более чем двумя измерениями не поддерживается, а также преобразование или понижение 64-разрядных целых значений.

Дополнительные преобразования

Тип MATLABТип TLC
String String
Vector of Strings

Вектор строк

Boolean (scalar or matrix)Boolean (скаляр или матрица)
INT8,INT16,INT32
(scalar or matrix)
Number (скаляр или матрица)
INT64Не поддерживается
UINT64Не поддерживается
Complex INT8,INT16,INT32
(scalar or matrix)
Гауссов (скаляр или матрица)
UINT8,UINT16,UINT32
(scalar or matrix)
Unsigned (скаляр или матрица)
Complex UINT8,UINT16,UINT32
(scalar or matrix)
UnsignedGaussian (скаляр или матрица)
Single precisionReal32 (скаляр или матрица)
Complex single precisionComplex32 (скаляр или матрица)
Double precisionReal (скаляр или матрица)
Complex double precisionComplex (скаляр или матрица)
Sparse matrixРасширено до матрицы Doubles
Cell array of structuresМассив записей
Cell array of non-structuresВектор или матрица типов, преобразованных из типов элементов
Cell array of structures and non-structuresПреобразование не поддерживается
StructureRecord
ObjectПреобразование не поддерживается

Другие типы значений в настоящее время не поддерживаются.

В качестве примера этот оператор использует FEVAL встроенная функция вызова MATLAB для получения синуса входного аргумента.

%assign result = FEVAL( "sin", 3.14159 )

Переменные (идентификаторы) могут принимать следующие постоянные значения. Обратите внимание на суффикс значения.

Константная формаТип TLC
1.0"Real"
1.0[F/f]"Real32"
1"Number"
1[U|u]"Unsigned"
1.0i"Complex"
1[Ui|ui]"UnsignedGaussian"
1i"Gaussian"
1.0[Fi|fi]"Complex32"

Примечание

Суффикс управляет типом компилятора целевого языка, полученным из константы.

В этой таблице представлены константы компилятора целевого языка и их эквивалентные значения MATLAB.

Константы TLCЭквивалентное значение MATLAB
rtInf, Inf, inf+inf
rtMinusInf-inf
rtNan, NaN, nannan
rtInfi, Infi, infiinf*i
rtMinusInfi-inf*i
rtNaNi, NaNi, naninan*i

Зарезервированные константы TLC

Для значений двойной точности для бесконечных и нечисловых значений IEEE ® определены следующие значения:

rtInf, inf, rtMinusInf, -inf, rtNaN, nan

Для значений с одной точностью применяются следующие константы:

rtInfF, InfF, rtMinusInfF, rtNaNF, NaNF

Их соответствующие версии, когда сложны:

rtInfi, infi, rtMinusInfi, -infi, rtNaNi (for doubles)
rtInfFi, InfFi, rtMinusInfFi, rtNaNFi, NaNFi (for singles)

Для целых значений определены следующие:

INT8MIN, INT8MAX, INT16MIN, INT16MAX, INT32MIN, INT32MAX, 
UINT8MAX, UINT16MAX, UINT32MAX, INTMAX, INTMIN, UINTMAX

Определение идентификатора

Чтобы определить или изменить идентификаторы (переменные TLC), используйте директиву

%assign [::]expression = constant-expression

Эта директива вводит новые идентификаторы (переменные) или изменяет значения существующих. Левая сторона может быть квалифицированной ссылкой на переменную с помощью . и [] операторы, или это может быть один элемент вектора или матрицы. В случае матрицы присвоение изменяет только один элемент.

%assign директива вставляет новые идентификаторы в локальную, файловую или глобальную область. Идентификаторы, введенные в область действия функции, недоступны в вызываемых функциях и удаляются по возвращении из функции. Идентификаторы, вставленные в глобальную область, являются постоянными. Можно изменить существующие идентификаторы, полностью переназначив их. Выражения константы могут включать допустимые идентификаторы из .rtw файлы. Вы можете использовать %undef чтобы удалить идентификаторы таким же образом, как он используется для удаления макросов.

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

%function ...
...
%assign foo = 3
...
%endfunction

Обратите внимание, что foo создается, даже если глобальный foo уже существует.

Для создания или изменения значений в глобальной области необходимо использовать оператор разрешения области (::) устранить неоднозначность, как в

%function ...
%assign foo = 3
%assign ::foo = foo
...
%endfunction

Оператор разрешения области вынуждает компилятор назначать значение локальной переменной foo, 3, к глобальной переменной foo.

Примечание

Ошибка при изменении значения из файла генератора кода без отнесения его к области. В этом примере ошибка не генерируется:

	%assign CompiledModel.name = "newname"	%% No error 

В этом примере генерируется ошибка:

%with CompiledModel
  %assign name = "newname"	   %% Error 	%endwith

Создание записей

Используйте %createrecord директива для создания новых записей в текущей области. Например, если требуется создать новую запись с именем Rec который содержит два элемента (например, Name "Name" и Type "t"), использовать

%createrecord Rec {  Name "Name"; Type "t" }

Добавление записей

Используйте %addtorecord директива о добавлении новых записей в существующие записи. Например, если имеется запись с именем Rec1 который содержит запись с именем Rec2, и вы хотите добавить дополнительный Rec2 к нему, использовать

%addtorecord Rec1 Rec2 {  Name "Name1"; Type "t1" }

На этом рисунке показан результат добавления записи к существующей.

Если требуется получить доступ к новой записи, можно использовать

%assign myname = Rec1.Rec2[1].Name

В этом же примере, если требуется добавить две записи к существующей записи, используйте

%addtorecord Rec1 Rec2 {  Name "Name1"; Type "t1" }
%addtorecord Rec1 Rec2 {  Name "Name2"; Type "t2" }

Это приводит к

Добавление параметров к существующей записи

Вы можете использовать %assign директива для добавления нового параметра к существующей записи. Например,

%addtorecord Block[Idx] N 500 /% Adds N with value 500 to Block %/
%assign myn = Block[Idx].N    /% Gets the value 500 %/

добавляет новый параметр, N, в конце существующего блока с именем и текущим значением существующей переменной, как показано на этом рисунке. Возвращает значение блока.

Область действия переменной

В этом разделе описывается, как компилятор целевого языка разрешает ссылки на переменные (включая записи).

Область применения в данном документе имеет два связанных значения. Во-первых, область действия является атрибутом переменной, определяющим ее видимость и сохранение. Например, переменная, определенная в теле функции, видна только внутри этой функции и сохраняется только до тех пор, пока эта функция выполняется. Такая переменная имеет функциональную (или локальную) область действия. Каждая переменная TLC имеет одну (и только одну) область, описанную в Scopes.

Термин «область» также относится к набору или пулу переменных, имеющих одинаковую область. В данный момент выполнения программы TLC может существовать несколько областей. Например, во время выполнения функции существует область действия функции (пул переменных, локальных для функции). Во всех случаях также существует глобальный объем (пул глобальных переменных).

Чтобы разрешить ссылки на переменные, TLC поддерживает список поиска текущих областей и выполняет их поиск в хорошо определенной последовательности. Последовательность поиска описана в разделе Как TLC разрешает ссылки на переменные.

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

Объемы

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

Глобальная область.  По умолчанию переменные TLC имеют глобальную область действия. Глобальные переменные являются видимыми для кода в любом месте программы TLC и на них может ссылаться код. Глобальные переменные сохраняются на протяжении всего выполнения программы TLC. Глобальные переменные относятся к глобальному пулу.

Обратите внимание, что CompiledModel запись model.rtw файл имеет глобальную область. Поэтому доступ к этой структуре можно получить из функций или файлов TLC.

Можно использовать оператор разрешения области (::) для явной ссылки или создания глобальных переменных внутри функции. Примеры см. в разделе Оператор разрешения области.

Обратите внимание, что вы можете использовать %undef директива на освобождение памяти, используемой глобальными переменными.

Область файла.  Переменные с областью файла отображаются только в файле, в котором они созданы. Чтобы ограничить область переменных таким образом, используйте %filescope директива в любом месте определяющего файла.

В следующем фрагменте кода переменные fs1 и fs2 имеют область файла. Обратите внимание, что %filescope директива не должна позиционироваться перед инструкциями, создающими переменные.

%assign fs1 = 1
%filescope
%assign fs2 = 3

Переменные, область действия которых ограничена %filescope выйти из области после завершения выполнения файла, содержащего их. Это позволяет освободить память, выделенную таким переменным.

Область действия функции (локальная).  Переменные, определенные в теле функции, имеют область действия функции. То есть они являются видимыми внутри и локальными по отношению к определяющей функции. Например, в следующем фрагменте кода переменная localv является локальным по отношению к функции foo. Переменная x является глобальным.

%assign x = 3

%function foo(arg)
   %assign localv = 1
   %return x + localv
%endfunction

Имя локальной переменной может совпадать с именем глобальной переменной. Чтобы обратиться в функции к аналогичным локальным и глобальным переменным, необходимо использовать оператор разрешения области (::), чтобы устранить неоднозначность ссылок на переменные. Примеры см. в разделе Оператор разрешения области.

Примечание

Сами функции (в отличие от переменных, определенных в функциях) имеют глобальный охват. Существует одно исключение: функции, определенные в области генерации, являются локальными по отношению к этой области. См. раздел Создание области.

% с областью .  %with директива добавляет новую область, называемую %with scope, к текущему списку областей. Эта директива упрощает обращение к переменным области действия блока.

Структура %with директива -

%with expression
%endwith

Например, директива

%with CompiledModel.System[sysidx]
   ...
%endwith

добавляет CompiledModel.System[sysidx] область к списку поиска. Поиск в этой области выполняется раньше всего. Затем можно сослаться на имя системы просто по

Name

вместо

CompiledModel.System[sysidx].Name

Создать область.  Создание области - это особая область, используемая некоторыми встроенными функциями, предназначенными для поддержки генерации кода. Эти функции отправляют вызовы функций, которые сопоставляются с определенным типом записи. Эта возможность поддерживает тип полиморфизма, в котором различные типы записей связаны с функциями (аналогично методам) с одним и тем же именем. Как правило, эта функция используется для отображения Block записи в функции, реализующие функциональные возможности различных типов блоков.

Функции, использующие область генерации, включают GENERATE, GENERATE_TYPE, GENERATE_FUNCTION_EXISTS, и GENERATE_TYPE_FUNCTION_EXISTS. См. разделы СОЗДАНИЕ и GENERATE_TYPE функций. В этом разделе рассматривается создание области с помощью GENERATE встроенная функция в качестве примера.

Синтаксис GENERATE функция -

GENERATE(blk,fn)

Первый аргумент (blkКому GENERATE является допустимым именем записи. Второй аргумент (fn) - имя отправляемой функции. Когда функция отправляется через GENERATE вызов, TLC автоматически добавляет blk в список областей, искомых при разрешении ссылок на переменные. Таким образом, запись (blk) виден для отправленной функции, как если бы неявный %with <blk>... %endwith директива существовала в отправленной функции.

В этом контексте запись с именем blk говорят, что он находится в области генерации.

Ниже перечислены три файла TLC, иллюстрирующие использование области генерации. Файл polymorph.tlc создает две записи, представляющие два гипотетических типа блоков, MyBlock и YourBlock. Каждый тип записи имеет связанную функцию с именем aFunc. Специфичные для блоков реализации aFunc содержатся в файлах MyBlock.tlc и YourBlock.tlc.

Используя GENERATE вызовы, polymorph.tlc отправляет функции для каждого типа блока. Обратите внимание, что aFunc реализации могут относиться к полям MyBlock и YourBlock, поскольку эти записи находятся в области генерации.

  • Следующий список показывает polymorph.tlc:

    %% polymorph.tlc
    
    %language "C"
    
    %%create records used as scopes within dispatched functions
    
    %createrecord MyRecord { Type "MyBlock"; data 123 }
    %createrecord YourRecord { Type "YourBlock"; theStuff 666 }
    
    %% dispatch the functions thru the GENERATE call.
    
    %% dispatch to MyBlock implementation
    %<GENERATE(MyRecord, "aFunc")> 
    
    %% dispatch to YourBlock implementation
    %<GENERATE(YourRecord, "aFunc")>
    
    %% end of polymorph.tlc
  • Следующий список показывает MyBlock.tlc:

    %%MyBlock.tlc
    
    %implements "MyBlock" "C"
    
    %% aFunc is invoked thru a GENERATE call in polymorph.tlc.
    %% MyRecord is in generate scope in this function.
    %% Therefore, fields of MyRecord can be referenced without
    %% qualification
    
    %function aFunc(r) Output
    %selectfile STDOUT
    The value of MyRecord.data is: %<data>
    %closefile STDOUT
    %endfunction
    
    %%end of MyBlock.tlc
  • Следующий список показывает YourBlock.tlc:

    %%YourBlock.tlc
    
    %implements "YourBlock" "C"
    
    %% aFunc is invoked thru a GENERATE call in polymorph.tlc.
    %% YourRecord is in generate scope in this function.
    %% Therefore, fields of YourRecord can be referenced without
    %% qualification
    
    %function aFunc(r) Output
    %selectfile STDOUT
    The value of YourRecord.theStuff is: %<theStuff>
    %closefile STDOUT
    %endfunction
    
    %%end of YourBlock.tlc

Вызов и вывод polymorph.tlc, как показано в окне команд MATLAB, ниже:

tlc -v polymorph.tlc

The value of MyRecord.data is: 123
The value of YourRecord.theStuff is: 666

Примечание

Функции, определенные в области генерации, являются локальными по отношению к этой области. Это исключение из общего правила, согласно которому функции имеют глобальную область действия. В вышеприведенном примере, например, ни один из aFunc реализации имеют глобальный охват.

Оператор разрешения объема

Оператор разрешения области (::) используется для указания на необходимость поиска глобальной области при поиске TLC-функцией ссылки на переменную. Оператор разрешения области действия часто используется для изменения значения глобальных переменных (или даже для создания глобальных переменных) из функций.

С помощью оператора разрешения области можно разрешить неоднозначности, возникающие, когда функция ссылается на идентично именованные локальные и глобальные переменные. В следующем примере глобальная переменная foo создается. Кроме того, функция myfunc создает и инициализирует локальную переменную с именем foo. Функция myfunc явно ссылается на глобальную переменную foo с помощью оператора разрешения области.

%assign foo = 3   %% this variable has global scope
.
.
.
%function myfunc(arg)
   %assign foo = 3   %% this variable has local scope
   %assign ::foo = arg   %% this changes the global variable foo
%endfunction

Оператор разрешения области также можно использовать в функции для создания глобальных переменных. Следующая функция создает и инициализирует глобальную переменную:

%function sideffect(arg)
   %assign ::theglobal = arg   %% this creates a global variable
%endfunction

Как TLC разрешает ссылки на переменные

В этом разделе описывается, как компилятор целевого языка выполняет поиск существующих областей для разрешения ссылок на переменные.

Глобальная область.  В простейшем случае компилятор целевого языка разрешает ссылку на переменную путем поиска в глобальном пуле (включая CompiledModel структура).

% с областью . Список поиска и последовательность поиска можно изменить с помощью %with директива. Например, при добавлении следующей конструкции:

%with CompiledModel.System[sysidx]
   ...
%endwith

System[sysidx] область добавляется в список поиска. Сначала выполняется поиск в этой области, как показано на этом рисунке.

Этот метод упрощает доступ к встроенным определениям. Использование %with (как и в предыдущем примере), можно ссылаться на имя системы просто по

Name

вместо

CompiledModel.System[sysidx].Name

Область действия функции.  Функция имеет собственный объем. Эта область добавляется к ранее описанному списку поиска, как показано на этой схеме.

Например, в следующем фрагменте кода:

% with CompiledModel.System[sysidx]
...
   %assign a=foo(x,y)
...
%endwith
...
%function foo(a,b)
...
   assign myvar=Name
...
%endfunction
...
%<foo(1,2)>

Если Name не определен в foo, назначение использует значение Name из предыдущего объема, CompiledModel.System[SysIdx].Name.

Во вложенной функции выполняется поиск только самой внутренней области действия функции вместе с вложенной %with и глобальные области, как показано на следующей диаграмме:

Область файла.  Поиск в областях файлов выполняется перед глобальной областью, как показано на следующей диаграмме.

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

Функции целевого языка

Конструкция целевой языковой функции

%function identifier ( optional-arguments ) [Output | void]
%return
%endfunction

Функции на целевом языке являются рекурсивными и имеют собственное пространство локальных переменных. Функции целевого языка не производят вывод, если они не являются функциями вывода или явно не используют %openfile, %selectfile, и %closefile директивы.

Функция дополнительно возвращает значение с помощью %return директива. Возвращаемое значение может быть типом, определенным в таблице в поле «Типы значений целевого языка».

В этом примере функция, name, возврат x если x и y равны или возвращаются z если x и y не равны:

%function name(x,y,z) void

%if x == y
   %return x
%else
   %return z
%endif

%endfunction

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

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

Назначения переменным в функции создают новые локальные переменные и не могут изменять значение глобальных переменных, если не используется оператор разрешения области (::).

По умолчанию функция возвращает значение и не выдает выходные данные. Можно переопределить это поведение, указав Output и void модификаторы в строке объявления функции, как в

%function foo() Output
...
%endfunction

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

%function foo() void
...
%endfunction

Область действия переменных в рамках функций

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

Это поведение по умолчанию можно переопределить с помощью %assign с оператором разрешения области (::).

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

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

Вернуть

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

%function foo(s)
    %with s
        %return(name)
    %endwith
%endfunction

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

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