生成的代码交流数据与环境如何
使用生成的代码从一个模型,你调用生成的入口点函数等一步
和初始化
。你调用这些函数的环境必须提供输入信号数据,这取决于您的应用程序,调度信息。然后生成算法计算输出数据,调用环境中可以使用。环境和算法可以交换这些数据通过全局变量或通过形式参数(参数)。
的输入和输出数据集和交换机制构成的入口点函数的接口。当你理解了默认接口以及如何控制它们,您可以:
编写代码来调用生成的代码。
生成可重用的代码(凹),您可以在单个应用程序调用多次。
将生成的代码与其他外部代码在您的应用程序。
在一个模型中,root轮廓尺寸和外港块代表主块算法的输入和输出。默认情况下,代码生成器将这些块聚合为标准结构存储输入和输出数据。
信息是如何生成的代码存储内部数据,不参与模型界面,看到的如何生成的代码存储内部信号、状态和参数数据。
数据接口在生成的代码
这个例子展示了如何生成的代码与环境的交流数据。
探索模型示例
打开示例模型rtwdemo_roll
。
open_system (“rtwdemo_roll”)
在根级别,模型有很多尺寸的块和一个输出港。
在模型中,集配置参数> >系统目标文件生成代码来grt.tlc
。
set_param (“rtwdemo_roll”,“SystemTargetFile”,“grt.tlc”)
检查设置接口代码生成配置参数> > >包装代码接口。设置那种一次性的功能
意味着生成的代码不重用(不可重入的)。
对于这个示例,来生成简单的代码,清除代码生成配置参数> > > Mat-file日志界面>高级参数。
set_param (“rtwdemo_roll”,“MatFileLogging”,“关闭”)
生成那种一次性代码
从模型中生成代码。
rtwbuild (“rtwdemo_roll”)
# # #开始构建过程模型:rtwdemo_roll # # #成功完成构建过程模型:rtwdemo_roll
检查文件rtwdemo_roll.h
。代表输入数据的文件定义一个结构类型和类型表示输出数据。
文件= fullfile (“rtwdemo_roll_grt_rtw”,“rtwdemo_roll.h”);rtwdemodbtype(文件,…/ *外部输入(根尺寸信号用默认存储)* /”,…“}ExtY_rtwdemo_roll_T;”,1,1)
/ *外部输入(根尺寸信号与默认存储)* / typedef struct {real32_Tφ;/ * < Root > /φ的* / real32_T Psi;/ * < Root > / Psi的* / real32_T Rate_FB;/ * < Root > / Rate_FB”* / real32_T助教;/ * < Root > /助教的* / boolean_T AP_Eng;/ * < Root > / AP_Eng”* / boolean_T HDG_Mode;/ * < Root > / HDG_Mode”* / real32_T HDG_Ref;/ * < Root > / HDG_Ref”* / real32_T Turn_Knob;/ * < Root > / Turn_Knob”* /} ExtU_rtwdemo_roll_T;/ *外部输出(根外港美联储通过信号与默认存储)* / typedef struct {real32_T Ail_Cmd; /* '/Ail_Cmd' */ } ExtY_rtwdemo_roll_T;
每个字段对应一个尺寸或外港块模型的根级别的。每个字段的名称来源于物体的名称。
文件还定义了一个结构类型,实时模型数据结构的单场存储运行时指示是否生成的代码执行期间遇到了一个错误。
rtwdemodbtype(文件,“/ *实时模型数据结构* /”,…“/ *块状态(默认存储)* /”,1,0)
/ *实时模型数据结构* / struct tag_RTM_rtwdemo_roll_T {const char_T * errorStatus;};
当你修改模型配置参数以满足您的应用程序,这种结构还可以包含其他数据属于整个模型,例如调度信息。
为代表的结构类型的实时模型数据结构,该文件rtwdemo_roll_types.h
创建一个别名(类型定义
生成的代码后使用)为结构分配内存。
文件= fullfile (“rtwdemo_roll_grt_rtw”,“rtwdemo_roll_types.h”);rtwdemodbtype(文件,“rtModel * / / *前置声明”,…“RT_MODEL_rtwdemo_roll_T;”,1,1)
/ *前申报rtModel * / typedef struct tag_RTM_rtwdemo_roll_T RT_MODEL_rtwdemo_roll_T;
使用这些结构类型,该文件rtwdemo_roll.c
定义(分配内存)全球结构变量存储输入和输出数据生成的算法。文件还定义了变量代表的实时模型数据结构和一个指向结构的指针。
文件= fullfile (“rtwdemo_roll_grt_rtw”,“rtwdemo_roll.c”);rtwdemodbtype(文件,…/ *外部输入(根尺寸信号用默认存储)* /”,…“= &rtwdemo_roll_M_;”,1,1)
/ *外部输入(根尺寸信号与默认存储)* / ExtU_rtwdemo_roll_T rtwdemo_roll_U;/ *外部输出(根外港美联储通过信号与默认存储)* / ExtY_rtwdemo_roll_T rtwdemo_roll_Y;/ * * /实时模型RT_MODEL_rtwdemo_roll_T rtwdemo_roll_M_;RT_MODEL_rtwdemo_roll_T * const rtwdemo_roll_M = &rtwdemo_roll_M_;
该文件rtwdemo_roll.h
这些结构变量声明。外部代码可以包括(# include
这个文件)的通用名称模型。h
在哪里模型
模型的名称,参与模型接口来访问数据。
在rtwdemo_roll.c
,该模型一步
代表主函数模型算法,使用无效
无效
接口(不带参数)。
rtwdemodbtype(文件,…“/ *模型阶跃函数* /”,“空白rtwdemo_roll_step(空白),1,1)
/ *模型阶跃函数* /空白rtwdemo_roll_step(空白)
函数定义,算法读取输入数据和写入输出数据通过直接访问全球结构变量。例如,算法结束的附近的代码EngSwitch
块读取的值AP_Eng
字段(代表一个输入),该值的基础上,有条件地写一个恒定的值Ail_Cmd
字段(代表一个输出)。
rtwdemodbtype(文件,“如果(rtwdemo_roll_U.AP_Eng) {',“}”,1,1)
如果(rtwdemo_roll_U.AP_Eng){/ *输出原子子系统:“< Root > / BasicRollMode”* / / *饱和:“< S1 > / CmdLimit”如果(rtwdemo_roll_Y * /。Ail_Cmd > 15.0 f){/ *总和:“< S1 > / Sum2”包含:*外港:“< Root > / Ail_Cmd”* / rtwdemo_roll_Y。Ail_Cmd f = 15.0;}{如果(rtwdemo_roll_Y。Ail_Cmd< -15.0F) { /* Sum: '/Sum2' incorporates: * Outport: ' /Ail_Cmd' */ rtwdemo_roll_Y.Ail_Cmd = -15.0F; }
由于无效
无效
接口和直接数据访问,是不可重入的函数。如果你在应用程序中多次调用该函数,每次调用读取和写入输入和输出数据相同的全局结构变量,导致数据损坏和无意之间的交互调用。
模型初始化函数,rtwdemo_roll_initialize
,初始化所有的输入和输出数据为零。函数初始化错误状态。直接访问全局变量的函数,这意味着函数是不可重入的。
rtwdemodbtype(文件,“/ *模型初始化函数* /”,…“rtmSetErrorStatus (rtwdemo_roll_M (NULL));“,1,1)
/ *模型初始化函数* /空白rtwdemo_roll_initialize (void){/ *注册码* / / *初始化错误状态* / rtmSetErrorStatus (rtwdemo_roll_M (NULL));
rtwdemodbtype(文件,“/ *外部输入* /”,…“/ * SystemInitialize原子子系统:”,1,0)
/ *外部输入* / (void) memset (&rtwdemo_roll_U (void *), 0, sizeof (ExtU_rtwdemo_roll_T));/ *外部输出* / rtwdemo_roll_Y。Ail_Cmd f = 0.0;
生成可重用的代码
您可以配置生成的代码是可重入的,这意味着您可以在一个应用程序中多次调用的入口点函数。在这个配置中,而不是直接访问全局变量,交换入口点函数的输入,输出,和其他模型数据通过形式参数(指针参数)。与这些指针参数,每次调用可以读取输入和输出写入一组单独的全局变量,防止无意之间的交互调用。
在模型中,集接口代码生成配置参数> > >包装代码接口来可重用的功能
。
set_param (“rtwdemo_roll”,“CodeInterfacePackaging”,“可重用函数”)
从模型中生成代码。
rtwbuild (“rtwdemo_roll”)
# # #开始构建过程模型:rtwdemo_roll # # #成功完成构建过程模型:rtwdemo_roll
现在,在rtwdemo_roll.h
,实时模型数据结构包含指向错误提示,输入数据、输出数据和额外的数据的形式DWork
子结构(商店,例如,块等州的状态离散时间积分器块)。
文件= fullfile (“rtwdemo_roll_grt_rtw”,“rtwdemo_roll.h”);rtwdemodbtype(文件,“/ *实时模型数据结构* /”,…“/ *外部数据声明为相关的源文件* /,1,0)
/ *实时模型数据结构* / struct tag_RTM_rtwdemo_roll_T {const char_T * errorStatus;ExtU_rtwdemo_roll_T *输入;ExtY_rtwdemo_roll_T *输出;DW_rtwdemo_roll_T * dwork;};
多次调用生成的代码在应用程序中,您的代码必须分配内存的实时模型数据结构/电话。该文件rtwdemo_roll.c
定义了一个专门的函数,为一个新的实时模型数据结构分配内存,并返回一个指向结构的指针。函数也分配内存的子结构模型数据结构中的字段指向,如输入和输出结构。
文件= fullfile (“rtwdemo_roll_grt_rtw”,“rtwdemo_roll.c”);rtwdemodbtype(文件,“/ *模型数据分配函数* /”,…“RT_MODEL_rtwdemo_roll_T * rtwdemo_roll(空白),1,1)
/ *模型数据分配函数* / RT_MODEL_rtwdemo_roll_T * rtwdemo_roll(空白)
在rtwdemo_roll.c
,该模型一步
函数接受一个参数,表示数据结构的实时模型。
文件= fullfile (“rtwdemo_roll_grt_rtw”,“rtwdemo_roll.c”);rtwdemodbtype(文件,…“/ *模型阶跃函数* /”,“空白rtwdemo_roll_step”,1,1)
/ *模型阶跃函数* /空白rtwdemo_roll_step (RT_MODEL_rtwdemo_roll_T * const rtwdemo_roll_M)
函数定义,算法首先提取每个指针从实时模型数据结构到一个本地变量。
rtwdemodbtype(文件,…‘* rtwdemo_roll_DW = ',“rtwdemo_roll_M - >输出;”,1,1)
DW_rtwdemo_roll_T * rtwdemo_roll_DW = ((DW_rtwdemo_roll_T *) rtwdemo_roll_M - > dwork);ExtU_rtwdemo_roll_T * rtwdemo_roll_U = (ExtU_rtwdemo_roll_T *) rtwdemo_roll_M - >输入;ExtY_rtwdemo_roll_T * rtwdemo_roll_Y = (ExtY_rtwdemo_roll_T *) rtwdemo_roll_M - >输出;
然后,访问输入和输出数据存储在全局内存,该算法与这些局部变量。
rtwdemodbtype(文件,“如果(rtwdemo_roll_U - > AP_Eng) {”,…/ *开关结束:“< Root > / EngSwitch”* /的,1,1)
如果(rtwdemo_roll_U - > AP_Eng){/ *输出原子子系统:“< Root > / BasicRollMode”* / / *饱和:“< S1 > / CmdLimit”* /如果(rtwdemo_roll_Y - > Ail_Cmd > 15.0 f){/ *总和:“< S1 > / Sum2”包含:*外港:“< Root > / Ail_Cmd”* / rtwdemo_roll_Y - > Ail_Cmd f = 15.0;其他}{如果(rtwdemo_roll_Y - > Ail_Cmd < -15.0 f){/ *总和:“< S1 > / Sum2”包含:*外港:“< Root > / Ail_Cmd”* / rtwdemo_roll_Y - > Ail_Cmd f = -15.0;}}/ *饱和结束:“< S1 > / CmdLimit”结束* / / *输出子系统:“< Root > / BasicRollMode”其他* /}{/ *总和:“< S1 > / Sum2”包含:*不变:“< Root > /零”*外港:“< Root > / Ail_Cmd”* / rtwdemo_roll_Y - > Ail_Cmd f = 0.0;}
同样,模型初始化函数接受实时模型数据结构作为参数。
rtwdemodbtype(文件,…“/ *模型初始化函数* /”,“空白rtwdemo_roll_initialize”,1,1)
/ *模型初始化函数* /空白rtwdemo_roll_initialize (RT_MODEL_rtwdemo_roll_T * const rtwdemo_roll_M)
因为每个调用,你让一个入口点函数与一个单独的实时交互模型的数据结构,可以避免无意之间的交互调用。
配置数据接口
控制数据接口的特点在生成的代码中,看到的控制数据和功能接口生成的代码。
相关的话题
- 标准数据结构生成的代码
- 使用实时模型的数据结构
- 外部代码集成是什么?
- 分析生成的代码接口(嵌入式编码)
- 控制数据和功能接口生成的代码(嵌入式编码)
- 如何生成的代码存储内部信号、状态和参数数据(嵌入式编码)