主要内容

遗留函数参数的继承信号维度

此示例向您展示如何使用遗留代码工具集成其参数具有继承维度的遗留C函数。

遗留代码工具允许您:

  • 提供遗留功能规范,

  • 生成在模拟期间用于调用遗留代码的C-MEX s函数,以及

  • 编译并构建生成的s函数进行仿真。

提供遗留功能规范

遗留代码工具提供的函数以特定的数据结构或结构数组作为参数。通过使用'initialize'作为第一个输入调用函数legacy_code()来初始化数据结构。在初始化结构之后,必须将其属性分配给与正在集成的遗留代码相对应的值。本例中调用的遗留函数的原型是:

  • void mat_add(real_T *u1, real_T *u2, int32_T n眉毛,int32_T nbCols, real_T *y1)

  • void mat_mult(real_T *u1, real_T *u2, int32_T nbRows1, int32_T nbCols1, int32_T nbCols2, real_T *y1)

其中real_T是double类型的类型定义,int32_T是32位整数的类型定义。遗留源代码可以在文件中找到mat_ops.h而且mat_ops.c

Defs = [];% sldemo_sfun_mat_addDef = legacy_code(“初始化”);def.SFunctionName =“sldemo_sfun_mat_add”;def.OutputFcnSpec = ['void mat_add(double u1[][], double u2[][], '...'int32 u3, int32 u4, double y1[size(u1,1)][size(u1,2)]])'];def.HeaderFiles = {“mat_ops.h”};def.SourceFiles = {“mat_ops.c”};def.IncPaths = {“sldemo_lct_src”};def.SrcPaths = {“sldemo_lct_src”};Defs = [Defs;def);% sldemo_sfun_mat_multDef = legacy_code(“初始化”);def.SFunctionName =“sldemo_sfun_mat_mult”;def.OutputFcnSpec = ['void mat_mult(double u1[p1][p2], double u2[p2][p3], '...'int32 p1, int32 p2, int32 p3,双y1[p1][p3])'];def.HeaderFiles = {“mat_ops.h”};def.SourceFiles = {“mat_ops.c”};def.IncPaths = {“sldemo_lct_src”};def.SrcPaths = {“sldemo_lct_src”};Defs = [Defs;def);

生成和编译用于仿真的s函数

函数legacy_code()在第一个输入设置为'generate_for_sim'时再次被调用,以便根据输入参数'defs'提供的描述自动生成和编译C-MEX s -函数。这个s函数用于在模拟中调用遗留函数。s函数的源代码可以在文件中找到sldemo_sfun_mat_add.c而且sldemo_sfun_mat_mult.c

legacy_code (“generate_for_sim”def);
###开始编译sldemo_sfun_mat_add mex('-I/tmp/Bdoc22a_1891349_109752/tp5f04faa0/ex63241227/sldemo_lct_src', '-I/tmp/Bdoc22a_1891349_109752/tp5f04faa0/ex63241227/sldemo_lct_src', '-c', '-outdir', '/tmp/Bdoc22a_1891349_109752/tp4484224c_033f_4b87_b7f9_ca9bfd1f352d', '/tmp/Bdoc22a_1891349_109752/tp5f04faa0/ex63241227/sldemo_lct_src/mat_ops.c')使用'gcc'构建。MEX完成成功。mex('sldemo_sfun_mat_add.c', '-I/tmp/Bdoc22a_1891349_109752/tp5f04faa0/ex63241227/sldemo_lct_src', '-I/tmp/Bdoc22a_1891349_109752/tp5f04faa0/ex63241227', '/tmp/Bdoc22a_1891349_109752/tp4484224c_033f_4b87_b7f9_ca9bfd1f352d/mat_ops.o')使用'gcc'构建。MEX完成成功。开始编译sldemo_sfun_mat_mult mex('-I/tmp/Bdoc22a_1891349_109752/tp5f04faa0/ex63241227/sldemo_lct_src', '-I/tmp/Bdoc22a_1891349_109752/tp5f04faa0/ex63241227', '-c', '-outdir', '/tmp/Bdoc22a_1891349_109752/tpbb6db498_9a9e_4e46_8ef6_9e39c214bced', '/tmp/Bdoc22a_1891349_109752/tp5f04faa0/ex63241227/sldemo_lct_src/mat_ops.c')使用'gcc'构建。MEX完成成功。mex('sldemo_sfun_mat_mult.c', '-I/tmp/Bdoc22a_1891349_109752/tp5f04faa0/ex63241227/sldemo_lct_src', '-I/tmp/Bdoc22a_1891349_109752/tp5f04faa0/ex63241227', '/tmp/Bdoc22a_1891349_109752/tpbb6db498_9a9e_4e46_8ef6_9e39c214bced/mat_ops.o')使用'gcc'构建。MEX完成成功。完成sldemo_sfun_mat_mult的编译

生成rtwmakecfg。m文件代码生成

TLC块文件创建后,函数legacy_code()可以再次调用,第一个输入设置为'rtwmakecfg_generate',以生成rtwmakecfg。m文件通过Simul金宝appink®Coder™支持代码生成。金宝app生成rtwmakecfg。如果s -函数所需的源文件和头文件与s -函数不在同一个目录中,并且您希望在代码生成期间生成的makefile中添加这些依赖项,则使用m文件。

注意:仅当需要在加速模式下模拟模型时,才需要完成此步骤。

legacy_code (“rtwmakecfg_generate”def);

生成屏蔽s函数块,用于调用生成的s函数

编译C-MEX s -函数源后,函数legacy_code()可以再次调用,第一个输入设置为'slblock_generate',以生成被配置为调用这些s -函数的屏蔽s -函数块。这些块被放置在一个新的模型中,并且可以复制到一个现有的模型中。

% legacy_code('slblock_generate', defs);

集成遗留代码

该模型sldemo_lct_inherit_dims显示与遗留代码的集成。子系统TestMatOps充当了对遗留C函数调用的工具,单元延迟用于存储以前的输出值。

open_system (“sldemo_lct_inherit_dims”) open_system (“sldemo_lct_inherit_dims / TestMatOps”) sim卡(“sldemo_lct_inherit_dims”);

另请参阅