遗留函数中的持久内存
这个示例向您展示了如何使用遗留代码工具将遗留C函数与特定于实例的持久内存集成在一起。
遗留代码工具允许您:
提供遗留功能规范,
生成在模拟期间用于调用遗留代码的C-MEX s函数,以及
编译并构建生成的s函数进行仿真。
提供遗留功能规范
遗留代码工具提供的函数以特定的数据结构或结构数组作为参数。通过调用函数初始化数据结构legacy_code ()
使用'initialize'作为第一个输入。在初始化结构之后,必须将其属性分配给与正在集成的遗留代码相对应的值。在这个例子中被调用的遗留函数的原型是:
void memory_bus_init(COUNTERBUS *mem, int32_T upper_sat, int32_T lower_sat);
void memory_bus_step(COUNTERBUS *输入,COUNTERBUS *mem, COUNTERBUS *输出);
其中mem是特定于实例的持久内存,用于应用一个集成步骤延迟。中定义的结构类型定义counterbus.h
并通过仿真软件。公共汽车
基本工作区中的对象。遗留源代码可以在文件中找到memory_bus.h
而且memory_bus.c
.
evalin (“基地”,“负载sldemo_lct_data.mat”)% sldemo_sfun_workDef = legacy_code(“初始化”);def.SFunctionName =“sldemo_sfun_work”;def.InitializeConditionsFcnSpec ='void memory_bus_init(COUNTERBUS work1[1], int32 p1, int32 p2)';def.OutputFcnSpec ='void memory_bus_step(COUNTERBUS u1[1], COUNTERBUS work1[1], COUNTERBUS y1[1])';def.HeaderFiles = {“memory_bus.h”};def.SourceFiles = {“memory_bus.c”};def.IncPaths = {“sldemo_lct_src”};def.SrcPaths = {“sldemo_lct_src”};
生成和编译用于仿真的s函数
函数legacy_code()在第一个输入设置为'generate_for_sim'时再次被调用,以便根据输入参数'def'提供的描述自动生成和编译C-MEX s -函数。这个s函数用于在模拟中调用遗留函数。s函数的源代码可以在文件中找到sldemo_sfun_work.c
.
legacy_code (“generate_for_sim”def);
开始编译sldemo_sfun_work mex('-I/tmp/Bdoc22b_2054784_2926349/tpa01124b5/simulink_features-ex40483229/sldemo_lct_src', '-I/tmp/Bdoc22b_2054784_2926349/tpa01124b5/simulink_features-ex40483229/sldemo_lct_src', '-c', '-outdir', '/tmp/Bdoc22b_2054784_2926349/tp321d719c_3bd3_4009_9ea4_4dd347741bfe', '/tmp/Bdoc22b_2054784_2926349/tpa01124b5/simulink_features-ex40483229/sldemo_lct_src/memory_bus.c')使用'gcc'构建。MEX完成成功。-I/tmp/Bdoc22b_2054784_2926349/tpa01124b5/simulink_features-ex40483229/sldemo_lct_src, -I/tmp/Bdoc22b_2054784_2926349/tpa01124b5/simulink_features-ex40483229', '/tmp/Bdoc22b_2054784_2926349/tp321d719c_3bd3_4009_9ea4_4dd347741bfe/memory_bus.o')使用“gcc”构建。MEX完成成功。完成sldemo_sfun_work的编译
生成rtwmakecfg。m文件代码生成
TLC块文件创建后,函数legacy_code()可以再次调用,第一个输入设置为'rtwmakecfg_generate',以生成rtwmakecfg。m文件通过Simulink®Coder™支持代码生成。生成rtwmakecfg。如果s -函数所需的源文件和头文件与s -函数不在同一个目录中,并且您希望在代码生成期间生成的makefile中添加这些依赖项,则使用m文件。
注意:仅当您打算在加速模式下模拟模型时,才需要完成此步骤。
legacy_code (“rtwmakecfg_generate”def);
生成屏蔽s函数块,用于调用生成的s函数
编译C-MEX s -函数源后,可以再次调用函数legacy_code(),并将第一个输入设置为'slblock_generate',以生成一个被配置为调用该s -函数的屏蔽s -函数块。块被放置在一个新的模型中,并且可以复制到一个现有的模型中。
% legacy_code('slblock_generate', def);
集成遗留代码
该模型sldemo_lct_work
显示与遗留代码的集成。子系统memory_bus充当了对遗留C函数调用的工具。
open_system (“sldemo_lct_work”) open_system (“sldemo_lct_work / memory_bus”) sim卡(“sldemo_lct_work”)
ans = Simulink。SimulationOutput: ScopeDataA: [11x3 double] tout: [11x1 double] SimulationMetadata: [1x1 Simulink。SimulationMetadata] ErrorMessage: [0x0 char]