Концепции генерации кода

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

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

Потоки вывода

Типичный пример “Hello World” довольно прост на выходном языке. Введите следующее в файле с именем hello.tlc:

%selectfile STDOUT 
Hello, World

Чтобы запустить эту программу TLC, ввести

tlc hello.tlc

в подсказке MATLAB®.

Этот простой скрипт иллюстрирует некоторые важные концепции, лежащие в основе цели (и следовательно проект) TLC. Поскольку основная цель TLC должна сгенерировать код, это выводится (или поток) ориентированный. Это дает возможность обрабатывать буферы текста и выводить их легко. В вышеупомянутом скрипте, %selectfile директива говорит TLC отправлять любой после текста, который это генерирует или не распознает устройству стандартного вывода. Синтаксис, который распознает TLC, начинается с % символ. Поскольку Hello, World не распознан, это отправляется непосредственно в выход. Вы могли легко изменить выходное место назначения, чтобы быть файлом. Не открывайте STDOUT поток, но выбор, чтобы записать в Командное окно.

%openfile foo = "foo.txt"  
%openfile bar = "bar.txt" 
%selectfile foo 
This line is in foo. 
%selectfile STDOUT 
Line has been output to foo. 
%selectfile bar 
This line is in bar. 
%selectfile NULL_FILE 
This line will not show up anywhere. 
%selectfile STDOUT 
About to close bar. 
%closefile bar 
%closefile foo

Можно переключиться между буферами на сообщения состояния дисплея. Семантика этих трех директив %openfileВыбор File, и %closefile даны в Директивах компилятора Выходного языка.

VariableTypes

Отсутствие явных описаний типа для переменных является другой функцией TLC. См. Компилятор Выходного языка (Simulink Coder) для получения дополнительной информации о неявных типах данных переменных.

Записи

Одно из построений, наиболее относящихся к генерации кода от model.rtw файл является записью. record похож на структуру в C или запись в Паскале. Синтаксис объявления записи

%createrecord recVar { ... 	
   field1		value1  ...
   field2		value2 ...
 	 ... 	
  fieldN		valueN ... 
}

где recVar имя объявляемой записи, fieldi строка и valuei соответствующее значение TLC.

Записи могли вложить записи или подзаписи, в них. model.rtw файлом является по существу один большой именованный CompiledModel записи, содержа уровни подзаписей.

В отличие от MATLAB, TLC требует что вы явным образом определения функции load, не расположенные в том же конечном файле. В MATLAB, линия A = myfunc(B) причины MATLAB, чтобы автоматически искать и загрузить файл MATLAB или файл MEX под названием myfunc. TLC требует, чтобы вы в частности включали файл, который задает функцию с помощью %addincludepath директива.

TLC обеспечивает %with директива, которая упрощает записи использования. См. Директивы компилятора Выходного языка.

Примечание

Формат и структура model.rtw файл подвержен изменениям от одного релиза генератора кода другому.

Чтение записи в из файла изменяемо, как другие записи, которые вы объявляете в программе. CompiledModel записи изменяется много раз во время генерации кода. CompiledModel глобальная запись в model.rtw файл. Это содержит переменные, используемые в генерации кода, такие как NumNonvirtSubsystems, NumBlocks. Это также добавлено во время генерации кода со многими новыми переменными, опциями и подзаписями.

Функционирует, такие как LibGetFormattedBlockPath обеспечиваются в библиотеках TLC, расположенных в matlabroot/rtw/c/tlc/lib / *.tlc открытый. Для полного списка доступных функций обратитесь к Справочному руководству по библиотеке Функции TLC на Компиляторе Выходного языка (Simulink Coder).

Присвойте значения полям записей

Чтобы присвоить значение полю записи, необходимо использовать qualified variable expression. Квалифицированное переменное выражение ссылается на переменную в одной из следующих форм:

  • Идентификатор

  • Квалифицированная переменная сопровождается “.” сопровождаемый идентификатором, такой как

    var[2].b
  • Квалифицированная переменная, сопровождаемая выражением в скобках такой как

    var[expr]

Псевдонимы записи

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

Следующий фрагмент кода иллюстрирует использование псевдонимов:

%createrecord foo { field 1 }
%createrecord a { } 
%createrecord b { } 
%createrecord c { }  

%addtorecord a foo foo 
%addtorecord b foo foo 
%addtorecord c foo { field 1 }  

%% notice we are not changing field through a or b. 
%assign foo.field  = 2  

ISALIAS(a.foo) = %<ISALIAS(a.foo)>
ISALIAS(b.foo) = %<ISALIAS(b.foo)>
ISALIAS(c.foo) = %<ISALIAS(c.foo)>

a.foo.field = %<a.foo.field>
b.foo.field = %<b.foo.field> 
c.foo.field = %<c.foo.field> 
%% note that c.foo.field is unchanged

Сохранение этого скрипта как record_alias.tlc и вызов его с

tlc -v record_alias.tlc

производит выход

ISALIAS(a.foo) = 1
ISALIAS(b.foo) = 1
ISALIAS(c.foo) = 0

a.foo.field = 2
b.foo.field = 2 
c.foo.field = 1 

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

%function func(value) Output   
  %createrecord foo { field value }
  %createrecord a { foo foo }
ISALIAS(a.foo) = %<ISALIAS(a.foo)>
   %return a.foo
 %endfunction

 %assign x = func(2)
 ISALIAS(x) = %<ISALIAS(x)>
 x = %<x>
 x.field = %<x.field>

Сохранение этого скрипта как alias_func.tlc и вызов его с

tlc -v alias_func.tlc

производит выход

ISALIAS(a.foo) = 1 
ISALIAS(x) = 1
x = { field 2 } 
x.field = 2

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

Похожие темы