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