В этом примере показано, как использовать динамическое выделение памяти для массивов переменного размера в блоке MATLAB Function. Динамическое выделение памяти выделяет память на куче по мере необходимости во время исполнения, вместо статического выделения памяти в стеке. Динамическое выделение памяти выгодно, когда:
Вы не знаете верхней границы массива.
Вы не хотите выделять память в стеке для больших массивов.
Динамическое выделение памяти можно использовать только для массивов, которые локальны по отношению к блоку MATLAB Function.
Вы не можете использовать динамическое выделение памяти для:
Входной и выходной сигналы. Входные и выходные сигналы переменного размера должны иметь верхнюю границу.
Параметры или глобальные переменные. Параметры и глобальные переменные должны быть фиксированного размера.
Поля массивов шин. Массивы шин не могут иметь поля переменного размера.
Дискретные свойства состояний системных объектов, сопоставленных с блоком MATLAB System.
Создайте эту модель Simulink, которая имеет MATLAB Function блок с неограниченным массивом переменного размера.
Создайте Simulink® модели mymodel
.
Добавьте блок MATLAB Function к модели.
В MATLAB Function блок добавьте этот код:
function s = myfcn(n) Z = rand(1,n); s = sum(Z); end
Добавьте блок Constant слева от блока MATLAB Function.
Добавьте блок Outport справа от блока MATLAB Function.
Соедините блоки.
Убедитесь, что вы конфигурируете модель, чтобы использовать динамическое выделение памяти для массивов переменного размера в блоках MATLAB Function. В диалоговом окне Параметров конфигурации в категории Simulation Target > Advanced parameters убедитесь, что:
Установлен флажок Dynamic memory allocation in MATLAB functions.
Параметр Dynamic memory allocation threshold in MATLAB functions имеет значение по умолчанию 65536.
Симулируйте модель.
В редакторе функций MATLAB, чтобы открыть MATLAB® function report, нажмите View Report.
Вкладка переменных показывает, что Z
является 1-by-:? массив. Двоеточие (:) указывает, что второе измерение переменного размера. Вопросительный знак (?) указывает, что второе измерение неограниченно.
Симуляция должна использовать динамическое выделение памяти для Z
потому что второе измерение Z
не имеет верхней границы.
Когда массив не ограничен, генератор кода должен использовать динамическое выделение памяти. Если массив ограничен, генератор кода использует динамическое выделение памяти только, если размер массива в байтах больше или равен порогу динамического выделения памяти. Значение по умолчанию для этого порога является 65536.
Динамическая память имеет затраты на эффективность во время выполнения. Управляя его использованием, можно улучшить скорость выполнения.
Если вы делаете Z
ограниченный массив переменного размера с размером, большим порога, генератор кода использует динамическое выделение памяти для Z
. Для примера:
В mymodel
, изменение myfcn
так что Z
имеет верхнюю границу 500.
function s = myfcn(n) assert(n < 500); Z = rand(1,n); s = sum(Z); end
Симулируйте модель.
В отчете о функции MATLAB видно, что Z
массив 1 бай-: 500. Это переменный размер с верхней границей 500.
Уменьшите динамическое выделение памяти до значения, меньшего или равного 4000
, который является размером, в байтах, Z
. В диалоговом окне Параметров конфигурации, в категории Simulation Target > Advanced parameters, установите параметр Dynamic memory allocation threshold in MATLAB functions равным 4000.
Симулируйте модель.
Генератор кода использует динамическое выделение памяти, потому что размер Z
равен динамическому порогу выделения памяти, 4000.
Если у вас есть Simulink Coder™, можно сгенерировать код С для этой модели. Затем можно увидеть, как генератор кода представляет динамически распределенные массивы.
Сконфигурируйте модель, чтобы использовать решатель с фиксированным шагом. В диалоговом окне Параметров конфигурации, на панели Solver, под Solver selection:
Для Type выберите Fixed-step
.
Для Solver выберите discrete (no continuous states)
.
Сконфигурируйте модель, чтобы создать и использовать отчет генерации кода. В диалоговом окне Параметров конфигурации на панели Code Generation > Report выберите Create code generation report и Open report automatically.
Отредактируйте код в MATLAB Function блоке так, чтобы он был похож на этот код:
function s = myfcn(n) Z = rand(1,n); s = sum(Z); end
Z
является неограниченным массивом переменного размера.
Убедитесь, что модель сконфигурирована для динамического выделения памяти:
Установлен флажок Dynamic memory allocation in MATLAB functions.
Параметр Dynamic memory allocation threshold in MATLAB functions имеет значение по умолчанию 65536.
Создайте модель.
В отчете генерации кода откройте mymodel.c
. Можно сказать, что генератор кода использовал динамическое выделение памяти для Z
потому что вы видите emxArray
тип emxArray_real_T_mymodel_T
и emxArray
служебные функции, такие как mymodel_emxInit_real_T
. Генератор кода использует emxArray
тип для переменных, чья память динамически выделяется. Сгенерированный код использует emxArray
Служебные функции для управления emxArray
с.
Если у вас есть Embedded Coder®, можно настроить идентификаторы для emxArray
типы и служебные функции. См. «Управление форматом идентификатора» (Embedded Coder).