使用多个代码替换库优化生成的代码
您可以生成由多个代码替换库启用代码替换的代码。您可以在统一的工作流程中选择多个代码替换库,以便生成的代码包含来自各种代码替换库(例如 AUTOSAR 4.x
和 GNU C99 extensions
)的优化。您还可以选择自己的自定义代码替换库以及 Embedded Coder® 附带的库来进一步优化生成的代码。您可以选择并使用库的组合并实现所需的函数,而无需编写单独的库。如果存在多个自定义代码替换库并且您需要所有库的函数,请单独选择这些库。
示例模型
此示例显示如何使用多个代码替换库替换包含 Add 模块和 Abs 模块的模型的生成代码。您可以使用代码替换自定义来替换 Abs 模块,该自定义用 ScalarFcn
库中的自定义实现 CRL_abs_d
替换常规 fabs
函数。您使用 ScalarOp
库中的自定义实现 CRL_d_add_d_d_cao
替换 Add 模块。
打开具有 Add 模块和 Abs 模块的模型 mMultiLibrary_abs
。
model = 'mMultiLibrary_abs'; open_system(model); copyfile multipleFnRtwTargetInfo.txt rtwTargetInfo.m
MATLAB® 自定义文件 hcrl_make_abs
和 hcrl_sum_float
已经执行。运行 sl_refresh_customizations 函数来注册库 ScalarFcn
和 ScalarOp
。
sl_refresh_customizations;
选择代码替换库
打开配置参数对话框。
在配置参数对话框中,根据硬件目标设置正确的设备供应商和设备类型。在这个示例中,
Intel
是设备供应商,x86-64(Windows64)
是设备类型。在界面窗格中,通过点击选择并将代码替换库添加到选定的代码替换库 - 优先列表窗格中来设置代码替换库参数。对于此示例,选择 ScalarFcn 和 ScalarOp。这些库可以在 Windows® 平台上运行。Linux® 用户必须提供不同的库。
根据您希望在生成的代码中替换代码替换库的优先级对其进行排序。顺序顶部的代码替换库在代码替换时具有更高的优先级。
或者,使用命令行 API 来启用代码替换:
set_param('mMultiLibrary_abs','CodeReplacementLibrary','ScalarFcn,ScalarOp')
为模型生成代码。
evalc('slbuild(model)');
注意:注册代码替换库时,代码替换库名称中不能使用逗号。
查看生成的带有替换的代码。这是 mMultiLibrary_abs.c
的一部分。
cfile = fullfile('mMultiLibrary_abs_ert_rtw','mMultiLibrary_abs.c'); coder.example.extractLines(cfile,'/* Model step function ','/* Model initialize function',1, 1);
/* Model step function */ void mMultiLibrary_abs_step(void) { int32_T i; /* Outport: '<Root>/Out1' incorporates: * Abs: '<Root>/Abs1' * Inport: '<Root>/In1' */ mMultiLibrary_abs_Y.Out1 = CRL_abs_d(mMultiLibrary_abs_U.In1); /* Outport: '<Root>/Output' incorporates: * Inport: '<Root>/In2' * Inport: '<Root>/In3' * Sum: '<Root>/Add' */ for (i = 0; i < 2500; i++) { mMultiLibrary_abs_Y.Output[i] = CRL_d_add_d_d_cao(mMultiLibrary_abs_U.In2[i], mMultiLibrary_abs_U.In3[i]); } /* End of Outport: '<Root>/Output' */ }
生成的代码包含自定义代码替换库 ScalarFcn
启用的 CRL_abs_d
函数。请注意,该库仅适用于 Windows。代码中还包含 ScalarOp
代码替换库启用的 CRL_d_add_d_d_cao
函数。选择多个代码替换库可以对生成的代码进行多项优化。
关闭模型和代码生成报告。
delete ./rtwTargetInfo.m
bdclose(model)
限制:
当您使用不同的参量类型(例如矩阵和标量)时,优先级顺序将被忽略。矩阵代码替换库的优先级高于标量代码替换库,无论代码替换库指定的顺序如何。
当代码替换库参数指定语言标准(例如通过其 BaseTfl)并且它与语言标准参数不匹配时,将使用语言标准参数指定的库。