exponenta event banner

Выбор формата массива для матриц в сгенерированном коде

При создании кода из диаграммы Stateflow ®, использующей C в качестве языка действий, можно указать макет массива для матриц. Например, рассмотрим следующую матрицу :

По умолчанию генератор кода использует компоновку «основной столбец» для выравнивания матрицы в виде одномерного массива. Массив хранится в памяти с такой компоновкой:

{1, 4, 2, 5, 3, 6}
При выборе основного макета строки генератор кода выравнивает матрицу и сохраняет ее в памяти с помощью следующей компоновки:
{1, 2, 3, 4, 5, 6}
Если используется Embedded Coder ®, можно сохранить многомерность локальных данных Stateflow, предотвратить их распрямление и реализовать матрицу в виде двумерного массива с помощью следующего расположения:
{{1, 2, 3}, {4, 5, 6}}
Компоновка основных строк и многомерных массивов может облегчить интеграцию с внешним кодом. Дополнительные сведения см. в разделах Создание кода матриц и массивов (Simulink Coder) и Сохранение размеров многомерных массивов (Embedded Coder).

Компоновка столбца - основной массив

По умолчанию параметр конфигурации Array Layout для модели Simulink ® имеет значениеColumn-Major. При нажатии клавиши Ctrl-B генератор кода распрямляет все матричные данные в одномерные массивы, размещая их содержимое в основном макете столбца.

Например, эта диаграмма Stateflow содержит локальные данные x размера [2 3]. Действия состояния индексируют элементы в x по номеру строки и столбца.

При создании кода файл sf_matrix_layout.c реализует локальные данные x в макете «основной столбец» со следующими строками кода:

...
sf_matrix_layout_DW.x[0] = 1.0;
sf_matrix_layout_DW.x[2] = 2.0;
sf_matrix_layout_DW.x[4] = 3.0;
sf_matrix_layout_DW.x[1] = 4.0;
sf_matrix_layout_DW.x[3] = 5.0;
sf_matrix_layout_DW.x[5] = 6.0;
...

Созданный код относится к элементам x используя только один индекс.

Макет главного массива строк

Компоновка основных строк может повысить производительность определенных алгоритмов. Например, см. раздел Алгоритм интерполяции для компоновки главного массива строк (встроенный кодер).

Чтобы создать код, использующий макет основного массива строк, выполните следующие действия.

  1. Откройте диалоговое окно Параметры конфигурации модели (Model Configuration Parameters).

  2. На панели «Создание кода» > «Интерфейс» задайте для параметра «Макет массива» значение Row-Major.

  3. Нажмите Ctrl + B.

При выборе основного макета строки для предыдущего примера файл sf_matrix_layout.c реализует локальные данные x с этими строками кода:

  ...
  sf_matrix_layout_DW.x[0] = 1.0;
  sf_matrix_layout_DW.x[1] = 2.0; 
  sf_matrix_layout_DW.x[2] = 3.0;
  sf_matrix_layout_DW.x[3] = 4.0;
  sf_matrix_layout_DW.x[4] = 5.0;
  sf_matrix_layout_DW.x[5] = 6.0;
  ...
Созданный код относится к элементам x используя только один индекс.

На диаграммах, в которых в качестве языка действий используется C, можно включать данные и входные данные сообщений для многомерных пользовательских функций кода с основным строком в качестве макета массива. Чтобы реализовать главную строку в качестве формата массива по умолчанию для входов в функции, откройте диалоговое окно Параметры конфигурации (Configuration Parameters). На панели Цель моделирования (Simulation Target) щелкните Импорт пользовательского кода (Import custom code) и задайте для параметра Макет массива функций по умолчанию (Default function array layout) значение Row-major.

В диаграммах, использующих C в качестве языка действий, можно использовать многомерные пользовательские переменные кода. Чтобы реализовать главную строку в качестве формата массива по умолчанию для функций, откройте диалоговое окно Параметры конфигурации (Configuration Parameters). На панели Цель моделирования (Simulation Target) щелкните Импорт пользовательского кода (Import custom code). На панели «Создание кода» > «Интерфейс» в разделе «Интерфейс обмена данными» убедитесь, что для параметра «Формат массива» задано значение Row-major.

Можно также указать отдельные функции для компоновки основного массива строк. На панели Цель моделирования (Simulation Target) щелкните Указать по функции (Specify by function). В этом окне можно добавить или удалить функции и указать их индивидуальный макет массива.

Примечание

Если включить макет главного массива строк в диаграмме, использующей пользовательский код C, все глобальные переменные и аргументы функций, определенных в пользовательском коде, должны быть скалярами, векторами или структурами скаляров и векторов. Укажите размер n-элементный вектор как n, а не как [n 1] или [1 n].

Если в диаграммах, использующих операторы обнаружения изменений, включена компоновка основных массивов строк, создание кода приводит к ошибке. Перед созданием кода в диаграммах, использующих операторы обнаружения изменений, включите компоновку массива «столбец-основной». См. раздел Изменение операторов обнаружения.

Компоновка многомерного массива

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

В предыдущем примере файл sf_matrix_layout.c реализует локальные данные x с этими строками кода:

  ...
  sf_matrix_layout_DW.x[0][0] = 1.0;  
  sf_matrix_layout_DW.x[0][1] = 2.0;
  sf_matrix_layout_DW.x[0][2] = 3.0;
  sf_matrix_layout_DW.x[1][0] = 4.0; 
  sf_matrix_layout_DW.x[1][1] = 5.0;
  sf_matrix_layout_DW.x[1][2] = 6.0;
  ...
Созданный код относится к элементам x с использованием двух индексов.

Многомерная компоновка массива доступна для:

  • Постоянные и локальные данные в диаграммах Stateflow.

  • Диаграммы, содержащие сообщения.

  • Параметры и входные и выходные данные корневого уровня в моделях Simulink ®.

Многомерная компоновка недоступна для сигналов шины, содержащих данные многомерной матрицы. Многомерный макет не поддерживается в:

  • Повторно используемые диаграммы или диаграммы в повторно используемых родительских подсистемах.

Дополнительные сведения см. в разделе Сохранение размеров многомерных массивов в сгенерированном коде (Embedded Coder).

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