Генерация кода для перечислений

Перечисления представляют фиксированный набор именованных значений. Перечисления помогают сделать ваш MATLAB® код и сгенерированный код C/C + + более читаемый. Для примера сгенерированный код может протестировать равенство с таким кодом, как if (x == Red) вместо использования strcmp. Чтобы сгенерировать код C/C + +, вы должны иметь Simulink® Coder™.

Когда вы используете перечисления в MATLAB Function блокируйте, придерживайтесь следующих ограничений:

  • Вызовы методов классов перечисления не поддерживаются.

  • Передача строк или векторов символов конструкторам перечислений не поддерживается.

  • Для блока MATLAB Function можно импортировать внешне определенный тип при помощи Simulink.defineIntEnumType или можно задать класс перечисления. Класс перечисления должен быть выведен из одного из следующих базовых типов: Simulink.IntEnumType, int8, uint8, int16, uint16, или int32. См. «Определение перечислений для блоков MATLAB function».

  • Для перечислений можно использовать только ограниченный набор операций. См. «Разрешенные операции с перечислениями».

  • Используйте перечисления с функциями, которые поддерживают перечисленные типы для генерации кода. Смотрите Тулбокс функций MATLAB, которые Поддержка перечисления.

Задайте перечисления для блоков MATLAB Function

Перечисления для блоков MATLAB Function можно задать двумя способами:

  • Чтобы импортировать определенное извне перечисление, используйте Simulink.defineIntEnumType функция. См. раздел «Импорт перечислений, заданных извне в MATLAB».

  • В файле определения класса задайте перечисленный тип. Для примера:

    classdef PrimaryColors < Simulink.IntEnumType
        enumeration
            Red(1),
            Blue(2),
            Yellow(4)
        end
    end

Если вы задаете перечисленный тип в файле определения класса, класс должен быть выведен из одного из следующих базовых типов: Simulink.IntEnumType, int8, uint8, int16, uint16, или int32. Затем можно обменяться перечисленными данными между блоками MATLAB Function и другими блоками Simulink в модели.

Если вы используете Simulink Coder для генерации кода C/C + +, можно использовать базовый тип класса перечисления, чтобы управлять размером перечисляемого типа в сгенерированном коде C/C + +. Вы можете:

  • Представьте перечисленный тип как целое число с фиксированным размером, которое переносится в различные целевые объекты.

  • Уменьшите использование памяти.

  • Интерфейс с унаследованным кодом.

  • Соответствовать стандартам компании.

Базовый тип определяет представление перечисляемого типа в сгенерированном коде C/C + +.

Если базовый тип Simulink.IntEnumTypeгенератор кода создает перечисляемый тип C. Примите во внимание следующее определение перечисленного типа MATLAB:

classdef LEDcolor < Simulink.IntEnumType
    enumeration
        GREEN(1),
        RED(2)
    end
end

Это перечисленное определение типа приводит к следующему коду С:

typedef enum {
  GREEN = 1,                          
  RED
} LEDcolor;
Для встроенных целочисленных базовых типов генератор кода производит typedef оператор для перечисляемых типа и #define операторы для перечисленных значений. Примите во внимание следующее определение перечисленного типа MATLAB:
classdef LEDcolor < int16
    enumeration
        GREEN(1),
        RED(2)
    end
 end
Это перечисленное определение типа приводит к следующему коду С:
typedef int16_T LEDcolor;

#define GREEN                          ((LEDcolor)1)             
#define RED                            ((LEDcolor)2)

Для настройки кода, сгенерированного для перечисляемого типа, смотрите Настроить перечисление Simulink.

Разрешенные операции с перечислениями

Для генерации кода вы ограничены операциями с перечислениями, перечисленными в этой таблице.

ОперацияПримерПримечания

оператор назначения: =

xon = LEDcolor.GREEN
xoff = LEDcolor.RED

реляционные операторы: < > <= >= == ~=

xon == xoff

Генерация кода не поддерживает использование == или ~= чтобы проверить равенство между представителем перечисления и строковыми массивами, символьным массивом или массивом ячеек символьных массивов.

операция приведения

double(LEDcolor.RED)

преобразование в символьный массив или строку

y = char(LEDcolor.RED);
y1 = cast(LEDcolor.RED,'char');
y2 = string(LEDcolor.RED);

  • Можно преобразовать только скалярные перечисления во время компиляции. Например, этот код запускается в MATLAB, но вызывает ошибку в генерации кода:

    y2 = string(repmat(LEDcolor.RED,1,2));
  • Генератор кода сохраняет имена перечислений, когда входы преобразования являются постоянными. Для примера рассмотрим это перечисленное определение типа:

    classdef AnEnum < int32
        enumeration
            zero(0),
            two(2),
            otherTwo(2)
        end
    end

    Сгенерированный код создает "two" для

    y = string(AnEnum.two)
    и "otherTwo" для
    y = string(AnEnum.otherTwo)

операция индексации

m = [1 2]
n = LEDcolor(m)
p = n(LEDcolor.GREEN)

управляйте операторами потока: if, switch, while

if state == sysMode.ON
    led = LEDcolor.GREEN;
else
    led = LEDcolor.RED;
end

MATLAB Тулбокса функции, которые Поддержка перечисления

Для генерации кода можно использовать перечисления с этими функциями тулбокс:

Похожие темы