Сгенерируйте локальные переменные с Localizable Класс памяти

Для сигналов, если это возможно, сгенерируйте переменные, которые локальны для функций, а не в глобальном хранилище. Генерация локальных переменных препятствует генератору кода реализовывать оптимизацию, которая удаляет эти переменные из сгенерированного кода. Локальные переменные улучшают наблюдаемость, читаемость и полезны при отладке сгенерированного кода.

Минимизация использования глобальных переменных при помощи локальных переменных взаимодействует с управлением использованием стека. Для примера размер стека может определить количество локальных и глобальных переменных, которые генератор кода может выделить в сгенерированном коде. Для получения дополнительной информации см. раздел «Настройка распределения пространства стека».

Пример модели

Модель rtwdemo_localizable_csc содержит два сигнала, которые имеют Localizable класс памяти. В Latching подсистема, сигнал с меткой Latch имеет Localizable класс памяти. В Debug подсистема, сигнал с меткой Debug имеет Localizable класс памяти.

Сгенерируйте код с Localizable Класс памяти

  1. Откройте модель.

    model='rtwdemo_localizable_csc';
    open_system(model);
  2. Чтобы наблюдать за спецификацией, откройте редактор Отображения. На вкладке C Code выберите Code Interface > Individual Element Code Mappings.

  3. На вкладке Signals/States разверните Signals. Класс памяти для сигналов Latch и Debug установлен на Localizable.

  4. Сгенерируйте и просмотрите код. The Debug_b функция содержит этот код:

    static void Debug_b(const real_T rtu_In1[6], const real_T rtu_In2[6], real_T
                        rtd_A[6])
    {
      real_T Debug;
      int32_T i;
      for (i = 0; i < 6; i++) {
        Debug = rtu_In1[i] * rtu_In2[i];
        rtd_A[i] += Debug;
      }
    }

    The Latching функция содержит этот код:

    static void Latching(const real_T rtu_In1[36], real_T rty_Out1[6], real_T
                         rty_Out2[6], real_T rtd_A[6])
    {
      real_T Latch[6];
      int32_T i;
      int32_T i_0;
      for (i = 0; i < 6; i++) {
        Latch[i] = rtd_A[i];
        rty_Out2[i] = -Latch[i];
      }
    
      for (i = 0; i < 6; i++) {
        rty_Out1[i] = 0.0;
        for (i_0 = 0; i_0 < 6; i_0++) {
          rty_Out1[i] += rtu_In1[6 * i_0 + i] * Latch[i_0];
        }
      }
    }

    Обе функции содержат переменные для хранения промежуточных значений. The Debug_b функция содержит переменную Debug. The Latching функция содержит переменную Latch.

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

  1. Измените класс памяти сигнала с Localizable на ExportToFile. В редакторе Отображения для каждого сигнала установите класс памяти равным ExportToFile.

  2. Сгенерируйте и просмотрите код. The rtwdemo_localizable_csc.c файл содержит следующие два объявления глобальных переменных:

    real_T Debug[6];
    real_T Latch[6];

    The Debug_b функция содержит этот код:

    static void Debug_b(const real_T rtu_In1[6], const real_T rtu_In2[6], real_T
                        rtd_A[6])
    {
      int32_T i;
      for (i = 0; i < 6; i++) {
        Debug[i] = rtu_In1[i] * rtu_In2[i];
        rtd_A[i] += Debug[i];
      }
    }

    The Latching функция содержит этот код:

    static void Latching(const real_T rtu_In1[36], real_T rty_Out1[6], real_T
                         rty_Out2[6], real_T rtd_A[6])
    {
      int32_T i;
      int32_T i_0;
      for (i = 0; i < 6; i++) {
        Latch[i] = rtd_A[i];
        rty_Out2[i] = -Latch[i];
      }
    
      for (i = 0; i < 6; i++) {
        rty_Out1[i] = 0.0;
        for (i_0 = 0; i_0 < 6; i_0++) {
          rty_Out1[i] += rtu_In1[6 * i_0 + i] * Latch[i_0];
        }
      }
    }

    Читаемость и наблюдаемость кода те же, что и со Localizable спецификация класса памяти, за исключением маркированных сигналов, являются глобальными переменными.

  3. Удалите Debug и Latch сигналы от отображений кода. В редакторе Отображения выберите каждый сигнал и нажмите кнопку Remove Signal.

  4. Сохраните модель.

  5. Сгенерируйте и проверьте код. The Debug_b функция содержит этот код:

    static void Debug(const real_T rtu_In1[6], const real_T rtu_In2[6], real_T
                      rtd_A[6])
    {
      int32_T i;
      for (i = 0; i < 6; i++) {
        rtd_A[i] += rtu_In1[i] * rtu_In2[i];
      }
    }

    The Latching функция содержит этот код:

    static void Latching(const real_T rtu_In1[36], real_T rty_Out1[6], real_T
                         rty_Out2[6], real_T rtd_A[6])
    {
      int32_T i;
      int32_T i_0;
      for (i = 0; i < 6; i++) {
        rty_Out2[i] = -rtd_A[i];
        rty_Out1[i] = 0.0;
        for (i_0 = 0; i_0 < 6; i_0++) {
          rty_Out1[i] += rtu_In1[6 * i_0 + i] * rtd_A[i_0];
        }
      }
    }

    Без Localizable или ExportToFile классы памяти, генератор кода удаляет Debug и Latch переменные. Без этих переменных читаемость и наблюдаемость сгенерированного кода уменьшается.

Дополнительная информация

  • Генератор кода для локализации сигналов с Localizable спецификация класса памяти, выберите параметр конфигурации модели Enable Local Block Outputs. Этот параметр включен по умолчанию.

  • Можно задать то же Localizable класс памяти на двух сигналах, которые находятся в разных переиспользуемых подсистемах. Поэтому можно создать библиотечный блок из переиспользуемой подсистемы с Localizable спецификация класса памяти.

  • Генератор кода не создает локальную переменную для сигнала, который должен оставаться глобальным. Несколько случаев, когда генератор кода не может локализовать сигнал:

    • Входной и выходной сигналы неприменяемой подсистемы, даже когда параметр Function interface установлен в Allow arguments (Optimized).

    • Сигнал удерживает состояние, потому что его приемник и блоки привода выполняются с различными скоростями.

    • Localizable спецификация находится на сигнале, который пересекает контур условно выполняемой подсистемы.

Похожие темы