将子系统代码生成为单独的函数和文件
您可以配置原子子系统来将代码生成到一个单独的函数和文件。这使得代码更加模块化,并使您能够对单个子系统的代码进行单元测试。
函数打包 Subsystem 模块参数有两个设置会导致子系统将代码生成为单独的函数。可重用函数选项生成将 I/O、状态和参数作为函数参量传递的函数。不可重用函数选项生成将 I/O、状态和参数作为函数参量和全局数据结构体的组合传递的函数。
子系统函数依赖关系
在为子系统生成代码时,代码可以引用模型的全局数据结构体,即使子系统函数代码位于单独的文件中也是如此。每个子系统代码文件包含 include 指令和描述依赖关系的注释。代码生成器检查循环文件依赖关系,并在编译时生成有关它们的警告。有关代码生成器如何打包代码的描述,请参阅Manage Build Process File Dependencies。
要生成独立于为父模型生成的代码的子系统函数代码,请将子系统放置在库中并将其配置为可重用子系统,如Generate Reusable Code from Library Subsystems Shared Across Models中所述。
如果您有 Embedded Coder®,可以为由具有不同函数接口的可重用子系统组成的库生成代码。有关详细信息,请参阅:
将子系统生成为可重用函数
1.打开具有子系统的模型,例如 SubsystemAtomic。
SubsystemAtomic

如果您使用的是 Embedded Coder,请从 C 代码选项卡上点击查看代码以打开代码视图编辑器。
2.右键点击 Subsystem 模块。从上下文菜单中选择模块参数(子系统)。
3.在“子系统参数”对话框中,验证视为原子单元处于选中状态。在该参数处于选中状态下,代码生成选项卡上的函数打包参数可用。
4.点击代码生成选项卡,并从函数打包参数中选择 Reusable function。这将启用两个参数:
5.将文件名选项参数设置为 Use subsystem name。
6.点击应用并关闭对话框。
7.如果您使用的是 Embedded Coder,请打开“配置参数”对话框。验证模型配置参数文件打包格式设置为“模块化”。
8.生成代码。
#include "SS1.h"
/* Include model header file for global data */
#include "SubsystemAtomic.h"
#include "SubsystemAtomic_private.h"
/* Outputs for atomic system: '<Root>/SS1' */
real_T myfun(DW_myfun_T *localDW)
{
/* DiscreteIntegrator: '<S1>/Integrator' */
return localDW->Integrator_DSTATE;
}
/* Update for atomic system: '<Root>/SS1' */
void myfun_Update(real_T rtu_In1, DW_myfun_T *localDW)
{
/* Update for DiscreteIntegrator: '<S1>/Integrator' */
localDW->Integrator_DSTATE += rtu_In1;
}
可重用函数 myfun 将输入和状态作为参量传递给子系统函数。
有关详细信息,请参阅Generate Reentrant Code from Subsystems和 Generate Reusable Code from Library Subsystems Shared Across Models。
将子系统生成为不可重用函数
1.打开具有子系统的模型,例如 SubsystemAtomic。
SubsystemAtomic

如果您使用的是 Embedded Coder,请从 C 代码选项卡上点击查看代码以打开代码视图编辑器。
2.右键点击 Subsystem 模块。从上下文菜单中选择模块参数(子系统)。
3.在“子系统参数”对话框中,验证视为原子单元处于选中状态。在该参数处于选中状态下,代码生成选项卡上的函数打包参数可用。
4.点击代码生成选项卡,并从函数打包参数中选择 Nonreusable function。这将启用两个参数:
5.将文件名选项参数设置为 Use subsystem name。
6.点击应用并关闭对话框。
7.如果您使用的是 Embedded Coder,请打开“配置参数”对话框。验证模型配置参数文件打包格式设置为“模块化”。
8.生成代码。
#include "SS1.h"
/* Include model header file for global data */
#include "SubsystemAtomic.h"
#include "SubsystemAtomic_private.h"
/* Outputs for atomic system: '<Root>/SS1' */
void myfun(void)
{
/* Outport: '<Root>/Out1' incorporates:
* DiscreteIntegrator: '<S1>/Integrator'
*/
SubsystemAtomic_Y.Out1 = SubsystemAtomic_DW.Integrator_DSTATE;
}
/* Update for atomic system: '<Root>/SS1' */
void myfun_Update(void)
{
/* Update for DiscreteIntegrator: '<S1>/Integrator' */
SubsystemAtomic_DW.Integrator_DSTATE += SubsystemAtomic_B.Sum;
}
不可重用函数 myfun 通过全局数据结构体 SubsystemAtomic_Y 和 SubsystemAtomic_DW 传递输入和状态。