在遗留函数中实现的查找表
这个示例向您展示了如何使用遗留代码工具来集成实现n维表查找的遗留C函数。
遗留代码工具允许您:
提供遗留功能规范;
生成一个C-MEX函数,用于在模拟期间调用遗留代码
编译并构建生成的s函数用于仿真。
提供遗留功能规范
遗留代码工具提供的函数采用特定的数据结构或结构数组作为参数。数据结构通过调用函数legacy_code()来初始化,使用'initialize'作为第一个输入。在初始化结构之后,您必须将其属性分配给与集成的遗留代码相对应的值。在这个例子中调用的遗留函数的原型是:
FLT directLookupTableND(const FLT *tableND, const UINT32 nbdim, const UINT32 * tabledim, const UINT32 *tableIdx)
其中FLT是float类型的定义,而UINT32是unsigned int32类型的定义。遗留源代码可以在文件中找到your_types.h
,lookupTable.h
,directLookupTableND.c
.
Defs = [];evalin (“基地”,“负载sldemo_lct_data.mat”)% sldemo_sfun_dlut3DDef = legacy_code(“初始化”);def.SFunctionName =“sldemo_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 = {“sldemo_lct_src”};def.SrcPaths = {“sldemo_lct_src”};Defs = [Defs;def);% sldemo_sfun_dlut4DDef = legacy_code(“初始化”);def.SFunctionName =“sldemo_sfun_dlut4D”;def.OutputFcnSpec ='single y1 = DirectLookupTable4D(single p1[][][]], uint32 p2[4], uint32 [4])';def.HeaderFiles = {“lookupTable.h”};def.SourceFiles = {“directLookupTableND.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_dlut3D.c
和sldemo_sfun_dlut4D.c
.
legacy_code (“generate_for_sim”def);
###开始编译sldemo_sfun_dlut3D mex('-I/tmp/Bdoc23a_2213998_2725040/tp24f9799f/simulink_feat金宝appures-ex11439596/sldemo_lct_src', '-I/tmp/Bdoc23a_2213998_2725040/tp24f9799f/simulink_features-ex11439596/ sl24f9799f /simulink_features-ex11439596/ sl24f9799f -outdir', '/tmp/Bdoc23a_2213998_2725040/tp0f898261_9752_4b19_af97_38e09f787a16', '/tmp/Bdoc23a_2213998_2725040/tp24f9799f/simulink_features-ex11439596/sldemo_lct_src/ directlookuptablende .c')使用'gcc'构建。MEX成功完成。. mex(' sldemo_sfun_dlut3dc ', '-I/tmp/Bdoc23a_2213998_2725040/tp24f979金宝app9f/simulink_features-ex11439596/sldemo_lct_src', '-I/tmp/Bdoc23a_2213998_2725040/tp24f9799f/simulink_features-ex11439596', '/tmp/Bdoc23a_2213998_2725040/tp0f898261_9752_4b19_af97_38e09f787a16/directLookupTableND.o')使用'gcc'构建。MEX成功完成。###完成编译sldemo_sfun_dlut3D ### Exit ###开始编译sldemo_sfun_dlut4D mex('-I/tmp/Bdoc23a_2213998_2725040/tp24f9799f/simulink_features-ex1143959金宝app6/sldemo_lct_src', '-I/tmp/Bdoc23a_2213998_2725040/tp24f9799f/simulink_features- 2711439596 / simulink_lct_src ', '-c', '-outdir', '/tmp/Bdoc23a_2213998_2725040/tpb0873123_aff2_4bfe_9157_71119fb26436', '/tmp/Bdoc23a_2213998_2725040/tp24f9799f/simulink_features-ex11439596/sldemo_lct_src/ directlookuptablende .c')使用'gcc'构建。MEX成功完成。. mex(' sldemo_sfun_dlut4dc ', '-I/tmp/Bdoc23a_2213998_2725040/tp24f979金宝app9f/simulink_features-ex11439596/sldemo_lct_src', '-I/tmp/Bdoc23a_2213998_2725040/tp24f9799f/simulink_features-ex11439596', '/tmp/Bdoc23a_2213998_2725040/tpb0873123_aff2_4bfe_9157_71119fb26436/directLookupTableND.o')使用'gcc'构建。MEX成功完成。完成编译sldemo_sfun_dlut4D ###退出
生成一个rtwmakecfg。m代码生成文件
创建TLC块文件后,可以再次调用函数legacy_code(),第一个输入设置为'rtwmakecfg_generate',以生成rtwmakecfg。m文件,以支持通过S金宝appimulink®Coder™代码生成。金宝app生成rtwmakecfg。如果s -函数所需的源文件和头文件与s -函数不在同一个目录中,并且您希望在代码生成过程中生成的makefile中添加这些依赖项,则可以使用m文件。
注意:只有当您要在加速模式下模拟模型时,才需要完成此步骤。
legacy_code (“rtwmakecfg_generate”def);
生成用于调用生成的s函数的掩码s函数块
在编译了C-MEX S-function源代码之后,可以再次调用函数legacy_code(),并将第一个输入设置为'slblock_generate',以便生成一个被屏蔽的S-function块,该块被配置为调用该S-function。块被放置在新模型中,并且可以复制到现有模型中。
% legacy_code('slblock_generate', defs);
集成遗留代码
该模型sldemo_lct_lut
显示与遗留代码的集成。子系统TestFixpt用作对遗留C函数调用的控制,并且显示块将函数的输出与内置的Simulink®查找块的输出进行比较;金宝app结果是相同的。
open_system (“sldemo_lct_lut”) open_system (“sldemo_lct_lut / TestLut1”) sim卡(“sldemo_lct_lut”);