Сгенерируйте общий код утилиты

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

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

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

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

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

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

СтроениеДействие
Новая модель или существующая модель, для которой вы сопоставили настройки индивидуальной настройки по умолчанию с помощью интерфейса программирования Code Mappings editor или отображений кодаВ Embedded Coder Dictionary задайте шаблон индивидуальной настройки функции, который задает пользовательское правило именования функции. Затем в редакторе Отображения или при помощи интерфейса программирования отображений кода сопоставьте категорию функции Shared utility с этим шаблоном. Для получения дополнительной информации смотрите Настройка генерации кода C по умолчанию для категорий элементов данных и функций.
Модель, созданная в релизе ранее R2018a и не сконфигурированная с интерфейсом программирования Code Mappings editor или отображений кодаУстановите параметр конфигурации модели Формат идентификатора общих утилит (CustomSymbolsStrUtil) в пользовательское правило именования функций. Дополнительные сведения см. в разделе Управление форматом идентификатора.

Если вы используете интерфейс программирования Code Mappings editor или отображений кода для конфигурирования модели, установка параметра конфигурации модели 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. Для шаблона индивидуальной настройки функции задайте следующие строения:

    • Name: exSharedUtility

    • Function Name: 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.

Управление размещением Общей Утилиты

Управляйте размещением общего кода утилиты с параметром конфигурации <reservedrangesplaceholder1> модели. Значение опции по умолчанию Auto. Для этой настройки генератор кода помещает необходимый код для фиксированной точки и других утилит в model.c файл, 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 Mappings editor.

  • Вкладка Code Generation в диалоговом окне Свойства.

  • The 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. Создайте модель, которая настроена на производство общих утилит.

    1. На вкладке Apps, под Code Generation, нажмите 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, если процесс сборки использует либо набор инструментов (Toolchain) или шаблон make-файла, связанный с набором инструментальных средств.

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

Похожие темы