传统函数中的复杂信号
此示例向您展示如何使用旧式代码工具通过复杂信号集成旧式 C 函数。
代码继承工具允许您:
提供已有函数设定;
生成 C-MEX S-Function,在仿真期间使用它来调用现有代码;以及
编译和构造生成的 S-Function 以进行仿真。
提供已有函数设定
代码继承工具附带的函数接受特定的数据结构体或结构体数组作为参量。可以通过调用函数 legacy_code() 并使用 'initialize' 作为第一个输入来初始化数据结构体。初始化结构体之后,您必须将其属性指定给与要集成的现有代码对应的值。此示例中调用的已有函数的原型为:
无效 cplx_gain(creal_T *输入,creal_T *增益,creal_T *输出);
其中 creal_T 是双精度的复数表示。已有源代码位于文件 cplxgain.h
和 cplxgain.c
中。
% sldemo_sfun_gain_scalar def = legacy_code('initialize'); def.SFunctionName = 'sldemo_sfun_cplx_gain'; def.OutputFcnSpec = 'void cplx_gain(complex<double> u1[1], complex<double> p1[1], complex<double> y1[1])'; def.HeaderFiles = {'cplxgain.h'}; def.SourceFiles = {'cplxgain.c'}; def.IncPaths = {'sldemo_lct_src'}; def.SrcPaths = {'sldemo_lct_src'};
生成和编译 S-Function 以供仿真期间使用
再次调用函数 legacy_code() 并将第一个输入设置为 'generate_for_sim',以便根据输入参量 'def' 提供的描述自动生成和编译 C-MEX S-Function。此 S-Function 用于在仿真中调用已有函数。S-Function 的源代码位于文件 sldemo_sfun_cplx_gain.c
中。
legacy_code('generate_for_sim', def);
### Start Compiling sldemo_sfun_cplx_gain mex('-I/tmp/Bdoc25a_2864802_2915264/tpa9b14c60/simulink_features-ex34942047/sldemo_lct_src', '-I/tmp/Bdoc25a_2864802_2915264/tpa9b14c60/simulink_features-ex34942047', '-c', '-outdir', '/tmp/Bdoc25a_2864802_2915264/tp36efe22b_6334_450f_90bd_01f2dc6c7ba6', '/tmp/Bdoc25a_2864802_2915264/tpa9b14c60/simulink_features-ex34942047/sldemo_lct_src/cplxgain.c') Building with 'gcc'. MEX completed successfully. mex('sldemo_sfun_cplx_gain.c', '-I/tmp/Bdoc25a_2864802_2915264/tpa9b14c60/simulink_features-ex34942047/sldemo_lct_src', '-I/tmp/Bdoc25a_2864802_2915264/tpa9b14c60/simulink_features-ex34942047', '/tmp/Bdoc25a_2864802_2915264/tp36efe22b_6334_450f_90bd_01f2dc6c7ba6/cplxgain.o') Building with 'gcc'. MEX completed successfully. ### Finish Compiling sldemo_sfun_cplx_gain ### Exit
生成 rtwmakecfg.m 文件以进行代码生成
在创建 TLC 模块文件后,可再次调用函数 legacy_code() 并将第一个输入设置为 'rtwmakecfg_generate',以生成 rtwmakecfg.m 文件来通过 Simulink® Coder™ 支持代码生成。如果 S-Function 需要的源文件和头文件与 S-Function 不在同一个文件夹中,而您要将这些依赖项添加到代码生成过程中生成的联编文件中,请生成 rtwmakecfg.m 文件。
注意:仅当要在加速模式下仿真模型时,才完成此步骤。
legacy_code('rtwmakecfg_generate', def);
生成封装的 S-Function 模块以调用生成的 S-Function
在编译 C-MEX S-Function 源代码后,可以再次调用函数 legacy_code() 并将第一个输入设置为 'slblock_generate',以生成配置为调用该 S-Function 的封装 S-Function 模块。此模块放置在新模型中,并且可以复制到现有模型中。
% legacy_code('slblock_generate', def);
与现有代码集成
模型 sldemo_lct_cplxgain
显示与现有代码的集成。子系统 complex_gain 充当通过生成 S-Function 调用传统 C 函数的框架。
if isempty(find_system('SearchDepth',0,'Name','sldemo_lct_cplxgain')) open_system('sldemo_lct_cplxgain') open_system('sldemo_lct_cplxgain/complex_gain') sim('sldemo_lct_cplxgain'); end