exponenta event banner

Улучшение читаемости кода для функциональных блоков MATLAB

Требования к использованию оптимизации читаемости

Для использования оптимизации читаемости в коде необходимо иметь лицензию Embedded Coder ®. Эти оптимизации появляются только в коде, генерируемом для встроенного режима реального времени (ert) цель.

Примечание

Эти оптимизации не применяются к файлам MATLAB ®, вызываемым из функционального блока MATLAB.

Дополнительные сведения см. в разделе Настройка целевого файла системы.

Преобразование кода If-Elseif-Else в операторы Switch-Case

При создании кода для встроенных целей в реальном времени можно выбрать преобразование if-elseif-else логика решения для switch-case заявления. Это преобразование может повысить читаемость кода.

Например, когда функциональный блок MATLAB содержит длинный список условий, switch-case структура:

  • Сокращение использования скобок и фигурных скобок

  • Минимизация повторения в созданном коде

Как преобразовать код If-Elseif-Else в операторы Switch-Case

Следующая процедура описывает преобразование сгенерированного кода для функционального блока MATLAB из if-elseif-else кому switch-case заявления.

ШагЗадачаСсылка
1

Убедитесь, что блок соответствует правилам преобразования.

Проверка содержимого блока
2

Включите преобразование.

Включение преобразования
3

Создайте код для модели.

Создание кода для модели

Правила преобразования

Для выполнения преобразования должны быть сохранены следующие правила. LHS и RHS относятся соответственно к левой и правой сторонам состояния.

КонструкцияПравила, которым необходимо следовать
Функциональный блок MATLAB

В дополнение к условиям по умолчанию должно быть два или более уникальных условия.

Дополнительные сведения см. в разделе Как преобразование обрабатывает повторяющиеся условия.

Каждое условие

Должен проверять только равенство.

Необходимо использовать одну и ту же переменную или выражение для LHS.

Примечание

Можно сторнировать LHS и RHS.

Каждый LHS

Должна быть единственной переменной или выражением, а не составным оператором.

Не может быть константой.

Должен иметь целочисленный или перечисляемый тип данных.

Не должно иметь побочных эффектов при моделировании.

Например, LHS может считывать, но не записывать глобальные переменные.

Каждый RHS

Должно быть константой.

Должен иметь целочисленный или перечисляемый тип данных.

Как преобразование обрабатывает повторяющиеся условия

Если функциональный блок MATLAB имеет повторяющиеся условия, преобразование сохраняет только первое условие. Созданный код отбрасывает другие экземпляры повторяющихся условий.

После удаления дубликатов должны существовать два или более уникальных условия. В противном случае преобразование не выполняется, и созданный код содержит экземпляры повторяющихся условий.

В следующих примерах показано, как преобразование обрабатывает повторяющиеся условия.

Пример сгенерированного кодаКод после преобразования
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
}

Не изменяется, поскольку существует только одно уникальное условие

Пример преобразования кода для логики принятия решений If-Elseif-Else в операторы Switch-Case

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

Проверка содержимого блока

Убедитесь, что блок соответствует правилам в окне «Правила преобразования».

КонструкцияКак конструкция следует правилам
Функциональный блок MATLAB

В дополнение к условиям по умолчанию существуют пять уникальных условий:

  • (type == Controller.P)

  • (type == Controller.I)

  • (type == Controller.PD)

  • (type == Controller.PI)

  • (type == Controller.PID)

Каждое условие

Каждое условие:

  • Проверка равенства

  • Использует тот же вход для LHS

Каждый LHS

Каждый LHS:

  • Содержит одну переменную

  • Является входом в блок и поэтому не является константой

  • Имеет перечисляемый тип Controller, которые определяются в Controller.m на пути MATLAB

  • Не влияет на моделирование

Каждый RHS

Каждый RHS:

  • Является перечисляемым значением и, следовательно, константой

  • Имеет перечисляемый тип Controller

Включение преобразования

  1. Откройте диалоговое окно «Параметры конфигурации».

  2. На панели «Создание кода» выберите ert.tlc для целевого файла системы.

    На этом шаге задается встроенный целевой объект в реальном времени для модели.

  3. На панели Создание кода > Стиль кода установите флажок Преобразовать шаблоны if-elseif-else в операторы switch-case.

    Совет

    Это преобразование работает на основе модели. Если этот флажок установлен, преобразование применяется к:

    • Функциональные блоки MATLAB в модели

    • Функции MATLAB в диаграммах Stateflow ® этой модели

    • Блок-схемы в блок-схемах Stateflow этой модели

    Дополнительные сведения см. в разделе Улучшение читаемости кода для блок-схем.

Создание кода для модели

В окне модели нажмите клавиши CTRL + B.

Код для функционального блока MATLAB использует 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 появляется только один раз, сводя к минимуму повторение в коде.

Связанные темы