将子系统代码生成为单独的函数和文件
您可以配置原子子系统来将代码生成到一个单独的函数和文件。这使得代码更加模块化,并使您能够对单个子系统的代码进行单元测试。
函数打包 Subsystem 模块参数有两个设置会导致子系统将代码生成为单独的函数。可重用函数选项生成将 I/O、状态和参数作为函数参量传递的函数。不可重用函数选项生成将 I/O、状态和参数作为函数参量和全局数据结构体的组合传递的函数。
子系统函数依赖关系
在为子系统生成代码时,代码可以引用模型的全局数据结构体,即使子系统函数代码位于单独的文件中也是如此。每个子系统代码文件包含 include
指令和描述依赖关系的注释。代码生成器检查循环文件依赖关系,并在编译时生成有关它们的警告。有关代码生成器如何打包代码的描述,请参阅Manage Build Process File Dependencies。
要生成独立于为父模型生成的代码的子系统函数代码,请将子系统放置在库中并将其配置为可重用子系统,如Generate Reusable Code from Library Subsystems Shared Across Models中所述。
如果您有 Embedded Coder®,可以为由具有不同函数接口的可重用子系统组成的库生成代码。有关详细信息,请参阅:
Library-Based Code Generation for Reusable Library Subsystems (Embedded Coder)
文件打包格式 (Embedded Coder)
将子系统生成为可重用函数
1.打开具有子系统的模型,例如 SubsystemAtomic
。
SubsystemAtomic
如果您使用的是 Embedded Coder,请从 C 代码选项卡上点击查看代码以打开代码视图编辑器。
2.右键点击 Subsystem 模块。从上下文菜单中选择模块参数(子系统)。
3.在“子系统参数”对话框中,验证视为原子单元处于选中状态。在该参数处于选中状态下,代码生成选项卡上的函数打包参数可用。
4.点击代码生成选项卡,并从函数打包参数中选择 Reusable function
。这将启用两个参数:
5.将文件名选项参数设置为 Use subsystem name
。
6.点击应用并关闭对话框。
7.如果您使用的是 Embedded Coder,请打开“配置参数”对话框。验证模型配置参数文件打包格式 (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,请打开“配置参数”对话框。验证模型配置参数文件打包格式 (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
传递输入和状态。