Используйте динамическое выделение памяти для массивов Переменного Размера в блоке MATLAB function

Этот пример показывает, как использовать динамическое выделение памяти для массивов переменного размера в блоке MATLAB function. Динамическое выделение памяти выделяет память на куче по мере необходимости во время выполнения, вместо того, чтобы выделить память статически на стеке. Динамическое выделение памяти выгодно когда:

  • Вы не знаете верхнюю границу массива.

  • Вы не хотите выделять память на стеке для больших массивов.

Можно использовать динамическое выделение памяти только для массивов, которые локальны для блока MATLAB function.

Вы не можете использовать динамическое выделение памяти для:

  • Сигналы ввода и вывода. Сигналы ввода и вывода переменного размера должны иметь верхнюю границу.

  • Параметры или глобальные переменные. Параметры и глобальные переменные должны быть фиксированным размером.

  • Поля массивов шины A. Массивы шины A не могут иметь полей переменного размера.

  • Свойства дискретного состояния Системных объектов сопоставлены с блоком MATLAB System.

Создайте модель

Создайте эту модель Simulink, которая имеет блок MATLAB function с неограниченным массивом переменного размера.

  1. Создайте модель mymodel Simulink®.

  2. Добавьте блок MATLAB function в модель.

  3. В блоке MATLAB function добавьте этот код:

    function s = myfcn(n)
    Z = rand(1,n);
    s = sum(Z);
    end
  4. Добавьте блок Constant слева от блока MATLAB function.

  5. Добавьте блок Outport справа от блока MATLAB function.

  6. Соедините блоки.

Сконфигурируйте модель для динамического выделения памяти

Убедитесь, что вы конфигурируете модель, чтобы использовать динамическое выделение памяти для массивов переменного размера в блоках MATLAB function. В диалоговом окне Configuration Parameters, в категории Simulation Target > Advanced parameters, убеждаются что:

  • Флажок Dynamic memory allocation in MATLAB functions устанавливается.

  • Параметр Dynamic memory allocation threshold in MATLAB functions имеет значение по умолчанию 65536.

Моделируйте модель Используя динамическое выделение памяти

  1. Моделируйте модель.

  2. В Редакторе функции MATLAB, чтобы открыть отчет функции MATLAB, нажимают View Report.

    Вкладка переменных показывает, что Z является 1 на:? массив. Двоеточие (:) указывает, что второе измерение является переменным размером. Вопросительный знак (?) указывает, что второе измерение неограниченно.

Симуляция должна использовать динамическое выделение памяти для Z, потому что второе измерение Z не имеет верхней границы.

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

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

Динамической памяти стоили производительности во время выполнения. Путем управления его использованием можно улучшить скорость выполнения.

Если вы делаете Z ограниченным массивом переменного размера с размером, который больше, чем порог, генератор кода использует динамическое выделение памяти для Z. Например:

  1. В mymodel измените myfcn так, чтобы Z имел верхнюю границу 500.

    function s = myfcn(n)
    assert(n < 500);
    Z = rand(1,n);
    s = sum(Z);
    end

  2. Моделируйте модель.

    В отчете функции MATLAB вы видите, что Z является 1:500 массивом. Это - переменный размер с верхней границей 500.

  3. Понизьте динамическое выделение памяти к значению, меньше чем или равному 4000, который является размером, в байтах, Z. В диалоговом окне Configuration Parameters, в категории Simulation Target > Advanced parameters, устанавливает параметр Dynamic memory allocation threshold in MATLAB functions на 4 000.

  4. Моделируйте модель.

    Генератор кода использует динамическое выделение памяти, потому что размер Z равен порогу динамического выделения памяти, 4000.

Сгенерируйте код С, который использует динамическое выделение памяти

Если у вас есть Simulink Coder™, можно сгенерировать код С для этой модели. Затем вы видите, как генератор кода представляет динамически выделенные массивы.

  1. Сконфигурируйте модель, чтобы использовать решатель фиксированного шага. В диалоговом окне Configuration Parameters, в панели Solver, под Solver selection:

    • Для Type выберите Fixed-step.

    • Для Solver выберите discrete (no continuous states).

  2. Сконфигурируйте модель, чтобы создать и использовать отчет генерации кода. В диалоговом окне Configuration Parameters, в панели Code Generation > Report, выбирают Create code generation report и Open report automatically.

  3. Отредактируйте код в блоке MATLAB function так, чтобы это выглядело так код:

    function s = myfcn(n)
    Z = rand(1,n);
    s = sum(Z);
    end

    Z является неограниченным массивом переменного размера.

  4. Убедитесь, что модель сконфигурирована для динамического выделения памяти:

    • Флажок Dynamic memory allocation in MATLAB functions устанавливается.

    • Параметр Dynamic memory allocation threshold in MATLAB functions имеет значение по умолчанию 65536.

  5. Создайте модель.

  6. В отчете генерации кода откройте mymodel.c. Можно сказать, что генератор кода использовал динамическое выделение памяти для Z, потому что вы видите, что emxArray вводит emxArray_real_T_mymodel_T и служебные функции emxArray, такие как mymodel_emxInit_real_T. Генератор кода использует тип emxArray для переменных, память которых динамически выделяется. Сгенерированный код использует служебные функции emxArray, чтобы управлять emxArray s.

Если у вас есть Embedded Coder®, можно настроить идентификаторы для типов emxArray и служебных функций. Смотрите Управление форматом Идентификатора (Embedded Coder).

Похожие темы