主要内容

按值或地址传递给遗留函数的输入

这个例子向您展示了如何使用遗留代码工具集成遗留C函数,这些函数通过值而不是地址来传递输入参数。

遗留代码工具允许您:

  • 提供遗留功能规范,

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

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

提供遗留功能规范

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

  • FLT filterV1(const FLT signal, const FLT prevSignal, const FLT gain)

  • FLT filterV2(const FLT* signal, const FLT prevSignal, const FLT gain)

其中FLT是float的类型定义。遗留源代码可以在文件中找到your_types.hmyfilter.hfilterV1.c,filterV2.c

请注意两个结构中定义的OutputFcnSpec的差异;第一种情况指定第一个输入参数按值传递,而第二种情况指定按指针传递。

Defs = [];% sldemo_sfun_filterV1Def = legacy_code(“初始化”);def.SFunctionName =“sldemo_sfun_filterV1”;def.OutputFcnSpec ='单个y1 = filterV1(单个u1,单个u2,单个p1)';def.HeaderFiles = {“myfilter.h”};def.SourceFiles = {“filterV1.c”};def.IncPaths = {“sldemo_lct_src”};def.SrcPaths = {“sldemo_lct_src”};Defs = [Defs;def);% sldemo_sfun_filterV2Def = legacy_code(“初始化”);def.SFunctionName =“sldemo_sfun_filterV2”;def.OutputFcnSpec ='单个y1 = filterV2(单个u1[1],单个u2,单个p1)';def.HeaderFiles = {“myfilter.h”};def.SourceFiles = {“filterV2.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_filterV1.csldemo_sfun_filterV2.c

legacy_code (“generate_for_sim”def);
开始编译sldemo_sfun_filterV1 mex('-I/tmp/Bdoc22b_2134332_1864625/tp3224af90/simulink_feature金宝apps-ex08075368/sldemo_lct_src', '-I/tmp/Bdoc22b_2134332_1864625/tp3224af90/simulink_features-ex08075368/sldemo_lct_src', '-c', '-outdir', '/tmp/Bdoc22b_2134332_1864625/tp52b49baf_b573_4a6c_8854_58e8b659464f', '/tmp/Bdoc22b_2134332_1864625/tp3224af90/simulink_features-ex08075368/sldemo_lct_src/filterV1.c')使用'gcc'构建。MEX完成成功。mex('sldemo_sfun_filterV1.c', '-I/tmp/Bdoc22b_2134332_1864625/tp3224af90/金宝appsimulink_features-ex08075368/sldemo_lct_src', '-I/tmp/Bdoc22b_2134332_1864625/tp3224af90/simulink_features-ex08075368', '/tmp/Bdoc22b_2134332_1864625/tp52b49baf_b573_4a6c_8854_58e8b659464f/filterV1.o')构建'gcc'。MEX完成成功。开始编译sldemo_sfun_filterV2 mex('-I/tmp/Bdoc22b_2134332_1864625/tp3224af90/simulink_features-ex08075368/sldemo_lct_src', '-I/tmp/Bdoc22b_21343金宝app32_1864625/tp3224af90/simulink_features-ex08075368', '-c', '-outdir', '/tmp/Bdoc22b_2134332_1864625/tp8339b9b5_5581_42f4_92db_e0f8aaff2a5e', '/tmp/Bdoc22b_2134332_1864625/tp3224af90/simulink_features-ex08075368/sldemo_lct_src/filterV2.c')使用'gcc'构建。MEX完成成功。mex('sldemo_sfun_filterV2.c', '-I/tmp/Bdoc22b_2134332_1864625/tp3224af90/金宝appsimulink_features-ex08075368/sldemo_lct_src', '-I/tmp/Bdoc22b_2134332_1864625/tp3224af90/simulink_features-ex08075368', '/tmp/Bdoc22b_2134332_1864625/tp8339b9b5_5581_42f4_92db_e0f8aaff2a5e/filterV2.o')使用'gcc'构建。MEX完成成功。结束编译sldemo_sfun_filterV2

生成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_filter显示与遗留代码的集成。子系统TestFilter作为通过generate s函数调用遗留C函数的工具,使用单元延迟存储以前的输出值。

open_system (“sldemo_lct_filter”) open_system (“sldemo_lct_filter / TestFilter”) sim卡(“sldemo_lct_filter”);

另请参阅