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

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

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

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

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

Сконфигурируйте именование сгенерированных функций

Сконфигурируйте правило именования значения по умолчанию для сгенерированных разделяемых служебных функций при помощи одного из этих методов.

НастройкаДействие
Новая модель или существующая модель, для которой вы сопоставили пользовательские настройки по умолчанию при помощи Code Mapping Editor или значения по умолчанию кода, сопоставляющего интерфейс программированияВ Embedded Coder Dictionary задайте функциональный шаблон настройки, который задает пользовательское правило именования функции. Затем в Code Mapping Editor или при помощи значения по умолчанию кода, сопоставляющего интерфейс программирования, сопоставьте категорию функции Shared utility с тем шаблоном. Для получения дополнительной информации смотрите, Конфигурируют генерацию кода C По умолчанию для Категорий Данных модели и Функций (Embedded Coder).
Модель создала в релизе ранее, чем R2018a, и это не было сконфигурировано с Code Mapping Editor или значением по умолчанию, сопоставляющим интерфейс программированияУстановите образцовый параметр конфигурации Shared utilities identifier format (CustomSymbolsStrUtil) к пользовательскому правилу именования функции. Для получения дополнительной информации смотрите Управление форматом Идентификатора (Embedded Coder).

Если вы используете 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. Для этой установки генератор кода помещает требуемый код для фиксированной точки и других утилит в файле 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 для Разделяемого Служебного Кода

Сгенерированный заголовочный файл 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 в разделяемой сервисной папке. Смотрите Генерируют Разделяемый Служебный Код. Эти файлы включают исходные файлы 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).

Похожие темы