При генерации кода из графика Stateflow®, который использует C в качестве языка действия, можно задать размещение массивов для матриц. Например, рассмотрите эту матрицу:
По умолчанию генератор кода использует упорядоченное по столбцам размещение, чтобы сгладить матрицу как одномерный массив. Массив хранится в памяти с этим расположением:
{1, 4, 2, 5, 3, 6}
{1, 2, 3, 4, 5, 6}
{{1, 2, 3}, {4, 5, 6}}
По умолчанию параметром конфигурации Размещения Массивов для модели 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).
Чтобы сгенерировать код, который использует упорядоченное по строкам размещение массивов:
Откройте диалоговое окно Model Configuration Parameters.
В Code Generation> панель Interface, установленная параметр Array Layout на Row-Major
.
Нажмите 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
при помощи только одного индекса.Если вы включаете упорядоченное по строкам размещение массивов в графике, который использует пользовательский код С, все глобальные переменные и аргументы функций, определяемых в пользовательском коде должны быть скалярами, векторами или структурами скаляров и векторов. Задайте размер 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).