Этот пример показывает, как использовать один класс памяти в иерархии модели, чтобы сгенерировать код, который не структурирован для данных одно экземпляра и структурирован для данных мультиэкземпляра. Когда иерархия модели будет содержать одно экземпляр и данные мультиэкземпляра, используйте гибкий класс памяти, чтобы задать настройки для этих двух контекстов вместо того, чтобы создать два класса отдельной системы хранения.
Этот пример использует топ-модель одно экземпляра ex_mdlreftop_dd
, который ссылается на модель ex_mdlrefbot_dd
мультиэкземпляра три раза. Обе модели совместно используют словарь данных ex_mdlref_dd.sldd
. Когда вы задаете класс памяти в словаре разделяемых данных, можно применить класс к элементам данных в обеих моделях.
Откройте модель ex_mdlreftop_dd
в качестве примера.
addpath(fullfile(docroot,'toolbox','ecoder','examples')) ex_mdlreftop_dd
Откройте словарь разделяемых данных. В нижнем левом углу редактора моделей кликните по значку словаря данных Simulink®.
Откройте разделяемый Словарь Embedded Coder. В панели Model Hierarchy Model Explorer расширьте узел ex_mdlref_dd
и нажмите Embedded Coder Dictionary. На правой панели нажмите Open Embedded Coder Dictionary.
Чтобы создать класс памяти, нажмите Add.
Для нового класса памяти, в панели 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 реализует настройки одно экземпляра или настройки мультиэкземпляра в зависимости от типа данных и контекста модели в иерархии модели - ссылки. Рассмотрите реализации для различных настроек в предварительном просмотре псевдокода.
Примените класс памяти к внутренним элементам данных путем определения его как значения по умолчанию словаря. В Словаре Embedded Coder нажмите Configure Defaults. Для строки Internal Data, набор Storage Class к MyStorageClass
. Нажмите OK.
Поскольку ex_mdlreftop_dd
и ex_mdlrefbot_dd
совместно используют словарь ex_mdlref_dd.sldd
, обе модели используют MyStorageClass
в качестве класса памяти по умолчанию для внутренних данных.
Откройте перспективу Кода. Выберите Code> C/C++ Code> Configure Model in Code Perspective.
Сгенерируйте код для модели.
Рассмотрите сгенерированный код для модели, на которую ссылаются. Чтобы открыть модель, на которую ссылаются, в редакторе, дважды кликните блок 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
.
Перейдите назад топ-модели и рассмотрите сгенерированный код. В 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
. Топ-модель также группирует его собственные внутренние данные как автономные переменные при помощи настроек данных одно экземпляра. Код топ-модели не содержит определение структуры для внутренних данных.