Блоки в модели могут потребовать, чтобы общая функциональность реализовала их алгоритмы. Рассмотрите модульное исполнение этой функциональности в автономную поддержку или функции помощника. Этот подход может быть более эффективным, чем встраивание кода для функциональности для каждого экземпляра блока. Чтобы решить о пользовании библиотекой или разделяемой утилитой, рассмотрите:
Упаковка функционирует, который может иметь несколько вызывающих сторон в библиотеку, когда функции заданы статически. Таким образом, прежде чем вы будете использовать генератор кода, чтобы произвести код для вашей модели, функциональный исходный код существует в файле.
Упаковка функционирует, который может иметь несколько вызывающих сторон как совместно использованные утилиты (произведенный во время генерации кода), когда функции не могут быть заданы статически. Например, несколько моделей - и специфичные для блока свойства задают, какие функции используются и их поведение. Кроме того, эти свойства определяют определения типа (например, typedef
) в разделяемых служебных заголовочных файлах. Количество возможных комбинаций свойств, которые определяют уникальное поведение, делает невозможным задать статически возможные файлы функции перед генерацией кода.
Сконфигурируйте правило именования значения по умолчанию для сгенерированных разделяемых служебных функций при помощи одного из этих методов.
Настройка | Действие |
---|---|
Новая модель или существующая модель, для которой вы сопоставили пользовательские настройки по умолчанию при помощи Code Mappings Editor (Embedded Coder) или значения по умолчанию кода, сопоставляющего интерфейс программирования | В Embedded Coder Dictionary (Embedded Coder) задайте функциональный шаблон настройки, который задает пользовательское правило именования функции. Затем в Code Mappings Editor (Embedded Coder) или при помощи значения по умолчанию кода, сопоставляющего интерфейс программирования, сопоставьте категорию функции Shared utility с тем шаблоном. Для получения дополнительной информации смотрите, Конфигурируют генерацию кода C По умолчанию для Категорий Элементов данных и Функций (Embedded Coder). |
Модель создала в релизе ранее, чем R2018a, и это не было сконфигурировано с Code Mappings Editor (Embedded Coder) или значением по умолчанию, сопоставляющим интерфейс программирования | Установите параметр конфигурации модели Разделяемый сервисный формат идентификатора (Embedded Coder) (CustomSymbolsStrUtil ) к пользовательскому правилу именования функции. Для получения дополнительной информации смотрите Управление форматом Идентификатора (Embedded Coder). |
Если вы используете Code Mappings Editor (Embedded Coder) или значение по умолчанию, сопоставляющее интерфейс программирования, чтобы сконфигурировать модель, устанавливая параметр конфигурации модели, 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, чтобы добавить новый функциональный шаблон настройки.
Для функционального шаблона настройки задайте эти настройки:
Имя: exSharedUtility
FunctionName : mymodel_$N$C
Можно настроить этот формат при помощи строки. Необходимо включать маркерный $C
.
Откройте редактор Отображений Кода. На вкладке C Code выберите Code Interface> Default Code Mappings.
На вкладке Function Defaults, для категории Shared Utility, конфигурируют Function Customization Template как exSharedUtility
.
Сгенерируйте код и отчет генерации кода.
В левой панели навигации отчета рассмотрите список сгенерированных файлов для разделяемых утилит под Shared files.
Управляйте размещением разделяемого служебного кода с параметром конфигурации модели Shared code placement. Значением опции по умолчанию является 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 (Embedded Coder) и сопоставляете с категориями данных модели в Code Mappings Editor (Embedded Coder).
Вкладка Code Generation в диалоговом окне Signal Properties.
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, click 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 | Имя:
|