В этом примере показано, как использовать динамическое выделение памяти в массивах переменного размера в блоке MATLAB Function. Динамическое выделение памяти выделяет память на куче по мере необходимости во время выполнения, вместо того, чтобы выделить память статически на стеке. Динамическое выделение памяти выгодно когда:
Вы не знаете верхнюю границу массива.
Вы не хотите выделять память на стеке для больших массивов.
Можно использовать динамическое выделение памяти только в массивах, которые локальны для блока MATLAB Function.
Вы не можете использовать динамическое выделение памяти в:
Сигналы ввода и вывода. Сигналы ввода и вывода переменного размера должны иметь верхнюю границу.
Параметры или глобальные переменные. Параметры и глобальные переменные должны быть фиксированным размером.
Поля массивов шины A. Массивы шины A не могут иметь полей переменного размера.
Свойства дискретного состояния Системных объектов сопоставлены с блоком MATLAB System.
Создайте эту модель Simulink, которая имеет блок MATLAB Function с неограниченным массивом переменного размера.
Создайте модель mymodel
Simulink®.
Добавьте блок MATLAB Function в модель.
В блоке MATLAB Function добавьте этот код:
function s = myfcn(n) Z = rand(1,n); s = sum(Z); end
Добавьте блок Constant слева от блока MATLAB Function.
Добавьте блок Outport справа от блока MATLAB Function.
Соедините блоки.
Убедитесь, что вы конфигурируете модель, чтобы использовать динамическое выделение памяти в массивах переменного размера в блоках MATLAB Function. В диалоговом окне Configuration Parameters, в категории Simulation Target > Advanced parameters, убеждаются что:
Флажок Dynamic memory allocation in MATLAB functions устанавливается.
Параметр Dynamic memory allocation threshold in MATLAB functions имеет значение по умолчанию 65536.
Симулируйте модель.
В Редакторе функции MATLAB, чтобы открыть отчет MATLAB Function, нажимают View Report.
Вкладка переменных показывает тот Z
1 на:? массив. Двоеточие (:) указывает, что второе измерение является переменным размером. Вопросительный знак (?) указывает, что второе измерение неограниченно.
Симуляция должна использовать динамическое выделение памяти в 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
. В диалоговом окне Configuration Parameters, в категории Simulation Target > Advanced parameters, устанавливает параметр Dynamic memory allocation threshold in MATLAB functions на 4 000.
Симулируйте модель.
Генератор кода использует динамическое выделение памяти потому что размер Z
равно порогу динамического выделения памяти, 4000.
Если у вас есть Simulink Coder™, можно сгенерировать код С для этой модели. Затем вы видите, как генератор кода представляет динамически выделенные массивы.
Сконфигурируйте модель, чтобы использовать решатель фиксированного шага. В диалоговом окне Configuration Parameters, в панели Solver, под Solver selection:
Для Type выберите Fixed-step
.
Для Solver выберите discrete (no continuous states)
.
Сконфигурируйте модель, чтобы создать и использовать отчет генерации кода. В диалоговом окне Configuration Parameters, в панели 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
s.
Если у вас есть Embedded Coder®, можно настроить идентификаторы для emxArray
типы и служебные функции. Смотрите Управление форматом Идентификатора (Embedded Coder).