Сгенерируйте локальные переменные с 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. Удалите метки Latch и Debug. Создайте модель. Функция 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.

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

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

Похожие темы