В этом примере показано, как задать, блокируют выход как локальные переменные. Генератор кода может потенциально снова использовать эти локальные переменные в сгенерированном коде. Блок Declaring выход как локальные переменные сохраняет потребление ROM. Многократное использование локальных переменных сохраняет потребление RAM, уменьшает копии данных и увеличивает скорость выполнения.
Use Inport, Outport, Gain и 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
содержите выходные параметры блоков Gain. Локальная переменная 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
и связанная копия данных не находится в сгенерированном коде.
Включите локальному блоку выходные параметры