exponenta event banner

Создать общий служебный код

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

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

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

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

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

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

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

После использования редактора сопоставлений кодов или интерфейса программирования сопоставлений кодов для настройки модели настройка параметра конфигурации модели Формат идентификатора общих утилит не влияет на создание кода. Этот параметр неприменим для моделей, настроенных с этими спецификациями.

Системный целевой файлЯзык программирования
ert.tlcC++
autosar.tlcC
autosar_adaptive.tlcC++

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

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

  1. Открыть пример модели rtwdemo_configdefaults и приложение Embedded Coder.

  2. Задайте для параметра конфигурации модели Размещение общего кода значение Shared location.

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

  4. На вкладке Шаблоны адаптации функции щелкните Добавить, чтобы добавить новый шаблон настройки функции.

  5. Для шаблона настройки функции укажите следующие конфигурации:

    • Имя: exSharedUtility

    • Имя функции: mymodel_$N$C

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

  6. Откройте редактор сопоставлений кода. На вкладке Код C выберите Интерфейс кода > Сопоставления кодов по умолчанию.

  7. На вкладке Значения по умолчанию для категории Общая утилита настройте шаблон настройки функции как exSharedUtility.

  8. Создание кода и отчета о создании кода.

  9. На левой панели навигации отчета просмотрите список созданных файлов для общих утилит в разделе Общие файлы.

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

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

Произведенный 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, даже если модель в настоящее время не использует сложные типы данных. Выбор этого параметра защищает от будущих требований по добавлению поддержки сложных типов данных при интеграции кода.

  • Снимите флажок Поддерживать неинлинированные S-функции. Если в модели используются неинлинные S-функции, эта опция создает ошибку.

  • Очистить параметр Классический интерфейс вызова. Этот параметр отключает использование целевого файла системы GRT.

Избегать дублирования заголовочных файлов для экспортируемых данных

Экспортированные файлы заголовков отображаются в общей папке утилиты в следующих случаях:

  • Управление размещением файлов объявлений для сигналов, параметров и состояний осуществляется путем определения и применения классов хранения.

  • Генератор кода помещает служебный код в общее расположение.

Например, можно указать файл заголовка для данных с помощью:

  • Класс хранения, определяемый в словаре встроенного кодера (Embedded Coder Dictionary, Embedded Coder) и сопоставляемый с категориями данных модели в редакторе сопоставления кодов.

  • Вкладка Создание кода (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.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. На вкладке Приложения в разделе Создание кода щелкните Кодер Simulink.

    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) или файл макета шаблона, связанный с цепочкой инструментов.

  • Файл макета шаблона, если в процессе построения используется файл макета шаблона (TemplateMakefile).

Связанные темы