通过外部代码定义一个指针访问结构化数据
这个例子展示了如何生成代码使用全局数据,一些手写的代码定义了。在手写代码,一个指针变量指向一个包含参数数据的三个结构变量。手写功能开关之间的结构的指针。生成的代码访问非关联化的参数数据的指针变量。
探索外部代码
打开示例源代码文件rtwdemo_importstruct_user.c
。代码定义了一个默认的数据结构变量ReferenceStruct
常数(常量
)数据和静态初始化每个字段。这个结构代表了参考数据集。
/ *常量默认数据结构(参考数据集)* / const DataStruct_type ReferenceStruct ={11日/ *抵消* / 2 / *获得* /};
代码定义了另外两个结构变量,WorkingStruct1
和WorkingStruct2
挥发性(挥发性
)数据。
/ *不稳定的数据结构(工作数据集)* /不稳定DataStruct_type WorkingStruct1;挥发性DataStruct_type WorkingStruct2;
代码定义了一个函数,可以初始化:
一个不活跃的工作结构从活动的工作结构。
两个工作结构的参考结构。
/ *函数来初始化不活跃的工作结构从活跃的结构* /空白InitInactiveWorkingStructs(空白){如果(StructPointer = = &WorkingStruct1){/ *复制值从WorkingStruct1 WorkingStruct2 * / memcpy ((void *) &WorkingStruct2 (void *) &WorkingStruct1 sizeof (ReferenceStruct));}else if (StructPointer = = &WorkingStruct2){/ *复制值从WorkingStruct2 WorkingStruct1 * / memcpy ((void *) &WorkingStruct1 (void *) &WorkingStruct2 sizeof (ReferenceStruct));其他}{/ *初始化这两个工作结构从ReferenceStruct * / memcpy ((void *) &WorkingStruct1 &ReferenceStruct, sizeof (ReferenceStruct));memcpy ((void *) &WorkingStruct2 &ReferenceStruct, sizeof (ReferenceStruct));}}
代码定义StructPointer
,这是一个常量不稳定
指向结构的指针。初始化指针指向的地址的代码ReferenceStruct
。
/ *定义结构指针。默认指向参考结构* / const波动DataStruct_type * StructPointer = &ReferenceStruct;
最后,代码定义了一个函数,可以动态地设置StructPointer
指要么ReferenceStruct
,WorkingStruct1
,或WorkingStruct2
。
/ *函数结构之间切换* /空白SwitchStructPointer (Dataset_T数据集){开关(集){案例Working1: StructPointer = &WorkingStruct1;打破;案例Working2: StructPointer = &WorkingStruct2;打破;默认值:StructPointer = &ReferenceStruct;}}
头文件的例子rtwdemo_importstruct_user.h
定义枚举Dataset_T
和结构类型Datastruct_type
。文件包括(# include
)内置模型®编码器™头文件金宝apprtwtypes.h
定义(类型定义
)仿金宝app真软件编码器数据类型等int16_T
。
# include“rtwtypes。h”typedef enum{参考= 0、Working1 Working2} Dataset_T;typedef struct DataStruct_tag {int16_T抵消;/ *抵消* / int16_T所得;/ *获取* /}DataStruct_type;
该文件还声明全局变量和函数。
外部代码的目的
代码是这样设计的源代码控制算法(生成的还是手写的)可以读取数据ReferenceStruct
,WorkingStruct1
,或WorkingStruct2
由非关联化(- >
)StructPointer
。这两个工作结构(WorkingStruct1
和WorkingStruct2
)位于挥发性记忆和目的是由外部校准工具在运行时改变。校准工程师不会改变活动的工作结构。相反,工程师改变参数值在不活跃的工作结构,然后通过切换激活工作结构。
如果有必要的安全或准备关闭应用程序,可以校准工具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
的名称,这是外部代码定义结构类型的例子。
在模型中,配置参数对话框,检查代码生成>自定义代码窗格。
在额外的源代码选项卡上,选择初始化代码。该参数值指定的代码包括在生成的模型初始化函数。在这个模型中,配置参数设置,这样生成的代码调用InitInactiveWorkingStructs
函数。InitInactiveWorkingStructs
初始化值的工作结构ReferenceStruct
。然后初始化代码设置指针指向第一个工作结构。
在代码信息选项卡上,选择源文件。这个配置参数识别外部代码文件示例rtwdemo_importstruct_user.c
包含在代码生成后的构建过程。
生成和检查代码
从模型中生成代码。
在生成的文件rtwdemo_importstruct.c
,模型初始化函数调用InitInactiveWorkingStructs
。该算法在模型中执行(一步
)函数取消引用指针变量StructPointer
。