Гибкий класс памяти для различных контекстов иерархии модели

Этот пример показывает, как использовать один класс памяти в иерархии модели, чтобы сгенерировать код, который не структурирован для данных одно экземпляра и структурирован для данных мультиэкземпляра. Когда иерархия модели будет содержать одно экземпляр и данные мультиэкземпляра, используйте гибкий класс памяти, чтобы задать настройки для этих двух контекстов вместо того, чтобы создать два класса отдельной системы хранения.

Этот пример использует топ-модель одно экземпляра ex_mdlreftop_dd, который ссылается на модель ex_mdlrefbot_dd мультиэкземпляра три раза. Обе модели совместно используют словарь данных ex_mdlref_dd.sldd. Когда вы задаете класс памяти в словаре разделяемых данных, можно применить класс к элементам данных в обеих моделях.

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

    addpath(fullfile(docroot,'toolbox','ecoder','examples'))
    ex_mdlreftop_dd
  2. Откройте словарь разделяемых данных. В нижнем левом углу редактора моделей кликните по значку словаря данных Simulink®.

  3. Откройте разделяемый Словарь Embedded Coder. В панели Model Hierarchy Model Explorer расширьте узел ex_mdlref_dd и нажмите Embedded Coder Dictionary. На правой панели нажмите Open Embedded Coder Dictionary.

  4. Чтобы создать класс памяти, нажмите Add.

  5. Для нового класса памяти, в панели Property Inspector, устанавливает эти значения свойств:

    • Name к MyStorageClass.

    • Выберите Use different property settings for single-instance and multi-instance data.

    • Single-instance storage> Storage Type к Unstructured.

    • Multi-instance storage> Storage Type к Structured.

    Когда вы применяете MyStorageClass к элементу данных, Словарь Embedded Coder реализует настройки одно экземпляра или настройки мультиэкземпляра в зависимости от типа данных и контекста модели в иерархии модели - ссылки. Рассмотрите реализации для различных настроек в предварительном просмотре псевдокода.

  6. Примените класс памяти к внутренним элементам данных путем определения его как значения по умолчанию словаря. В Словаре Embedded Coder нажмите Configure Defaults. Для строки Internal Data, набор Storage Class к MyStorageClass. Нажмите OK.

    Поскольку ex_mdlreftop_dd и ex_mdlrefbot_dd совместно используют словарь ex_mdlref_dd.sldd, обе модели используют MyStorageClass в качестве класса памяти по умолчанию для внутренних данных.

  7. Откройте перспективу Кода. Выберите Code> C/C++ Code> Configure Model in Code Perspective.

  8. Сгенерируйте код для модели.

  9. Рассмотрите сгенерированный код для модели, на которую ссылаются. Чтобы открыть модель, на которую ссылаются, в редакторе, дважды кликните блок Model, CounterA. Код эталонной модели появляется в Представлении кода. В ex_mdlrefbot_dd.h код эталонной модели задает структуру класса памяти, в которой это хранит внутренние данные модели, на которую ссылаются.

    /* Storage class 'MyStorageClass', for model 'ex_mdlrefbot_dd' */
    typedef struct {
      real_T PreviousOutput_DSTATE;        /* '<Root>/Previous Output' */
    } ex_mdlrefbot_dd_MyStorageClass;
    
    /* Real-time Model Data Structure */
    struct ex_mdlrefbot_dd_tag_RTM {
      const char_T **errorStatus;
      ex_mdlrefbot_dd_MyStorageClass *MyStorageClass_ex_mdlrefbot_dd;
    };

    Поскольку модель, на которую ссылаются, является мультиэкземпляром, определение реализует настройки данных мультиэкземпляра MyStorageClass. Код эталонной модели хранит внутренние данные в структуре ex_mdlrefbot_dd_MyStorageClass.

  10. Перейдите назад топ-модели и рассмотрите сгенерированный код. В ex_mdlreftop_dd.c код топ-модели задает свои внутренние данные для каждого блока Model путем инстанцирования класса памяти модели, на которую ссылаются, ex_mdlrefbot_dd_MyStorageClass.

    /* Storage class 'MyStorageClass' */
    ex_mdlrefbot_dd_MdlrefDW ex_mdlreftop_dd_CounterA_InstanceData;
    ex_mdlrefbot_dd_MdlrefDW ex_mdlreftop_dd_CounterB_InstanceData;
    ex_mdlrefbot_dd_MdlrefDW ex_mdlreftop_dd_CounterC_InstanceData;
    
    /* Storage class 'MyStorageClass' */
    ex_mdlrefbot_dd_MyStorageClass MyStorageClass_CounterA;
    
    /* Storage class 'MyStorageClass' */
    ex_mdlrefbot_dd_MyStorageClass MyStorageClass_CounterB;
    
    /* Storage class 'MyStorageClass' */
    ex_mdlrefbot_dd_MyStorageClass MyStorageClass_CounterC;

    Поскольку топ-модель является одно экземпляром, эти определения реализуют настройки данных одно экземпляра MyStorageClass. Топ-модель также группирует его собственные внутренние данные как автономные переменные при помощи настроек данных одно экземпляра. Код топ-модели не содержит определение структуры для внутренних данных.

Смотрите также

Похожие темы