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

При генерации кода из 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 при использовании только одного индекса.

Основная строка Размещения

Основные размещения могут улучшить эффективность некоторых алгоритмов. Для получения примера смотрите Алгоритм интерполяции для Размещения Row-Major Array (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 в качестве языка действий, можно включать входные параметры данных и сообщений для многомерных функций пользовательского кода с основной строкой в качестве размещения массива. Чтобы реализовать основную строку как массив по умолчанию размещения для входов в функциях, откройте диалоговое окно Параметров конфигурации. На панели Simulation Target щелкните Import custom code и задайте Default function array layout Row-major.

В графиках, которые используют C в качестве языка действий, можно использовать многомерные пользовательские переменные кода. Чтобы реализовать основную строку как массив по умолчанию размещения для функций, откройте диалоговое окно Параметров конфигурации. На панели Simulation Target нажмите Import custom code. На панели Code Generation > Interface в разделе Data exchange interface убедитесь, что для 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).

Похожие темы