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

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

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

Задайте перечисления для блоков 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 state == sysMode.ON
    led = LEDcolor.GREEN;
else
    led = LEDcolor.RED;
end

Функции тулбокса MATLAB та поддержка перечисления

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

Похожие темы