Этот пример показывает, как задать, блокируют вывод как локальные переменные. Генератор кода может потенциально снова использовать эти локальные переменные в сгенерированном коде. Блок Declaring вывод как локальные переменные сохраняет потребление ROM. Многократное использование локальных переменных сохраняет потребление RAM, уменьшает копии данных и увеличивает скорость выполнения.
Используйте Inport, Выходной порт, Усиление и блоки switch, чтобы создать следующую модель. В этом примере модель называют local_variable_ex
.
Для G2
, открытого диалоговое окно Gain Block Parameters. Введите значение 2
.
Для G1
введите значение 3
.
Для блока switch откройте диалоговое окно Block Parameters. Для параметра Criteria for passing first input выберите u2>=Threshold
.
Откройте диалоговое окно Model Configuration Parameters. Выберите панель Solver. Для параметра Type выберите Fixed-step
.
Очистите Configuration Parameters> параметр Signal storage reuse.
Выберите панель Code Generation > Report и выберите Create code generation report.
Выберите панель Code Generation. Выберите Generate code only, и затем, в окне модели, нажмите Ctrl+B. Когда генерация кода завершена, отчет генерации кода HTML появляется.
В отчете генерации кода выберите раздел local_variable_ex.c
и просмотрите образцовую ступенчатую функцию. Блок Gain выходные параметры является глобальными переменными local_variable_ex_B.G2
и local_variable_ex_B.G1
.
/* Model step function */ void local_variable_ex_step(void) { /* Switch: '<Root>/Switch' incorporates: * Inport: '<Root>/In1' */ if (local_variable_ex_U.In1 >= 0.0) { /* Gain: '<Root>/G2' */ local_variable_ex_B.G2 = 2.0 * local_variable_ex_U.In1; /* Outport: '<Root>/Out1' */ local_variable_ex_Y.Out1 = local_variable_ex_B.G2; } else { /* Gain: '<Root>/G1' */ local_variable_ex_B.G1 = 3.0 * local_variable_ex_U.In1; /* Outport: '<Root>/Out1' */ local_variable_ex_Y.Out1 = local_variable_ex_B.G1; } /* End of Switch: '<Root>/Switch' */
Выберите Configuration Parameters> параметр Signal Storage Reuse. Signal Storage Reuse включает следующие параметры оптимизации:
Enable local block outputs
Reuse local block outputs
Eliminate superfluous local variables (expression folding)
Очистите Reuse local block outputs и Eliminate superfluous local variables (expression folding).
Сгенерируйте код и просмотрите образцовую ступенчатую функцию. Существует три локальные переменные в образцовой ступенчатой функции, потому что вы выбрали параметр оптимизации Enable Local Block Outputs. Локальные переменные rtb_G2
и rtb_G1
содержат выходные параметры блоков Усиления. Локальная переменная rtb_Switch
содержит вывод блока switch.
/* Model step function */ void local_variable_ex_step(void) { real_T rtb_Switch; real_T rtb_G2; real_T rtb_G1; /* Switch: '<Root>/Switch' incorporates: * Inport: '<Root>/In1' */ if (local_variable_ex_U.In1 >= 0.0) { /* Gain: '<Root>/G2' */ rtb_G2 = 2.0 * local_variable_ex_U.In1; rtb_Switch = rtb_G2; } else { /* Gain: '<Root>/G1' */ rtb_G1 = 3.0 * local_variable_ex_U.In1; rtb_Switch = rtb_G1; } /* End of Switch: '<Root>/Switch' */ /* Outport: '<Root>/Out1' */ local_variable_ex_Y.Out1 = rtb_Switch;
Выберите Configuration Parameters> параметр Reuse local block outputs.
Сгенерируйте код. В разделе local_variable_ex.c
просмотрите образцовую ступенчатую функцию. Существует одна локальная переменная, rtb_G2
, что генератор кода использует три раза.
/* Model step function */ void local_variable_ex_step(void) { real_T rtb_G2; /* Switch: '<Root>/Switch' incorporates: * Inport: '<Root>/In1' */ if (local_variable_ex_U.In1 >= 0.0) { /* Gain: '<Root>/G2' */ rtb_G2 = 2.0 * local_variable_ex_U.In1; } else { /* Gain: '<Root>/G1' */ rtb_G2 = 3.0 * local_variable_ex_U.In1; } /* End of Switch: '<Root>/Switch' */ /* Outport: '<Root>/Out1' */ local_variable_ex_Y.Out1 = rtb_G2;
Дополнительная временная переменная rtb_Switch
и связанная копия данных не находится в сгенерированном коде.
Включите локальному блоку выходные параметры