exponenta event banner

Создание локальных переменных с помощью Localizable Класс хранения

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

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

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

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

Создать код с помощью Localizable Класс хранения

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

    model='rtwdemo_localizable_csc';
    open_system(model);
  2. Чтобы соблюдать спецификацию, откройте редактор Сопоставления кода (Code Mappings). На вкладке Код C выберите Интерфейс кода > Сопоставления кодов отдельных элементов.

  3. На вкладке Signals/States (Сигналы/Состояния) разверните узел Signals (Сигналы). Класс хранения сигналов Latch и Debug имеет значение Localizable.

  4. Создайте и просмотрите код. 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;
      }
    }

    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];
        }
      }
    }

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

Создание кода без локализованного класса хранения

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

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

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

    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];
      }
    }

    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. Создайте и просмотрите код. 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];
      }
    }

    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 спецификация - на сигнале, пересекающем границу условно выполняемой подсистемы.

Связанные темы