Сгенерируйте разделяемый служебный код

Когда сгенерировать разделяемый служебный код

Блоки в модели могут потребовать, чтобы общая функциональность реализовала их алгоритмы. Рассмотрите модульное исполнение этой функциональности в автономную поддержку или функции помощника. Этот подход может быть более эффективным, чем встраивание кода для функциональности для каждого экземпляра блока. Чтобы решить о пользовании библиотекой или разделяемой утилитой, рассмотрите:

  • Упаковка функционирует, который может иметь несколько вызывающих сторон в библиотеку, когда функции заданы статически. Таким образом, прежде чем вы будете использовать генератор кода, чтобы произвести код для вашей модели, функциональный исходный код существует в файле.

  • Упаковка функционирует, который может иметь несколько вызывающих сторон как совместно использованные утилиты (произведенный во время генерации кода), когда функции не могут быть заданы статически. Например, несколько моделей - и специфичные для блока свойства задают, какие функции используются и их поведение. Кроме того, эти свойства определяют определения типа (например, 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). Увеличение длины контрольной суммы уменьшает вероятность столкновений.

Этот пример показывает индивидуальную настройку разделяемых имен служебной функции.

  1. Откройте модель rtwdemo_crlmath в качестве примера.

  2. Установите параметр конфигурации модели Shared code placement на Shared location.

  3. Установите параметр Shared utilities identifier format на mymodel_$N$C. Можно настроить этот формат со строкой. Однако необходимо включать маркерный $C.

  4. Установите параметр Shared checksum length на 5.

  5. Сгенерируйте код и отчет генерации кода.

  6. В левой панели навигации отчета рассмотрите сгенерированные файлы списка для разделяемых утилит под Shared files.

Управляйте размещением разделяемого служебного кода

Управляйте размещением разделяемого служебного кода с параметром конфигурации модели Shared code placement. Значением опции по умолчанию является Auto. Для этой установки генератор кода помещает требуемый код для фиксированной точки и других утилит в modelC файл, model.cpp файл или отдельный файл в папке сборки (например, vdp_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 для Разделяемого Служебного Кода

Сгенерированный 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.

Если вы хотите, чтобы объявление появилось в файле modelH, это - лучшая практика оставить имя заголовочного файла незаданным. По умолчанию генератор кода помещает объявления данных в modelH.

Если вы задаете modelH как имя заголовочного файла, и если генератор кода помещает служебный код в общий ресурс, вы не можете сгенерировать код из модели. Генератор кода не может создать файл modelH и в папке сборки модели и в разделяемой служебной папке.

Уменьшайте разделяемую служебную генерацию кода с инкрементными сборками

Можно указать, что сборка модели генерирует исходные файлы 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 это задает связанные с контрольной суммой свойства:

  1. Откройте rtwdemo_lct_start_term.slx модель. В Командном окне введите:

    rtwdemo_lct_start_term
  2. Создайте и переместитесь в новую рабочую папку.

    mkdir C:\Temp\demo
    cd C:\Temp\demo
  3. Сохраните копию в папке модели.

  4. Создайте модель. Эта модель уже настраивается, чтобы произвести совместно использованные утилиты.

  5. Переместитесь в _sharedutils папка создается процессом сборки.

    cd C:\Temp\demo\slprj\grt\_sharedutils
  6. Загрузите checksummap.mat файл в MATLAB.

    load checksummap
  7. Отобразите содержимое 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 хэш-таблица от разделяемой полезной модели. Некоторые пары "ключ-значение" имеют отношение непосредственно к свойству модели. Другие пары относятся к группам свойств.

Следующая таблица описывает пары "ключ-значение".

Ключевые именаСвойства модели
ShiftRightIntArithTargetShiftRightIntArith
ProdShiftRightIntArithProdShiftRightIntArith
EndianessTargetEndianess
ProdEndianessProdEndianess
wordlengthsTargetBitPerChar, TargetBitPerShort, TargetBitPerInt, TargetBitPerLong, TargetBitPerLongLong, TargetBitPerFloat, TargetBitPerDouble, TargetBitPerPointer
ProdwordlengthsProdBitPerChar, ProdBitPerShort, ProdBitPerInt, ProdBitPerLong, ProdBitPerLongLong, ProdBitPerFloat, ProdBitPerDouble, ProdBitPerPointer
TargetWordSizeTargetWordSize
ProdWordSizeProdWordSize
TargetHWDeviceTypeTargetHWDeviceType
ProdHWDeviceTypeProdHWDeviceType
TargetIntDivRoundToTargetIntDivRoundTo
ProdIntDivRoundToProdIntDivRoundTo
UseDivisionForNetSlopeComputationUseDivisionForNetSlopeComputation
PurelyIntegerCodePurelyIntegerCode
PortableWordSizesPortableWordSizes
SupportNonInlinedSFcnsSupportNonInlinedSFcns
RTWReplacementTypesEnableUserReplacementTypes, ReplacementTypes
MaxIdInt8MaxIdInt8
MinIdInt8MinIdInt8
MaxIdUint8MaxIdUint8
MaxIdInt16MaxIdInt16
MinIdInt16MinIdInt16
MaxIdUint16MaxIdUint16
MaxIdInt32MaxIdInt32
MinIdInt32MinIdInt32
MaxIdUint32MaxIdUint32
MaxIdInt64MaxIdInt64
MinIdInt64MinIdInt64
MaxIdUint64MaxIdUint64
BooleanTrueIdBooleanTrueId
BooleanFalseIdBooleanFalseId
TypeLimitIdReplacementHeaderFileTypeLimitIdReplacementHeaderFile
SharedCodeRepositoryЗарезервированный (только внутреннее пользование)
TargetLangTargetLang
PreserveExternInFcnDeclsPreserveExternInFcnDecls
EnableSignedRightShiftsEnableSignedRightShifts
EnableSignedLeftShiftsEnableSignedLeftShifts
TflNameCodeReplacementLibrary
TflCheckSumЗарезервированный (только внутреннее пользование)
UtilMemSecNameMemSecFuncSharedUtil, MemSecPackage
CodeCoverageChecksumЗарезервированный (только внутреннее пользование)
TargetLargestAtomicIntegerTargetLargestAtomicInteger
TargetLargestAtomicFloatTargetLargestAtomicFloat
ProdLargestAtomicIntegerProdLargestAtomicInteger
ProdLargestAtomicFloatProdLargestAtomicFloat
LongLongModeTargetLongLongMode
ProdLongLongModeProdLongLongMode
CollapseNonTrivialExpressionsЗарезервированный (только внутреннее пользование)
toolchainOrTMF

Имя:

  • Набор инструментальных средств, если процесс сборки использует любого набор инструментальных средств (Toolchain) или make-файл шаблона, который сопоставлен с набором инструментальных средств.

  • Обработайте make-файл по шаблону, если использование процесса сборки обрабатывает make-файл по шаблону (TemplateMakefile).

Похожие темы