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

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

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

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

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

Правило именования для разделяемых служебных функций должно включать условную лексему контрольной суммы $C. Чтобы настроить длину контрольной суммы, которую производит генератор кода, используйте параметр Shared checksum length (SharedChecksumLength). Увеличение длины контрольной суммы уменьшает вероятность столкновений.

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

  1. Откройте модель rtwdemo_configdefaults в качестве примера и приложение Embedded Coder.

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

  3. Откройте Словарь Embedded Coder. На вкладке C Code выберите Code Interface> Embedded Coder Dictionary.

  4. На вкладке Function Customization Templates нажмите Add, чтобы добавить новый функциональный шаблон настройки.

  5. Для функционального шаблона настройки задайте эти настройки:

    • Имя: exSharedUtility

    • FunctionName : mymodel_$N$C

      Можно настроить этот формат при помощи строки. Необходимо включать маркерный $C.

  6. Откройте редактор Отображений Кода. На вкладке C Code выберите Code Interface> Default Code Mappings.

  7. На вкладке Function Defaults, для категории Shared Utility, конфигурируют Function Customization Template как exSharedUtility.

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

  9. В левой панели навигации отчета рассмотрите список сгенерированных файлов для разделяемых утилит под 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 (Embedded Coder) и сопоставляете с категориями данных модели в Code Mappings Editor (Embedded Coder).

  • Вкладка Code Generation в диалоговом окне Signal Properties.

  • HeaderFile свойство объекта данных. Объекты данных являются объектами классов Simulink.Signal и Simulink.Parameter.

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

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

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

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

    1. На вкладке Apps, под Code Generation, click Simulink Coder.

    2. На вкладке C Code, в разделе Generate Code, нажимают кнопку Build.

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

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

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

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

Ключевые именаСвойства модели
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Зарезервированный (только внутреннее пользование)
UtilMemSecPreStatementMemSecFuncSharedUtil, MemSecPackage
UtilMemSecPostStatementMemSecFuncSharedUtil, MemSecPackage
UtilMemSecCommentMemSecFuncSharedUtil, MemSecPackage
CodeCoverageChecksumЗарезервированный (только внутреннее пользование)
TargetLargestAtomicIntegerTargetLargestAtomicInteger
TargetLargestAtomicFloatTargetLargestAtomicFloat
ProdLargestAtomicIntegerProdLargestAtomicInteger
ProdLargestAtomicFloatProdLargestAtomicFloat
LongLongModeTargetLongLongMode
ProdLongLongModeProdLongLongMode
CollapseNonTrivialExpressionsЗарезервированный (только внутреннее пользование)
toolchainOrTMF

Имя:

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

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

Похожие темы