Выберите Array Layout for Matrices in Generated Code

При генерации кода из графика 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).

Упорядоченное по столбцам размещение массивов

По умолчанию параметром конфигурации Размещения Массивов для модели 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 при помощи только одного индекса.

Упорядоченное по строкам размещение массивов

Упорядоченное по строкам размещение может улучшать производительность определенных алгоритмов. Например, см. Алгоритм Интерполяции для Упорядоченного по строкам Размещения Массивов (Embedded Coder).

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

  1. Откройте диалоговое окно Model Configuration Parameters.

  2. В Code Generation> панель Interface, установленная параметр Array Layout на 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, click Import custom code и набор Default function array layout к Row-major.

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

Примечание

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

Размещение многомерного массива

Если у вас есть Embedded Coder, можно сгенерировать код, который сохраняет мультиразмерность данных 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).

Похожие темы