Блоки в модели могут потребовать общей функциональности для реализации своих алгоритмов. Рассмотрите модуляризацию этой функциональности в автономную поддержку или вспомогательные функции. Этот подход может быть более эффективным, чем встраивание кода для функциональности для каждого образца блока. Чтобы решить, использовать библиотеку или общую утилиту, рассмотрите:
Функции упаковки, которые могут иметь несколько вызывающих абонентов в библиотеку, когда функции заданы статически. То есть, прежде чем вы используете генератор кода для производства кода для вашей модели, исходный код функции существует в файле.
Функции упаковки, которые могут иметь несколько вызывающих в качестве общих утилит (создаваемых во время генерации кода), когда функции не могут быть определены статически. Для примера несколько специфичных для модели и блока свойств определяют, какие функции используются и их поведение. Кроме того, эти свойства определяют определения типов (для примера, typedef
) в общих файлах заголовка утилиты. Количество возможных комбинаций свойств, которые определяют уникальное поведение, делает непрактичным статическое определение возможных файлов функции перед генерацией кода.
Сконфигурируйте правило именования по умолчанию для сгенерированных общих служебных функций с помощью одного из следующих методов.
Строение | Действие |
---|---|
Новая модель или существующая модель, для которой вы сопоставили настройки индивидуальной настройки по умолчанию с помощью интерфейса программирования Code Mappings editor или отображений кода | В Embedded Coder Dictionary задайте шаблон индивидуальной настройки функции, который задает пользовательское правило именования функции. Затем в редакторе Отображения или при помощи интерфейса программирования отображений кода сопоставьте категорию функции Shared utility с этим шаблоном. Для получения дополнительной информации смотрите Настройка генерации кода C по умолчанию для категорий элементов данных и функций. |
Модель, созданная в релизе ранее R2018a и не сконфигурированная с интерфейсом программирования Code Mappings editor или отображений кода | Установите параметр конфигурации модели Формат идентификатора общих утилит (CustomSymbolsStrUtil ) в пользовательское правило именования функций. Дополнительные сведения см. в разделе Управление форматом идентификатора. |
Если вы используете интерфейс программирования Code Mappings editor или отображений кода для конфигурирования модели, установка параметра конфигурации модели Shared utilities identifier format не влияет на генерацию кода. Этот параметр неприменим для моделей, настроенных с этими спецификациями.
Системный целевой файл | Язык программирования |
---|---|
ert.tlc | C++ |
autosar.tlc | C |
autosar_adaptive.tlc | C++ |
Правило именования для общих служебных функций должно включать условную контрольную сумму лексемы $C
. Чтобы настроить длину контрольной суммы, которую генерирует генератор кода, используйте Shared checksum length параметра (SharedChecksumLength
) . Увеличение длины контрольной суммы уменьшает вероятность столкновений.
В этом примере показана индивидуальная настройка имен общих служебных функций для генерации кода C.
Откройте пример модели rtwdemo_configdefaults
и приложение Embedded Coder.
Установите Shared code placement параметра конфигурации модели в Shared location
.
Откройте словарь Embedded Coder. На вкладке C Code выберите Code Interface > Embedded Coder Dictionary.
На вкладке Function Customization Templates щелкните Add, чтобы добавить новый шаблон индивидуальной настройки функции.
Для шаблона индивидуальной настройки функции задайте следующие строения:
Name: exSharedUtility
Function Name: mymodel_$N$C
Вы можете настроить этот формат с помощью строки. Необходимо включить лексему $C
.
Откройте редактор Отображения. На вкладке C Code выберите Code Interface > Default Code Mappings.
На вкладке Function Defaults для категории Shared Utility сконфигурируйте Function Customization Template следующим образом exSharedUtility
.
Сгенерируйте код и отчет генерации кода.
На левой панели навигации отчета просмотрите список сгенерированных файлов для общих утилит в разделе Shared files.
Управляйте размещением общего кода утилиты с параметром конфигурации <reservedrangesplaceholder1> модели. Значение опции по умолчанию Auto
. Для этой настройки генератор кода помещает необходимый код для фиксированной точки и других утилит в
файл, model
.c
файл или отдельный файл в папке сборки (для примера, model
.cppvdp_grt_rtw
) если модель не содержит существующего общего кода утилиты или одного из следующих блоков:
Model блоки
Simulink Function блоки
Function Caller блоки
Вызовы функций Simulink из блоков Stateflow или MATLAB Function
Графические функции Stateflow, когда вы выбираете Export Chart Level Functions параметра
Если модель содержит один или несколько предыдущих блоков, генератор кода создает и использует общую папку утилит в slprj
. Соглашение об именовании для общих папок утилиты slprj/
target
/_sharedutils
. target
является sim
для симуляций с Model блоками или именем системного целевого файла для генерации кода.
slprj/sim/_sharedutils % folder used with simulation slprj/grt/_sharedutils % folder used with grt.tlc STF slprj/ert/_sharedutils % folder used with ert.tlc STF slprj/mytarget/_sharedutils % folder used with mytarget.tlc STF
Чтобы заставить сборку модели использовать slprj
папка для генерации общей утилиты, даже когда текущая модель не содержит существующего общего служебного кода или одного из предыдущих блоков, установите Shared code placement параметра Shared location
. Генератор кода помещает утилиты под slprj
папка, а не в обычной папке сборки. Эта настройка полезна, когда вы вручную комбинируете код из нескольких моделей, потому что это предотвращает столкновения символов между моделями.
Сгенерированный rtwtypes.h
заголовочный файл содержит основные определения типов, #define
операторы и перечисления. Для получения дополнительной информации см. rtwtypes.h.
Управление размещением файла rtwtypes.h путем выбора, использует ли процесс сборки папку общих утилит. Если в сборке модели используется общая папка утилит, процесс сборки помещает rtwtypes.h
в slprj/
. В противном случае программное обеспечение помещает target
/ _sharedutilsrtwtypes.h
в
.model
_ target
_rtw
Добавление модели к иерархии модели или изменение существующей модели в иерархии может привести к обновлению общей rtwtypes.h
файл во время генерации кода. Если обновления происходят, перекомпилируйте и, в зависимости от процесса разработки, повторно проверьте ранее сгенерированный код. Чтобы минимизировать обновления rtwtypes.h
выполните следующие изменения в диалоговом окне Параметры конфигурации (Configuration Parameters):
Выберите параметр конфигурации модели Support: complex numbers даже если модель в данный момент не использует типы комплексных данных. Выбор этого параметра защищает от будущего требования добавить поддержку для типов комплексных данных при интеграции кода.
Очистить Support non-inlined S-functions параметра. Если вы используете неинлинфицированные S-функции в модели, эта опция генерирует ошибку.
Очистить Classic call interface параметра. Эта установка параметра отключает использование целевого файла системы GRT.
Экспортированные файлы заголовков появляются в общей папке утилиты, когда:
Вы управляете размещением объявлений файлов для сигналов, параметров и состояний путем определения и применения классов памяти.
Генератор кода помещает код утилиты в общее место.
Для примера можно задать заголовочный файл для данных при помощи:
Класс памяти, который вы определяете в Embedded Coder Dictionary и сопоставляете с категориями данных моделей в Code Mappings editor.
Вкладка Code Generation в диалоговом окне Свойства.
The HeaderFile
свойство объекта данных. Объекты данных являются объектами классов Simulink.Signal
и Simulink.Parameter
.
Если необходимо, чтобы объявление появилось в файле
Лучшей практике оставить имя файла заголовка неопределенным. По умолчанию генератор кода помещает объявления данных в model
.h
.model
.h
Если вы задаете
как имя файла заголовка, и если генератор кода помещает код утилиты в общее место, вы не можете сгенерировать код из модели. Генератор кода не может создать файл model
.h
в папке сборки модели и в общей папке утилиты.model
.h
Можно задать, что сборка модели генерирует исходные файлы C в общей папке утилит. См. «Генерация общей утилиты». Эти файлы включают исходные файлы C, которые содержат определения функций и заголовочные файлы, которые содержат определения макросов. Для этого обсуждения термин «функции» означает функции и макросы.
Блоки в одной модели и блоки в разных моделях могут использовать общую функцию, когда вы используете модель-ссылку или когда вы создаете несколько автономных моделей из одной и той же папки сборки. Генератор кода производит код для заданной функции только один раз для блока, который впервые запускает генерацию кода. Когда продукт определяет требование сгенерировать код функции для последующих блоков, он выполняет проверку существования файла. Если файл существует, сборка модели не регенерирует функцию. Механизм кода общей утилиты требует, чтобы заданная функция и имя файла представляли одно и то же функциональное поведение независимо от того, какой блок или модель генерирует функцию. Чтобы удовлетворить это требование:
Свойства модели, которые определяют поведение функции, вносят вклад в общую контрольную сумму утилиты или определяют функцию и имя файла.
Свойства блока, которые определяют поведение функции, также определяют функцию и имя файла.
Во время компиляции правила make-файла для папки общих утилит выбирают компиляцию только новых файлов C и постепенно архивируют файл объекта в библиотеку общих утилит rtwshared.lib
, или rtwshared.a
. Также происходит инкрементальная компиляция.
Когда вы устанавливаете параметр конфигурации модели Shared code placement равным Shared location
или когда модель содержит блоки Model, генератор кода помещает общий код в папку общих утилит. Процесс сборки генерирует общую контрольную сумму утилит строения генерации кода для общего кода.
Во время последующей генерации кода, если файл контрольной суммы slprj/
существует относительно текущей папки, генератор кода читает этот файл. Генератор кода проверяет, что текущая модель, которую вы создаете, имеет свойства строения, которые соответствуют контрольной сумме свойств из общей модели утилиты. Если имеют место несоответствия между свойствами, заданными в target
/ _sharedutils/checksummap.matchecksummap.mat
и текущих свойств модели, вы видите ошибку. Используйте сообщение об ошибке для управления контрольной суммой (для примера, диагностики и решения проблем с строением с текущей моделью).
Полезно просмотреть значения свойств, которые вносят свой вклад в контрольную сумму. Этот пример использует rtwdemo_lct_start_term.slx
модель. Чтобы загрузить checksum.mat
файл в MATLAB® и просмотрите targetInfoStruct
который определяет свойства, связанные с контрольной суммой:
Откройте rtwdemo_lct_start_term.slx
модель. В Командном окне введите:
rtwdemo_lct_start_term
Создайте и перейдите в новую рабочую папку.
mkdir C:\Temp\demo cd C:\Temp\demo
Сохраните копию модели в папке.
Создайте модель, которая настроена на производство общих утилит.
На вкладке Apps, под Code Generation, нажмите Simulink Coder.
На вкладке C Code, в разделе Generate Code, нажмите кнопку Build.
Перейдите к _sharedutils
папка, созданная процессом сборки.
cd C:\Temp\demo\slprj\grt\_sharedutils
Загрузите checksummap.mat
файл в MATLAB.
load checksummap
Отображение содержимого hashTbl.targetInfoStruct
и исследуйте значения свойств, связанных с контрольной суммой.
hashTbl.targetInfoStruct
В данном примере в Командном окне отображаются hashTbl.targetInfoStruct
для общих утилит, сгенерированных из модели:
ans = struct with fields: ShiftRightIntArith: 'on' ProdShiftRightIntArith: 'on' Endianess: 'LittleEndian' ProdEndianess: 'LittleEndian' wordlengths: '8,16,32,32,64,32,64,64,64,64' Prodwordlengths: '8,16,32,32,64,32,64,64,64,64' TargetWordSize: '64' ProdWordSize: '64' TargetHWDeviceType: 'Custom Processor->MATLAB Host Computer' ProdHWDeviceType: 'Intel->x86-64 (Windows64)' TargetIntDivRoundTo: 'Zero' ProdIntDivRoundTo: 'Zero' UseDivisionForNetSlopeComputation: 'off' PurelyIntegerCode: 'off' PortableWordSizes: 'off' SupportNonInlinedSFcns: '' RTWReplacementTypes: '' MaxIdInt8: 'MAX_int8_T' MinIdInt8: 'MIN_int8_T' MaxIdUint8: 'MAX_uint8_T' MaxIdInt16: 'MAX_int16_T' MinIdInt16: 'MIN_int16_T' MaxIdUint16: 'MAX_uint16_T' MaxIdInt32: 'MAX_int32_T' MinIdInt32: 'MIN_int32_T' MaxIdUint32: 'MAX_uint32_T' MaxIdInt64: 'MAX_int64_T' MinIdInt64: 'MIN_int64_T' MaxIdUint64: 'MAX_uint64_T' BooleanTrueId: 'true' BooleanFalseId: 'false' TypeLimitIdReplacementHeaderFile: '' SharedCodeRepository: '' TargetLang: 'C' PreserveExternInFcnDecls: 'on' EnableSignedRightShifts: 'on' EnableSignedLeftShifts: 'on' TflName: 'None' TflCheckSum: [453906543 3.9179e+09 3.7907e+09 269412680] UtilMemSecPreStatement: '' UtilMemSecPostStatement: '' UtilMemSecComment: '' CodeCoverageChecksum: [3.6498e+09 78774415 2.5508e+09 2.1183e+09] TargetLargestAtomicInteger: 'Char' TargetLargestAtomicFloat: 'None' ProdLargestAtomicInteger: 'Char' ProdLargestAtomicFloat: 'Float' LongLongMode: 'on' ProdLongLongMode: 'off' toolchainOrTMF: 'Microsoft Visual C++ 2017 v15.0 | nmake (64-bit Windows)'
Исследуйте targetInfoStruct
хэш- таблица из общей модели утилиты. Некоторые пары "ключ-значение" относятся непосредственно к свойству модели. Другие пары относятся к группам свойств.
В следующей таблице описаны пары "ключ-значение".
Имена ключей | Свойства модели |
---|---|
ShiftRightIntArith | TargetShiftRightIntArith |
ProdShiftRightIntArith | ProdShiftRightIntArith |
Endianess | TargetEndianess |
ProdEndianess | ProdEndianess |
wordlengths | TargetBitPerChar , TargetBitPerShort , TargetBitPerInt , TargetBitPerLong , TargetBitPerLongLong , TargetBitPerFloat , TargetBitPerDouble , TargetBitPerPointer |
Prodwordlengths | ProdBitPerChar , ProdBitPerShort , ProdBitPerInt , ProdBitPerLong , ProdBitPerLongLong , ProdBitPerFloat , ProdBitPerDouble , ProdBitPerPointer |
TargetWordSize | TargetWordSize |
ProdWordSize | ProdWordSize |
TargetHWDeviceType | TargetHWDeviceType |
ProdHWDeviceType | ProdHWDeviceType |
TargetIntDivRoundTo | TargetIntDivRoundTo |
ProdIntDivRoundTo | ProdIntDivRoundTo |
UseDivisionForNetSlopeComputation | UseDivisionForNetSlopeComputation |
PurelyIntegerCode | PurelyIntegerCode |
PortableWordSizes | PortableWordSizes |
SupportNonInlinedSFcns | SupportNonInlinedSFcns |
RTWReplacementTypes | EnableUserReplacementTypes, ReplacementTypes |
MaxIdInt8 | MaxIdInt8 |
MinIdInt8 | MinIdInt8 |
MaxIdUint8 | MaxIdUint8 |
MaxIdInt16 | MaxIdInt16 |
MinIdInt16 | MinIdInt16 |
MaxIdUint16 | MaxIdUint16 |
MaxIdInt32 | MaxIdInt32 |
MinIdInt32 | MinIdInt32 |
MaxIdUint32 | MaxIdUint32 |
MaxIdInt64 | MaxIdInt64 |
MinIdInt64 | MinIdInt64 |
MaxIdUint64 | MaxIdUint64 |
BooleanTrueId | BooleanTrueId |
BooleanFalseId | BooleanFalseId |
TypeLimitIdReplacementHeaderFile | TypeLimitIdReplacementHeaderFile |
SharedCodeRepository | Зарезервировано (только для внутреннего использования) |
TargetLang | TargetLang |
PreserveExternInFcnDecls | PreserveExternInFcnDecls |
EnableSignedRightShifts | EnableSignedRightShifts |
EnableSignedLeftShifts | EnableSignedLeftShifts |
TflName | CodeReplacementLibrary |
TflCheckSum | Зарезервировано (только для внутреннего использования) |
UtilMemSecPreStatement | MemSecFuncSharedUtil , MemSecPackage |
UtilMemSecPostStatement | MemSecFuncSharedUtil , MemSecPackage |
UtilMemSecComment | MemSecFuncSharedUtil , MemSecPackage |
CodeCoverageChecksum | Зарезервировано (только для внутреннего использования) |
TargetLargestAtomicInteger | TargetLargestAtomicInteger |
TargetLargestAtomicFloat | TargetLargestAtomicFloat |
ProdLargestAtomicInteger | ProdLargestAtomicInteger |
ProdLargestAtomicFloat | ProdLargestAtomicFloat |
LongLongMode | TargetLongLongMode |
ProdLongLongMode | ProdLongLongMode |
CollapseNonTrivialExpressions | Зарезервировано (только для внутреннего использования) |
toolchainOrTMF | Имя:
|