Main Content

集成以定点数据类型的参数方式传递输入和输出参量的外部 C 函数

使用代码继承工具,集成通过使用定点数据类型的参数来传递输入和输出的已有 C 函数。

使用代码继承工具,您可以:

  • 提供已有函数设定。

  • 生成在仿真过程中调用现有代码的 C-MEX S-Function。

  • 编译生成的 S-Function 以进行仿真。

  • 生成 TLC 模块文件和可选的 rtwmakecfg.m 文件,该文件指定针对模型生成的代码如何调用现有代码。

提供已有函数设定

代码继承工具函数接受特定的数据结构体或结构体数组作为参量。您可以通过调用函数 legacy_code() 并使用 initialize 作为第一个输入来初始化数据结构体。初始化结构体之后,将其属性指定给与要集成的现有代码对应的值。此示例中调用的已有函数的原型为:

myFixpt timesS16(const myFixpt in1, const myFixpt in2, const uint8_T fracLength)

myFixpt 逻辑上是定点数据类型,实际上是 16 位整数的 typedef:

myFixpt = Simulink.NumericType;
myFixpt.DataTypeMode = 'Fixed-point: binary point scaling';
myFixpt.Signed = true;
myFixpt.WordLength = 16;
myFixpt.FractionLength = 10;
myFixpt.IsAlias = true;
myFixpt.HeaderFile = 'timesFixpt.h';

已有源代码位于文件 timesFixpt.htimesS16.c 中。

% sfun_gain_fixpt
def = legacy_code('initialize');
def.SFunctionName = 'sfun_gain_fixpt';
def.OutputFcnSpec = 'myFixpt y1 = timesS16(myFixpt u1, myFixpt p1, uint8 p2)';
def.HeaderFiles   = {'timesFixpt.h'};
def.SourceFiles   = {'timesS16.c'};
def.IncPaths      = {'Lct_src'};
def.SrcPaths      = {'Lct_src'};

生成 S-Function 进行仿真

要根据输入参量 def 提供的描述生成 C-MEX S-Function,请再次调用函数 legacy_code() 并将第一个输入设置为 sfcn_cmex_generate。S-Function 将在仿真过程中调用已有函数。S-Function 的源代码位于文件 sfun_gain_fixpt.c 中。

legacy_code('sfcn_cmex_generate', def);

编译生成的 S-Function 进行仿真

在生成 C-MEX S-Function 源文件之后,要使用 Simulink® 编译 S-Function 进行仿真,请再次调用函数 legacy_code() 并将第一个输入设置为 compile

legacy_code('compile', def);
### Start Compiling sfun_gain_fixpt
    mex('-I/tmp/Bdoc24b_2679053_780170/tp61511560/simulinkcoder-ex05928773/Lct_src', '-I/tmp/Bdoc24b_2679053_780170/tp61511560/simulinkcoder-ex05928773', '-c', '-outdir', '/tmp/Bdoc24b_2679053_780170/tpf669a7dc_4671_430e_baaa_7d2af1f89db0', '/tmp/Bdoc24b_2679053_780170/tp61511560/simulinkcoder-ex05928773/timesS16.c')
Building with 'gcc'.
MEX completed successfully.
    mex('sfun_gain_fixpt.c', '-I/tmp/Bdoc24b_2679053_780170/tp61511560/simulinkcoder-ex05928773/Lct_src', '-I/tmp/Bdoc24b_2679053_780170/tp61511560/simulinkcoder-ex05928773', '/tmp/Bdoc24b_2679053_780170/tpf669a7dc_4671_430e_baaa_7d2af1f89db0/timesS16.o')
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling sfun_gain_fixpt
### Exit

生成 TLC 模块文件以进行代码生成

编译 S-Function 并将其用于仿真之后,您可以再次调用函数 legacy_code()。将第一个输入设置为 sfcn_tlc_generate,以生成 TLC 模块文件。该模块文件指定为模型生成的代码如何调用现有代码。如果您不生成 TLC 模块文件,则当您尝试为包含 S-Function 的模型生成代码时,代码生成将失败。S-Function 的 TLC 模块文件为 sfun_gain_fixpt.tlc

legacy_code('sfcn_tlc_generate', def);

生成 rtwmakecfg.m 文件以进行代码生成

创建 TLC 模块文件之后,您可以再次调用函数 legacy_code()。将第一个输入设置为 rtwmakecfg_generate,以生成支持代码生成的 rtwmakecfg.m 文件。如果 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);

显示生成的与现有代码的集成

模型 LctFixedParams 显示了模型与现有代码的集成。子系统 TestFixpt 的作用相当于通过生成的 S-Function 调用已有 C 函数的工具。

open_system('LctFixedParams')
open_system('LctFixedParams/TestFixpt')
sim('LctFixedParams')
ans =

    '
     ### Start Compiling sfun_gain_fixpt
         mex('-I/tmp/Bdoc24b_2679053_780170/tp61511560/simulinkcoder-ex05928773/Lct_src', '-I/tmp/Bdoc24b_2679053_780170/tp61511560/simulinkcoder-ex05928773', '-c', '-outdir', '/tmp/Bdoc24b_2679053_780170/tp95f91a2c_ecb6_49c6_a9ff_190ba93b2fb8', '/tmp/Bdoc24b_2679053_780170/tp61511560/simulinkcoder-ex05928773/timesS16.c')
     Building with 'gcc'.
     MEX completed successfully.
         mex('sfun_gain_fixpt.c', '-I/tmp/Bdoc24b_2679053_780170/tp61511560/simulinkcoder-ex05928773/Lct_src', '-I/tmp/Bdoc24b_2679053_780170/tp61511560/simulinkcoder-ex05928773', '/tmp/Bdoc24b_2679053_780170/tp95f91a2c_ecb6_49c6_a9ff_190ba93b2fb8/timesS16.o')
     Building with 'gcc'.
     MEX completed successfully.
     ### Finish Compiling sfun_gain_fixpt
     ### Exit
     '

另请参阅

相关主题