Блоки в модели могут потребовать, чтобы общая функциональность реализовала их алгоритмы. Рассмотрите модульное исполнение этой функциональности в автономную поддержку или функции помощника. Этот подход может быть более эффективным, чем встраивание кода для функциональности для каждого экземпляра блока. Чтобы решить о пользовании библиотекой или разделяемой утилитой, рассмотрите:
Упаковка функционирует, который может иметь несколько вызывающих сторон в библиотеку, когда функции заданы статически. Таким образом, прежде чем вы будете использовать генератор кода, чтобы произвести код для вашей модели, функциональный исходный код существует в файле.
Упаковка функционирует, который может иметь несколько вызывающих сторон как совместно использованные утилиты (произведенный во время генерации кода), когда функции не могут быть заданы статически. Например, несколько моделей - и специфичные для блока свойства задают, какие функции используются и их поведение. Кроме того, эти свойства определяют определения типа (например, typedef
) в разделяемых служебных заголовочных файлах. Количество возможных комбинаций свойств, которые определяют уникальное поведение, делает невозможным задать статически возможные файлы функции перед генерацией кода.
Сконфигурируйте правило именования значения по умолчанию для сгенерированных разделяемых служебных функций при помощи одного из этих методов.
Настройка | Действие |
---|---|
Новая модель или существующая модель, для которой вы сопоставили пользовательские настройки по умолчанию при помощи Code Mapping Editor или значения по умолчанию кода, сопоставляющего интерфейс программирования | В Embedded Coder Dictionary задайте функциональный шаблон настройки, который задает пользовательское правило именования функции. Затем в Code Mapping Editor или при помощи значения по умолчанию кода, сопоставляющего интерфейс программирования, сопоставьте категорию функции Shared utility с тем шаблоном. Для получения дополнительной информации смотрите, Конфигурируют генерацию кода C По умолчанию для Категорий Данных модели и Функций. |
Модель создала в релизе ранее, чем R2018a, и это не было сконфигурировано с Code Mapping Editor или значением по умолчанию, сопоставляющим интерфейс программирования | Установите образцовый параметр конфигурации Shared utilities identifier format (CustomSymbolsStrUtil ) к пользовательскому правилу именования функции. Для получения дополнительной информации смотрите Управление форматом Идентификатора. |
Если вы используете Code Mapping Editor, или значение по умолчанию, сопоставляющее интерфейс программирования, чтобы сконфигурировать модель, устанавливая параметр Shared utilities identifier format, не влияет на генерацию кода.
Правило именования для разделяемых служебных функций должно включать условную лексему контрольной суммы $C
. Чтобы настроить длину контрольной суммы, которую производит генератор кода, используйте Shared checksum length (SharedChecksumLength
) параметр. Увеличение длины контрольной суммы уменьшает вероятность столкновений.
Этот пример показывает индивидуальную настройку разделяемых имен служебной функции.
Откройте модель rtwdemo_crlmath
в качестве примера.
Установите образцовый параметр конфигурации Shared code placement на Shared location
.
Установите параметр Shared utilities identifier format как mymodel_$N$C
. Можно настроить этот формат со строкой. Однако необходимо включать маркерный $C
.
Установите параметр Shared checksum length на 5
.
Сгенерируйте код и отчет генерации кода.
В левой панели навигации отчета рассмотрите сгенерированные файлы списка для разделяемых утилит под Shared files.
Управляйте размещением разделяемого служебного кода с образцовым параметром конфигурации Shared code placement. Значением опции по умолчанию является Auto
. Для этой установки генератор кода помещает требуемый код для фиксированной точки и других утилит в файле
, model.c
файле
или отдельном файле в папке сборки (например, model.cpp
vdp_grt_rtw
), если модель не содержит существующий разделяемый служебный код или один из этих блоков:
Блоки Model
Функциональные блоки Simulink
Функциональные блоки Вызывающей стороны
Вызовы Функций 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/_sharedutils
rtwtypes.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 Mapping Editor.
Вкладка Code Generation в диалоговом окне Signal Properties.
Свойство HeaderFile
объекта данных. Объекты данных являются объектами классов Simulink.Signal
и Simulink.Parameter
.
Если вы хотите, чтобы объявление появилось в файле
, это - лучшая практика оставить имя заголовочного файла незаданным. По умолчанию генератор кода помещает объявления данных в model.h
.model.h
Если вы задаете
как имя заголовочного файла, и если генератор кода помещает служебный код в общий ресурс, вы не можете сгенерировать код из модели. Генератор кода не может создать файл model.h
и в папке сборки модели и в разделяемой служебной папке.model.h
Можно указать, что сборка модели генерирует исходные файлы C в разделяемой сервисной папке. Смотрите Генерируют Разделяемый Служебный Код (Simulink Coder). Эти файлы включают исходные файлы C, которые содержат функциональные определения и заголовочные файлы, которые содержат макроопределения. Для этого обсуждения термин функционирует средние функции и макросы.
Блоки в той же модели и блоки в различных моделях могут использовать разделяемую функцию, когда вы используете модель - ссылку или когда вы создаете несколько автономных моделей от того же самого, запускают папку сборки. Генератор кода производит код для заданной функции только однажды для блока, который сначала инициировал генерацию кода. Когда продукт определяет требование, чтобы сгенерировать функциональный код для последующих блоков, это выполняет проверку существования файла. Если файл существует, сборка модели не регенерирует функцию. Разделяемый служебный механизм кода требует, чтобы заданная функция и имя файла представляли то же функциональное поведение, независимо от которого блок или модель генерируют функцию. Удовлетворить это требование:
Образцовые свойства, которые определяют функциональное поведение, способствуют разделяемой служебной контрольной сумме или определяют функцию и имя файла.
Блокируйте свойства, которые решают, что функциональное поведение также определяет функцию и имя файла.
Во время компиляции, правил make-файла для разделяемой сервисной компиляции выбора папки только новых файлов C и инкрементно архивируют объектный файл в разделяемую служебную библиотеку, rtwshared.lib
или rtwshared.a
. Инкрементная компиляция также происходит.
Когда вы устанавливаете образцовый параметр конфигурации Shared code placement на Shared location
или когда модель содержит блоки Model, места генератора кода совместно использованный код в разделяемой сервисной папке. Процесс сборки генерирует разделяемую сервисную контрольную сумму настройки генерации кода для разделяемого кода.
Во время последующей генерации кода, если файл контрольной суммы
существует относительно текущей папки, чтения генератора кода тот файл. Генератор кода проверяет, что текущая модель, которую вы создаете, имеет свойства настройки, которые совпадают с контрольной суммой свойств от разделяемой полезной модели. Если несоответствия происходят между свойствами, заданными в slprj/target/_sharedutils/checksummap.mat
checksummap.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
Сохраните копию в папке модели.
Создайте модель. Эта модель уже настраивается, чтобы произвести совместно использованные утилиты.
Переместитесь в папку _sharedutils
, созданную процессом сборки.
cd C:\Temp\demo\slprj\grt\_sharedutils
Загрузите файл checksummap.mat
в MATLAB.
load checksummap
Отобразите содержимое hashTbl.targetInfoStruct
и исследуйте связанные с контрольной суммой значения свойств.
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: [3.9717e+09 1.7460e+09 2.4002e+09 1.5189e+09] UtilMemSecName: 'Default' CodeCoverageChecksum: [3.6498e+09 78774415 2.5508e+09 2.1183e+09] TargetLargestAtomicInteger: 'Char' TargetLargestAtomicFloat: 'None' ProdLargestAtomicInteger: 'Char' ProdLargestAtomicFloat: 'Float' LongLongMode: 'on' ProdLongLongMode: 'off' CollapseNonTrivialExpressions: 'false' 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 | Зарезервированный (только внутреннее пользование) |
UtilMemSecName | MemSecFuncSharedUtil , MemSecPackage |
CodeCoverageChecksum | Зарезервированный (только внутреннее пользование) |
TargetLargestAtomicInteger | TargetLargestAtomicInteger |
TargetLargestAtomicFloat | TargetLargestAtomicFloat |
ProdLargestAtomicInteger | ProdLargestAtomicInteger |
ProdLargestAtomicFloat | ProdLargestAtomicFloat |
LongLongMode | TargetLongLongMode |
ProdLongLongMode | ProdLongLongMode |
CollapseNonTrivialExpressions | Зарезервированный (только внутреннее пользование) |
toolchainOrTMF | Имя:
|