Блоки в модели могут требовать общей функциональности для реализации своих алгоритмов. Рассмотрите возможность модульного преобразования этой функции в автономные функции поддержки или вспомогательные функции. Этот подход может быть более эффективным, чем встраивание кода для функциональных возможностей для каждого экземпляра блока. Чтобы принять решение об использовании библиотеки или общей утилиты, рассмотрите:
Пакетирование функций, которые могут содержать несколько вызывающих абонентов в библиотеке при статическом определении функций. То есть перед использованием генератора кода для создания кода модели исходный код функции существует в файле.
Функции упаковки, которые могут иметь несколько вызывающих абонентов в качестве общих утилит (создаваемых во время генерации кода), если функции не могут быть определены статически. Например, несколько свойств модели и блока определяют используемые функции и их поведение. Кроме того, эти свойства определяют определения типов (например, typedef) в файлах заголовков общей утилиты. Количество возможных комбинаций свойств, определяющих уникальное поведение, делает нецелесообразным статическое определение возможных файлов функций перед созданием кода.
Настройте правило именования по умолчанию для созданных общих служебных функций с помощью одного из этих методов.
| Конфигурация | Действие |
|---|---|
| Новая модель или существующая модель, для которой сопоставлены параметры настройки по умолчанию с помощью редактора сопоставлений кода или интерфейса программирования сопоставлений кода | В словаре встроенного кодера определите шаблон настройки функции, определяющий правило именования пользовательской функции. Затем в редакторе сопоставлений кодов или с помощью интерфейса программирования сопоставлений кодов сопоставьте категорию общих служебных функций с этим шаблоном. Дополнительные сведения см. в разделе Настройка генерации кода C по умолчанию для категорий элементов и функций данных. |
| Модель, созданная в более ранней версии, чем R2018a, и не настроенная с помощью редактора сопоставлений кода или интерфейса программирования сопоставлений кода | Задайте параметр конфигурации модели Shared utilities identifier format (формат идентификатора общих утилит) (CustomSymbolsStrUtil) к правилу именования пользовательских функций. Дополнительные сведения см. в разделе Управление форматом идентификатора. |
После использования редактора сопоставлений кодов или интерфейса программирования сопоставлений кодов для настройки модели настройка параметра конфигурации модели Формат идентификатора общих утилит не влияет на создание кода. Этот параметр неприменим для моделей, настроенных с этими спецификациями.
| Системный целевой файл | Язык программирования |
|---|---|
ert.tlc | C++ |
autosar.tlc | C |
autosar_adaptive.tlc | C++ |
Правило именования для общих служебных функций должно включать маркер условной контрольной суммы $C. Чтобы настроить длину контрольной суммы, создаваемой генератором кода, используйте параметр Общая длина контрольной суммы (SharedChecksumLength) . Увеличение длины контрольной суммы снижает вероятность конфликтов.
В этом примере показана настройка имен общих служебных функций для генерации кода C.
Открыть пример модели rtwdemo_configdefaults и приложение Embedded Coder.
Задайте для параметра конфигурации модели Размещение общего кода значение Shared location.
Откройте словарь встроенного кодера. На вкладке C Code выберите Code Interface > Embedded Coder Dictionary.
На вкладке Шаблоны адаптации функции щелкните Добавить, чтобы добавить новый шаблон настройки функции.
Для шаблона настройки функции укажите следующие конфигурации:
Имя: exSharedUtility
Имя функции: mymodel_$N$C
Этот формат можно настроить с помощью строки. Необходимо включить маркер $C.
Откройте редактор сопоставлений кода. На вкладке Код C выберите Интерфейс кода > Сопоставления кодов по умолчанию.
На вкладке Значения по умолчанию для категории Общая утилита настройте шаблон настройки функции как exSharedUtility.
Создание кода и отчета о создании кода.
На левой панели навигации отчета просмотрите список созданных файлов для общих утилит в разделе Общие файлы.
Управление размещением общего служебного кода с помощью параметра конфигурации модели Shared code placement. Значение параметра по умолчанию: Auto. Для этого параметра генератор кода помещает требуемый код для фиксированных точек и других утилит в файл, model.c файл или отдельный файл в папке сборки (например, model.cppvdp_grt_rtw), если модель не содержит существующего общего служебного кода или одного из следующих блоков:
Блоки модели
Функциональные блоки Simulink
Блоки вызова функции
Вызовы функций Simulink из функциональных блоков Stateflow или MATLAB
Графическая функция Stateflow при выборе параметра «Экспорт функций на уровне диаграммы»
Если модель содержит один или несколько предшествующих блоков, генератор кода создает и использует папку общих утилит в slprj. Соглашение об именовании для общих папок утилит: slprj/target/_sharedutils. target является sim для моделирования с блоками модели или именем системного целевого файла для генерации кода.
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 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, даже если модель в настоящее время не использует сложные типы данных. Выбор этого параметра защищает от будущих требований по добавлению поддержки сложных типов данных при интеграции кода.
Снимите флажок Поддерживать неинлинированные S-функции. Если в модели используются неинлинные S-функции, эта опция создает ошибку.
Очистить параметр Классический интерфейс вызова. Этот параметр отключает использование целевого файла системы GRT.
Экспортированные файлы заголовков отображаются в общей папке утилиты в следующих случаях:
Управление размещением файлов объявлений для сигналов, параметров и состояний осуществляется путем определения и применения классов хранения.
Генератор кода помещает служебный код в общее расположение.
Например, можно указать файл заголовка для данных с помощью:
Класс хранения, определяемый в словаре Embedded Coder Dictionary и сопоставляемый с категориями данных модели в редакторе сопоставления кодов.
Вкладка Создание кода (Code Generation) в диалоговом окне Свойства сигнала (Signal Properties).
HeaderFile свойства объекта данных. Объекты данных являются объектами классов Simulink.Signal и Simulink.Parameter.
Если необходимо, чтобы объявление появилось в файле , рекомендуется оставить имя файла заголовка без указания. По умолчанию генератор кода помещает объявления данных в model.h.model.h
При указании в качестве имени файла заголовка, и если генератор кода помещает служебный код в общее расположение, невозможно создать код из модели. Генератору кода не удается создать файл model.h как в папке построения модели, так и в папке общих утилит.model.h
Можно указать, что сборка модели создает исходные файлы C в папке общих утилит. См. раздел Создание общего служебного кода. Эти файлы включают исходные файлы C, содержащие определения функций, и файлы заголовков, содержащие определения макросов. Для этого обсуждения термин «функции» означает функции и макросы.
Блоки в одной модели и блоки в разных моделях могут использовать общую функцию при использовании ссылки на модель или при построении нескольких автономных моделей из одной папки начальной сборки. Генератор кода создает код для данной функции только один раз для блока, который сначала запускает генерацию кода. Поскольку продукт определяет потребность в создании кода функции для последующих блоков, он выполняет проверку существования файла. Если файл существует, построение модели не регенерирует функцию. Механизм совместного служебного кода требует, чтобы данная функция и имя файла представляли одно и то же функциональное поведение независимо от того, какой блок или модель генерирует функцию. Для выполнения этого требования:
Свойства модели, определяющие поведение функции, вносят вклад в общую контрольную сумму утилиты или определяют функцию и имя файла.
Свойства блока, определяющие поведение функции, также определяют функцию и имя файла.
Во время компиляции правила makefile для папки общих утилит выбирают компиляцию только новых C-файлов и постепенно архивируют файл объекта в общую библиотеку утилит, rtwshared.lib, или rtwshared.a. Также происходит инкрементная компиляция.
Если для параметра конфигурации модели Размещение общего кода (Shared code placement) задано значение Shared location или если модель содержит блоки модели, генератор кода помещает общий код в папку общих утилит. Процесс построения генерирует контрольную сумму общих утилит конфигурации создания кода для общего кода.
Во время последующего создания кода, если файл контрольной суммы 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
Сохраните копию модели в папке.
Создайте модель, которая настроена для создания общих утилит.
На вкладке Приложения в разделе Создание кода щелкните Кодер Simulink.
На вкладке 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 | Наименование:
|