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

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

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

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

Динамическое выделение памяти можно использовать только для массивов, которые локальны по отношению к блоку MATLAB Function.

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

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

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

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

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

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

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

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

  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. В диалоговом окне Параметров конфигурации в категории Simulation Target > Advanced parameters убедитесь, что:

  • Установлен флажок Dynamic memory allocation in MATLAB functions.

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

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

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

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

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

Симуляция должна использовать динамическое выделение памяти для 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. В диалоговом окне Параметров конфигурации, в категории Simulation Target > Advanced parameters, установите параметр Dynamic memory allocation threshold in MATLAB functions равным 4000.

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

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

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

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

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

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

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

  2. Сконфигурируйте модель, чтобы создать и использовать отчет генерации кода. В диалоговом окне Параметров конфигурации на панели 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с.

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

Похожие темы