集成实现 N 维表查找的外部 C 函数
通过使用代码继承工具,集成实现 N 维表查找的已有 C 函数。
使用代码继承工具,您可以:
提供已有函数设定。
生成在仿真过程中调用现有代码的 C-MEX S-Function。
编译生成的 S-Function 以进行仿真。
生成 TLC 模块文件和可选的
rtwmakecfg.m
文件,该文件指定针对模型生成的代码如何调用现有代码。
提供已有函数设定
代码继承工具函数接受特定的数据结构体或结构体数组作为参量。您可以通过调用函数 legacy_code()
并使用 initialize
作为第一个输入来初始化数据结构体。初始化结构体之后,将其属性指定给与要集成的现有代码对应的值。此示例中调用的已有函数的原型为:
FLT directLookupTableND(const FLT *tableND, const UINT32 nbDims, const UINT32 *tableDims, const UINT32 *tableIdx)
FLT 是浮点类型的 typedef,UINT32 是无符号 int32 类型的 typedef。已有源代码位于文件 your_types.h
、lookupTable.h
和 directLookupTableND.c
中。
defs = []; evalin('base','load Lct_data.mat') % sfun_dlut3D def = legacy_code('initialize'); def.SFunctionName = 'sfun_dlut3D'; def.OutputFcnSpec = 'single y1 = DirectLookupTable3D(single p1[][][], uint32 p2[3], uint32 u1[3])'; def.HeaderFiles = {'lookupTable.h'}; def.SourceFiles = {'directLookupTableND.c'}; def.IncPaths = {'Lct_src'}; def.SrcPaths = {'Lct_src'}; defs = [defs; def]; % sfun_dlut4D def = legacy_code('initialize'); def.SFunctionName = 'sfun_dlut4D'; def.OutputFcnSpec = 'single y1 = DirectLookupTable4D(single p1[][][][], uint32 p2[4], uint32 u1[4])'; def.HeaderFiles = {'lookupTable.h'}; def.SourceFiles = {'directLookupTableND.c'}; def.IncPaths = {'Lct_src'}; def.SrcPaths = {'Lct_src'}; defs = [defs; def];
生成 S-Function 以进行仿真
要根据输入参量 defs
提供的描述生成 C-MEX S-Function,请再次调用函数 legacy_code()
。将第一个输入设置为 sfcn_cmex_generate
。S-Function 将在仿真过程中调用已有函数。S-Function 的源代码位于文件 sfun_dlut3D.c
和 rtwdemo_sfun_dlut4D.c
中。
legacy_code('sfcn_cmex_generate', defs);
编译生成的 S-Function 以进行仿真
在生成 C-MEX S-Function 源文件之后,要使用 Simulink® 编译 S-Function 进行仿真,请再次调用函数 legacy_code()
。将第一个输入设置为 compile
。
legacy_code('compile', defs);
### Start Compiling sfun_dlut3D mex('-I/tmp/Bdoc24b_2679053_778292/tp729c6db4/simulinkcoder-ex19426386/Lct_src', '-I/tmp/Bdoc24b_2679053_778292/tp729c6db4/simulinkcoder-ex19426386', '-c', '-outdir', '/tmp/Bdoc24b_2679053_778292/tpf0bacf7e_32e4_475f_8b68_1f32218fdca5', '/tmp/Bdoc24b_2679053_778292/tp729c6db4/simulinkcoder-ex19426386/directLookupTableND.c') Building with 'gcc'. MEX completed successfully. mex('sfun_dlut3D.c', '-I/tmp/Bdoc24b_2679053_778292/tp729c6db4/simulinkcoder-ex19426386/Lct_src', '-I/tmp/Bdoc24b_2679053_778292/tp729c6db4/simulinkcoder-ex19426386', '/tmp/Bdoc24b_2679053_778292/tpf0bacf7e_32e4_475f_8b68_1f32218fdca5/directLookupTableND.o') Building with 'gcc'. MEX completed successfully. ### Finish Compiling sfun_dlut3D ### Exit ### Start Compiling sfun_dlut4D mex('-I/tmp/Bdoc24b_2679053_778292/tp729c6db4/simulinkcoder-ex19426386/Lct_src', '-I/tmp/Bdoc24b_2679053_778292/tp729c6db4/simulinkcoder-ex19426386', '-c', '-outdir', '/tmp/Bdoc24b_2679053_778292/tp6fb1738e_79fe_43d9_82d0_85c9f258d1d9', '/tmp/Bdoc24b_2679053_778292/tp729c6db4/simulinkcoder-ex19426386/directLookupTableND.c') Building with 'gcc'. MEX completed successfully. mex('sfun_dlut4D.c', '-I/tmp/Bdoc24b_2679053_778292/tp729c6db4/simulinkcoder-ex19426386/Lct_src', '-I/tmp/Bdoc24b_2679053_778292/tp729c6db4/simulinkcoder-ex19426386', '/tmp/Bdoc24b_2679053_778292/tp6fb1738e_79fe_43d9_82d0_85c9f258d1d9/directLookupTableND.o') Building with 'gcc'. MEX completed successfully. ### Finish Compiling sfun_dlut4D ### Exit
生成 TLC 模块文件以进行代码生成
编译 S-Function 并将其用于仿真之后,您可以再次调用函数 legacy_code()
。将第一个输入设置为 sfcn_tlc_generate
以生成 TLC 模块文件。模块文件指定为模型生成的代码如何调用现有代码。如果您不生成 TLC 模块文件,则当您尝试为包含 S-Function 的模型生成代码时,代码生成将失败。
legacy_code('sfcn_tlc_generate', defs);
为 S-Function 生成的 TLC 模块文件是 sfun_dlut3D.tlc
和 sfun_dlut4D.tlc
。
生成 rtwmakecfg.m 文件以进行代码生成
创建 TLC 模块文件之后,您可以再次调用函数 legacy_code()
。将第一个输入设置为 rtwmakecfg_generate
,以生成 rtwmakecfg.m
文件来支持代码生成。如果 S-Function 需要的源文件和头文件与 S-Function 不在同一个文件夹中,而您要将这些相关文件添加到代码生成过程中生成的联编文件中,请生成 rtwmakecfg.m
文件。
legacy_code('rtwmakecfg_generate', defs);
生成封装的 S-Function 模块以调用生成的 S-Function
在编译 C-MEX S-Function 源之后,您可以再次调用函数 legacy_code()
。将第一个输入设置为 slblock_generate
,以生成封装的 S-Function 模块来调用 S-Function。软件将模块放在新模型中。您可以将模块复制到现有模型中。
legacy_code('slblock_generate', defs);
显示生成的与现有代码的集成
模型 LctTableLookups
显示了模型与现有代码的集成。子系统 TestLut1
的作用相当于调用已有 C 函数的工具,Display 模块将函数输出与内置 Simulink® 查找模块的输出进行比较。结果相同。
open_system('LctTableLookups') open_system('LctTableLookups/TestLut1') sim('LctTableLookups')
ans = ' ### Start Compiling sfun_dlut3D mex('-I/tmp/Bdoc24b_2679053_778292/tp729c6db4/simulinkcoder-ex19426386/Lct_src', '-I/tmp/Bdoc24b_2679053_778292/tp729c6db4/simulinkcoder-ex19426386', '-c', '-outdir', '/tmp/Bdoc24b_2679053_778292/tpa02f330a_bc23_4625_b12d_e9cfde5a9e2f', '/tmp/Bdoc24b_2679053_778292/tp729c6db4/simulinkcoder-ex19426386/directLookupTableND.c') Building with 'gcc'. MEX completed successfully. mex('sfun_dlut3D.c', '-I/tmp/Bdoc24b_2679053_778292/tp729c6db4/simulinkcoder-ex19426386/Lct_src', '-I/tmp/Bdoc24b_2679053_778292/tp729c6db4/simulinkcoder-ex19426386', '/tmp/Bdoc24b_2679053_778292/tpa02f330a_bc23_4625_b12d_e9cfde5a9e2f/directLookupTableND.o') Building with 'gcc'. MEX completed successfully. ### Finish Compiling sfun_dlut3D ### Exit ### Start Compiling sfun_dlut4D mex('-I/tmp/Bdoc24b_2679053_778292/tp729c6db4/simulinkcoder-ex19426386/Lct_src', '-I/tmp/Bdoc24b_2679053_778292/tp729c6db4/simulinkcoder-ex19426386', '-c', '-outdir', '/tmp/Bdoc24b_2679053_778292/tp0b30a9cd_dd65_4ddb_b78c_3e6a74c72f91', '/tmp/Bdoc24b_2679053_778292/tp729c6db4/simulinkcoder-ex19426386/directLookupTableND.c') Building with 'gcc'. MEX completed successfully. mex('sfun_dlut4D.c', '-I/tmp/Bdoc24b_2679053_778292/tp729c6db4/simulinkcoder-ex19426386/Lct_src', '-I/tmp/Bdoc24b_2679053_778292/tp729c6db4/simulinkcoder-ex19426386', '/tmp/Bdoc24b_2679053_778292/tp0b30a9cd_dd65_4ddb_b78c_3e6a74c72f91/directLookupTableND.o') Building with 'gcc'. MEX completed successfully. ### Finish Compiling sfun_dlut4D ### Exit '