Localizable
пользовательский класс памятиДля сигналов, если это возможно, генерируют переменные, которые локальны для функций, а не в глобальном устройстве хранения данных. Генерация локальных переменных препятствует тому, чтобы генератор кода реализовал оптимизацию, которая удаляет эти переменные из сгенерированного кода. Локальные переменные улучшают наблюдаемость, удобочитаемость, и полезны в отладке сгенерированного кода.
Минимизация использования глобальных переменных при помощи локальных переменных взаимодействует с управлением использованием стека. Например, сложите размер, может определить количество локальных и глобальных переменных, которые генератор кода может выделить в сгенерированном коде. Для получения дополнительной информации смотрите, Настраивают Выделение Стекового пространства (Simulink Coder).
Модель rtwdemo_localizable_csc
содержит два сигнала, которые имеют Localizable
пользовательский класс памяти. В подсистеме Latching
сигнал с меткой Latch
имеет Localizable
пользовательский класс памяти. В подсистеме Debug
сигнал с меткой Debug
имеет Localizable
пользовательский класс памяти.
Localizable
Откройте модель.
model='rtwdemo_localizable_csc'; open_system(model);
Чтобы наблюдать спецификацию, для каждого сигнала, открывают диалоговое окно Signal Properties и выбирают вкладку Code Generation. Параметр Signal object class устанавливается на Simulink.Signal
. Параметр Storage class устанавливается на Localizable (Custom)
.
Создайте модель. Функция 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
.
Измените класс памяти сигнала от 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
кроме маркированных сигналов, глобальные переменные.
Удалите метки 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
находится на сигнале, который пересекает контур условно выполняемой подсистемы.