选择生成代码中矩阵的数组布局
当从Stateflow®图表生成代码时,您可以为矩阵指定数组布局。例如,考虑这个矩阵:
默认情况下,代码生成器使用列主布局将矩阵转换为一维数组,并按如下安排将其存储在内存中:
{1,4,2,5,3,6}
如果选择行为主布局,代码生成器将矩阵转换为一维数组,并按如下安排将其存储在内存中:
{1,2,3,4,5,6}
如果你有Embedded Coder®,你可以保留矩阵的多维度,并通过以下安排将其存储为二维数组:
{{1,2,3}, {4,5,6}}
有关更多信息,请参见矩阵和数组的代码生成(仿真软件编码器)而且多维数组的维数保存(嵌入式编码).
列-主数组布局
默认情况下,阵列布局为Simulink®模型的配置参数列为主
.当您从模型生成代码时,代码生成器将所有矩阵数据平铺成列主数组布局中的一维数组。
例如,此状态流图包含本地数据x
的大小3 [2]
.状态操作对其中的元素进行索引x
按行号和列号。
为这个模型生成代码:
在应用程序选项卡上,选择仿真软件编码器或嵌入式编码器.
在C代码选项卡上,单击构建.
该文件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
只使用一个索引。这些指数并不是按递增顺序出现的。
行-主数组布局
行主布局可以提高某些算法的性能。例如,参见行-主阵列布局插值算法(嵌入式编码).
要生成使用行为主数组布局的代码:
打开“配置参数”对话框。
在代码生成>接口窗格中,设置阵列布局参数
行
.生成如中所述的代码使用Simulink Coder生成代码(仿真软件编码器)或使用嵌入式编码器生成代码(嵌入式编码).
该文件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
只使用一个索引。指数按递增顺序排列。
启用行主数组布局时,可以将图表和消息数据作为参数传递给行主数组布局中的自定义代码函数。还可以使用row-major作为自定义代码变量的默认布局。实现row-major作为自定义代码函数和变量的默认数组布局:
打开“配置参数”对话框。
在代码生成>接口窗格中,设置阵列布局参数
行
.在模拟目标窗格中,在先进的参数中,选择导入定制代码.
在导入设置选项卡,设置默认函数数组布局参数
行
.
还可以为单个函数指定行主数组布局。在模拟目标窗格,在导入设置选项卡上,单击函数异常.在“自定义代码函数的数组布局”窗口中,可以添加或删除函数,并为每个函数指定单独的数组布局。
如果在使用自定义C代码的图表中启用行-主数组布局,则自定义代码中定义的自定义代码函数的全局变量和参数必须为标量、向量或标量和向量的结构。指定n元素向量的大小为n,而不是[n 1]或[1 n]。
当您在使用更改检测操作符的图表中启用行主数组布局时,代码生成将产生错误。在使用更改检测操作符的图表中生成代码之前,请启用列主数组布局。看到变更检测操作符.
多维数组布局
如果您有Embedded Coder,您就可以生成代码来保留Stateflow数据的多维性,而不必将数据压平到一维数组中。
使用多维数组布局为前面的例子生成代码:
启用行主布局。
在应用程序选项卡上,选择嵌入式编码器.
在C代码选项卡上,选择代码接口>默认代码映射打开代码的映射编辑和属性检查器.
在代码的映射编辑器,在数据默认值选项卡,选择信号、状态和内部数据类别并设置存储类作为
可以定位的
.如果代码映射编辑器为空,导航到Simulink模型。在属性检查器,在代码部分中,选择PreserveDimensions.
在C代码选项卡上,单击构建.
该文件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的元素。
多维数组布局可用于:
状态流图中的常量和本地数据
状态流图中的消息数据
Simulink模型中的参数和根级导入和输出数据
包含多维数组数据的总线信号不可用多维布局。
可重用图表或可重用父子系统中的图表不支持多维布局。
有关更多信息,请参见在生成的代码中保留多维数组的维度(嵌入式编码).
另请参阅
模型设置
相关的话题
- 从状态流块生成C或c++代码
- 矩阵和数组的代码生成(仿真软件编码器)
- 行-主阵列布局插值算法(嵌入式编码)
- 多维数组的维数保存(嵌入式编码)
- 在生成的代码中保留多维数组的维度(嵌入式编码)