Чтобы использовать оптимизацию удобочитаемости в вашем коде, у вас должна быть лицензия Embedded Coder®. Эта оптимизация появляется только в коде, что вы генерируете для встроенного в реальном времени (ert
) цель.
Эта оптимизация не применяется к файлам MATLAB®, которые вы вызываете от блока MATLAB function.
Для получения дополнительной информации смотрите, Конфигурируют Системный Конечный файл (Embedded Coder) и Стиль Кода системы управления (Embedded Coder).
Когда вы генерируете код для встроенных целей в реальном времени, можно принять решение преобразовать логику решения if-elseif-else
в операторы switch-case
. Это преобразование может улучшить удобочитаемость кода.
Например, когда блок MATLAB function содержит длинный список условий, структуры switch-case
:
Уменьшает использование круглых скобок и фигурных скобок
Минимизирует повторение в сгенерированном коде
Следующая процедура описывает, как преобразовать сгенерированный код для блока MATLAB function от if-elseif-else
до операторов switch-case
.
Шаг | Задача | Ссылка |
---|---|---|
1 | Проверьте, что ваш блок следует правилам для преобразования. | Проверка содержимого блока |
2 | Включите преобразование. | Включение преобразования |
3 | Сгенерируйте код для своей модели. | Генерация кода для модели |
Для преобразования, чтобы произойти, следующие правила должны содержать. LHS и RHS относятся к левой стороне и правой стороне условия, соответственно.
Создать | Правила следовать |
---|---|
Блок MATLAB function | Должен иметь два или больше уникальных условия, в дополнение к значению по умолчанию. Для получения дополнительной информации смотрите Как Условия Копии Указателей Преобразования. |
Каждое условие | Должен протестировать равенство только. |
Должен использовать ту же переменную или выражение для LHS. ПримечаниеМожно инвертировать LHS и RHS. | |
Каждый LHS | Должна быть одна переменная или выражение, не составной оператор. |
Не может быть константа. | |
Должен иметь целое число или перечисленный тип данных. | |
Не может иметь никаких побочных эффектов на симуляции. Например, LHS может читать из, но не записать в глобальные переменные. | |
Каждый RHS | Должна быть константа. |
Должен иметь целое число или перечисленный тип данных. |
Если блок MATLAB function имеет дублирующиеся условия, преобразование сохраняет только первое условие. Сгенерированный код отбрасывает все другие экземпляры дублирующихся условий.
После удаления копий должны существовать два или больше уникальных условия. В противном случае никакое преобразование не происходит, и сгенерированный код содержит все экземпляры дублирующихся условий.
Следующие примеры показывают, как преобразование обрабатывает дублирующиеся условия.
Пример сгенерированного кода | Код после преобразования |
---|---|
if (x == 1) { block1 } else if (x == 2) { block2 } else if (x == 1) { // duplicate block3 } else if (x == 3) { block4 } else if (x == 1) { // duplicate block5 } else { block6 } | switch (x) { case 1: block1; break; case 2: block2; break; case 3: block4; break; default: block6; break; } |
if (x == 1) { block1 } else if (x == 1) { // duplicate block2 } else { block3 } | Никакое изменение, потому что только одно уникальное условие существует |
Предположим, что у вас есть следующая модель с блоком MATLAB function. Примите, что типом выходных данных является double
, и типом входных данных является Controller
, перечислимый тип, который вы задаете. (Для получения дополнительной информации смотрите Генерацию кода для Перечислений.)
Блок содержит следующий код:
function system = fcn(type) %#codegen if (type == Controller.P) system = 0; elseif (type == Controller.I) system = 1; elseif (type == Controller.PD) system = 2; elseif (type == Controller.PI) system = 3; elseif (type == Controller.PID) system = 4; else system = 10; end
Определение перечислимого типа в Controller.m
:
classdef Controller < Simulink.IntEnumType enumeration P(0) I(1) PD(2) PI(3) PID(4) UNKNOWN(10) end end
Если вы генерируете код для встроенной цели в реальном времени с помощью настроек по умолчанию, вы видите что-то вроде этого:
if (if_to_switch_eml_blocks_U.In1 == P) { /* '<S1>:1:4' */ /* '<S1>:1:5' */ if_to_switch_eml_blocks_Y.Out1 = 0.0; } else if (if_to_switch_eml_blocks_U.In1 == I) { /* '<S1>:1:6' */ /* '<S1>:1:7' */ if_to_switch_eml_blocks_Y.Out1 = 1.0; } else if (if_to_switch_eml_blocks_U.In1 == PD) { /* '<S1>:1:8' */ /* '<S1>:1:9' */ if_to_switch_eml_blocks_Y.Out1 = 2.0; } else if (if_to_switch_eml_blocks_U.In1 == PI) { /* '<S1>:1:10' */ /* '<S1>:1:11' */ if_to_switch_eml_blocks_Y.Out1 = 3.0; } else if (if_to_switch_eml_blocks_U.In1 == PID) { /* '<S1>:1:12' */ /* '<S1>:1:13' */ if_to_switch_eml_blocks_Y.Out1 = 4.0; } else { /* '<S1>:1:15' */ if_to_switch_eml_blocks_Y.Out1 = 10.0; }
Переменная LHS if_to_switch_eml_blocks_U.In1
появляется многократно в сгенерированном коде.
По умолчанию переменные, которые появляются в блоке, не сохраняют свои имена в сгенерированном коде. Измененные идентификаторы гарантируют, что никакие конфликты по совпадению имен не происходят.
Комментарии трассируемости появляются между каждым набором маркерами */
и /*
. Чтобы узнать больше о трассируемости, смотрите Трассируемость Использования в блоках MATLAB function.
Проверяйте, что блок следует всем правилам в Правилах для Преобразования.
Создать | Как построение следует правилам |
---|---|
Блок MATLAB function | Пять уникальных условий существуют, в дополнение к значению по умолчанию:
|
Каждое условие | Каждое условие:
|
Каждый LHS | Каждый LHS:
|
Каждый RHS | Каждый RHS:
|
Откройте диалоговое окно Configuration Parameters.
В панели Code Generation выберите ert.tlc
для System target file.
Этот шаг задает встроенную цель в реальном времени для вашей модели.
В Code Generation> панель Code Style, установите флажок Convert if-elseif-else patterns to switch-case statements.
Это преобразование работает над на базис модели. Если вы устанавливаете этот флажок, преобразование применяется:
Все блоки MATLAB function в модели
Функции MATLAB во всех графиках Stateflow® той модели
Блок-схемы во всех диаграммах Stateflow той модели
Для получения дополнительной информации смотрите, Улучшают Удобочитаемость Кода для Блок-схем (Embedded Coder).
В окне модели нажмите Ctrl+B.
Код для блока MATLAB function использует операторы switch-case
вместо кода if-elseif-else
:
switch (if_to_switch_eml_blocks_U.In1) { case P: /* '<S1>:1:4' */ /* '<S1>:1:5' */ if_to_switch_eml_blocks_Y.Out1 = 0.0; break; case I: /* '<S1>:1:6' */ /* '<S1>:1:7' */ if_to_switch_eml_blocks_Y.Out1 = 1.0; break; case PD: /* '<S1>:1:8' */ /* '<S1>:1:9' */ if_to_switch_eml_blocks_Y.Out1 = 2.0; break; case PI: /* '<S1>:1:10' */ /* '<S1>:1:11' */ if_to_switch_eml_blocks_Y.Out1 = 3.0; break; case PID: /* '<S1>:1:12' */ /* '<S1>:1:13' */ if_to_switch_eml_blocks_Y.Out1 = 4.0; break; default: /* '<S1>:1:15' */ if_to_switch_eml_blocks_Y.Out1 = 10.0; break; }
Операторы switch-case
предоставляют следующие преимущества, чтобы улучшить удобочитаемость:
Код уменьшает использование круглых скобок и фигурных скобок.
Переменная LHS if_to_switch_eml_blocks_U.In1
появляется только однажды, минимизируя повторение в коде.