通过外部代码定义一个指针访问结构化数据
这个例子展示了如何生成代码使用全局数据,一些手写的代码定义了。在手写代码,一个指针变量指向一个包含两个结构变量的参数数据。手写功能开关两种结构之间的指针。生成的代码访问非关联化的参数数据的指针变量。
探索外部代码
打开示例源代码文件rtwdemo_importstruct_user.c
。定义一个结构变量的代码ReferenceStruct
常数(常量
)数据和静态初始化每个字段。
/ *常量默认数据结构:ReferenceStruct * / const DataStruct_type ReferenceStruct ={11日/ *抵消* / 2 / *获得* /};
代码定义了另一个结构变量,WorkingStruct
挥发性(挥发性
)数据。
/ *不稳定数据结构:WorkingStruct * /不稳定DataStruct_type WorkingStruct;
代码定义了一个函数,拷贝字段值ReferenceStruct
来WorkingStruct
。
/ *函数来初始化与数据从ReferenceStruct WorkingStruct * /空白Init_WorkingStruct (void) {memcpy ((void *) &WorkingStruct &ReferenceStruct, sizeof (ReferenceStruct));}
代码定义StructPointer
,这是一个常量不稳定
指向结构的指针。初始化指针指向的地址的代码ReferenceStruct
。
/ *创建默认的数据结构体指针,如ReferenceStruct * / const波动DataStruct_type * StructPointer = &ReferenceStruct;
最后,代码定义了一个函数,可以动态地设置StructPointer
指要么ReferenceStruct
或WorkingStruct
。
/ *函数结构之间切换* /空白SwitchStructPointer (Dataset_T数据集){开关(集){案例工作:StructPointer = &WorkingStruct;打破;默认值:StructPointer = &ReferenceStruct;}}
头文件的例子rtwdemo_importstruct_user.h
定义枚举Dataset_T
和结构类型Datastruct_type
。文件包括(# include
)内置模型®编码器™头文件万博1manbetxrtwtypes.h
定义(类型定义
)仿万博1manbetx真软件编码器数据类型等int16_T
。
# include“rtwtypes。h”typedef enum{参考= 0,工作}Dataset_T;typedef struct DataStruct_tag {int16_T抵消;/ *抵消* / int16_T所得;/ *获取* /}DataStruct_type;
该文件还声明全局变量和函数。
外部代码的目的
代码是这样设计的源代码控制算法(是否生成或手写的)可以读取数据ReferenceStruct
或WorkingStruct
由非关联化(- >
)StructPointer
。软件工程师可以编写代码来动态地切换StructPointer
之间的地址WorkingStruct
和ReferenceStruct
通过对应的枚举成员作为输入参数调用SwitchStructPointer
函数。
之后,在算法执行时准备校准,校准工具StructPointer
指出WorkingStruct
。该工具可以修改的字段WorkingStruct
。
如果有必要的安全或准备关闭应用程序,可以校准工具StructPointer
来ReferenceStruct
代替。ReferenceStruct
店默认参数值,在执行过程中不改变。
探索模型示例
打开示例模型,rtwdemo_importstruct
。
模型底部的工作区中创建变量和对象。常数块和块使用ECoderDemos.Parameter
对象获得
和抵消
设置恒定值和获得块的参数。ECoderDemos
是一个示例定制包,它定义了两个类,参数
和信号
和一些自定义存储类。
在模型中,选择编辑器视图>模型数据。
在模型数据编辑器,检查参数选项卡。
设置改变观点下拉列表,代码
。
单击显示/刷新的额外信息按钮。
模型数据编辑器显示了对应的行恒定值和获得参数对应的块和行抵消
和获得
设置参数值。在存储类列,抵消
和获得
使用自定义存储类StructPointer
,ECoderDemos
包定义。
打开自定义存储类设计师和检查的自定义存储类ECoderDemos
包中。在命令提示符下,使用这个命令:
cscdesigner (“ECoderDemos”)
这个示例包定义了多个自定义存储类,包括StructPointer
。你不能编辑的定义。但是,您可以创建您自己的包和自定义存储类。为例,展示了如何创建一个包和一个自定义存储类,明白了创建和应用自定义存储类。
下自定义存储类定义,点击StructPointer
。这个自定义存储类的设置使生成的代码与指针变量,StructPointer
,从外部代码。例如,自定义存储类使用这些设置:
数据范围被设置为
进口
因为外部代码定义的例子(分配内存)StructPointer
。采用这个设置代码生成器,避免产生不必要的重复数据项定义,如ECoderDemos.Parameter
使用自定义存储类的对象。数据访问被设置为
指针
因为在外部代码的例子中,StructPointer
是一个指针。记忆的部分被设置为
ConstVolatile
因为外部代码定义的例子StructPointer
为常数,挥发性数据(常量不稳定
)。类型被设置为
FlatStructure
因为在外部代码的例子中,StructPointer
指向一个结构。这个设置,生成的代码将每个数据项(ECoderDemos.Parameter
对象)作为一个领域的平面结构的变量名,您可以指定类型的名字。在结构属性选项卡,结构体名称被设置为
StructPointer
。对于一个FlatStructure
自定义存储类,结构体名称指定的名称结构变量在生成的代码中。在这个例子中,StructPointer
的名字是外部代码定义的变量。类型名称被设置为
DataStruct_type
的名称,这是外部代码定义结构类型的例子。
在模型中,配置参数对话框,检查代码生成>自定义代码窗格。
下插入自定义生成C代码中,选择初始化函数。在这个模型中,这个配置参数设置,这样生成的代码调用Init_WorkingStruct
函数执行前的主要算法。Init_WorkingStruct
初始化领域的WorkingStruct
的值ReferenceStruct
。
下额外的构建信息中,选择源文件。这个配置参数识别外部代码文件示例rtwdemo_importstruct_user.c
包含在代码生成后的构建过程。
生成和检查代码
从模型中生成代码。
在生成的文件rtwdemo_importstruct.c
,模型初始化函数调用Init_WorkingStruct
。
/ *模型初始化函数* /空白rtwdemo_importstruct_initialize (void){/ *用户代码(初始化函数体)* / / *初始化易失存储器数据集在切换到前* / Init_WorkingStruct ();}/ *
该算法在模型中执行(一步
)函数取消引用指针变量StructPointer
。
/ *模型阶跃函数* /空白rtwdemo_importstruct_step (void){/ *获得:“< Root > /增益”包含:*不变:“< Root > /抵消”*尺寸:< Root > /在“*金额:< Root > /笔的* / Sensor_Out = (int16_T) ((int16_T) (Sensor_In - StructPointer - >抵消)* StructPointer - >获得);}