主要内容

按值或地址传递到遗留功能的输入

此示例向您展示了如何使用旧版代码工具来集成按值与地址传递其输入参数的旧版C函数。

旧版代码工具允许您:

  • 提供旧功能规范,

  • 生成一个C-MEX S功能,该功能在模拟过程中用于调用旧代码,并

  • 编译并构建生成的S功能以进行仿真。

提供旧功能规范

遗留代码工具提供的功能将特定的数据结构或一系列结构作为参数。数据结构是通过使用“初始化”为第一个输入来调用函数lacacy_code()来初始化数据结构的。初始化结构后,您必须将其属性分配给对应于要集成的旧代码的值。在此示例中调用的遗产函数的原型是:

  • FLT FilterV1(const flt信号,const flt prevSignal,const flt增益)

  • flt Filterv2(const flt*信号,const flt prevSignal,const flt增益)

flt是浮动的类型。遗产源代码在文件中找到your_types.h,,,,myfilter.h,,,,Filterv1.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功能以供使用

将第一个输入设置为“ generate_for_sim”再次调用函数lecacy_code(),以根据输入参数'defs'提供的描述自动生成和编译C-Mex S函数。此S功能用于调用模拟中的旧功能。在文件中找到S功能的源代码sldemo_sfun_filterv1.csldemo_sfun_filterv2.c

legacy_code('generate_for_sim',defs);
### Start Compiling sldemo_sfun_filterV1 mex('-I/tmp/Bdoc21b_1757077_95651/tpe955e9cf/ex08075368/sldemo_lct_src', '-I/tmp/Bdoc21b_1757077_95651/tpe955e9cf/ex08075368', '-c', '-outdir', '/tmp/BDOC21B_1757077_95651/TP5E44E50C_CBF3_4757_A2E_A2E5_F6D8518F4716','/tmp/BDOC21B_17570777777_95651/TPE_95ECCRENLONDINMEX成功完成。mex('sldemo_sfun_filterV1.c', '-I/tmp/Bdoc21b_1757077_95651/tpe955e9cf/ex08075368/sldemo_lct_src', '-I/tmp/Bdoc21b_1757077_95651/tpe955e9cf/ex08075368', '/tmp/Bdoc21b_1757077_95651/tp5e44e50c_cbf3_4757_a2e5_f6d8518f4716/filterV1.o') Building与“ GCC”。MEX成功完成。### Finish Compiling sldemo_sfun_filterV1 ### Exit ### Start Compiling sldemo_sfun_filterV2 mex('-I/tmp/Bdoc21b_1757077_95651/tpe955e9cf/ex08075368/sldemo_lct_src', '-I/tmp/Bdoc21b_1757077_95651/tpe955e9cf/ex08075368', '-c','-outdir','/tmp/bdoc21b_1757077_95651/tpeb4e2947_3066_446e_446e_446e_b4f1b4f1b7c1b7c1b92d','MEX成功完成。mex('sldemo_sfun_filterV2.c', '-I/tmp/Bdoc21b_1757077_95651/tpe955e9cf/ex08075368/sldemo_lct_src', '-I/tmp/Bdoc21b_1757077_95651/tpe955e9cf/ex08075368', '/tmp/Bdoc21b_1757077_95651/tpeb4e2947_3066_446e_b4f1_58f1b7c1b92d/filterV2.o') Building与“ GCC”。MEX成功完成。 ### Finish Compiling sldemo_sfun_filterV2 ### Exit

生成一个用于代码生成的RTWMAKECFG.M文件

创建TLC块文件后,可以将第一个输入设置为“ rtwmakecfg_generate”再次调用函数lecacy_code(),以生成rtwmakecfg.m文件以通过Simulink®Coder™支持代码生成。金宝app金宝app如果S-函数的所需源和标头文件与S-函数的目录不在同一目录中,则生成RTWMAKECFG.M文件,并且您想在代码生成过程中生成的makefile中添加这些依赖项。

注意:仅当您要以加速模式模拟模型时,才能完成此步骤。

legacy_code('rtwmakecfg_generate',def);

生成蒙版的S功能块,用于调用生成的S功能

在编译了C-MEX S功能源后,可以将第一个输入设置为“ slblock_generate”再次调用函数legacy_code(),以生成配置为调用这些s功能的蒙版S功能块。这些块被放置在新模型中,可以复制到现有模型。

%lectacy_code('slblock_generate',defs);

集成旧代码

该模型sldemo_lct_filter显示与旧版代码的集成。子系统TestFilter通过生成S-函数可以用作对传统C函数的调用的安全带,其单位延迟可用于存储先前的输出值。

open_system('sldemo_lct_filter')open_system('sldemo_lct_filter/testFilter')SIM('sldemo_lct_filter');

也可以看看