В этом примере показано, как задать выход блоков как локальные переменные. Генератор кода может потенциально повторно использовать эти локальные переменные в сгенерированном коде. Объявление выхода блока как локальных переменных сохраняет потребление ПЗУ. Повторное использование локальных переменных сохраняет потребление оперативной памяти, уменьшает копии данных и увеличивает скорость выполнения.
Используйте Inport, Outport, Gain и Switch блоки для создания следующей модели. В этом примере модель называется local_variable_ex
.
Для G2
, откройте диалоговое окно Gain Параметры Блоков. Введите значение 2
.
Для G1
, введите значение 3
.
Для блока Switch откройте диалоговое окно Параметров блоков. Для параметра 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
и связанная копия данных не находится в сгенерированном коде.
Включите выходы локальных блоков