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

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

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

Модель в качестве примера

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

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

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

    model='rtwdemo_localizable_csc';
    open_system(model);
  2. Чтобы наблюдать спецификацию, для каждого сигнала, открывают диалоговое окно Signal Properties и выбирают вкладку Code Generation. Параметр Signal object class устанавливается на Simulink.Signal. Параметр Storage class устанавливается на Localizable (Custom).

  3. Создайте модель. 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. Для каждого сигнала откройте диалоговое окно Signal Properties. На вкладке Code Generation, для параметра Storage class, выбирают ExportToFile. 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 спецификацией класса памяти кроме помеченных сигналов являются глобальные переменные.

  2. Удалите Debug и Latch метки. Создайте модель. 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 спецификация класса памяти, в диалоговом окне Configuration Parameters, необходимо выбрать Разрешение Локального Блока Выходного параметра. Этот параметр включен по умолчанию.

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

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

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

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

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

Похожие темы