文档

使用枚举数据在生成的代码

枚举数据类型

枚举数据是限制在一个有限的数据设置的值。一个枚举数据类型MATLAB是一种®类定义了一组枚举值。每一个枚举值包含一个枚举的名字和一个潜在的整数内部软件使用和生成的代码。下面是一个MATLAB类定义为枚举数据类型命名BasicColors,这是在这一节中的示例使用。

classdef BasicColors <仿金宝app真软件。IntEnumType枚举红(0)黄(1)蓝(2)结束

为枚举数据类型的基本信息及其在仿真软件中使用金宝app®模型,看到使用枚举数据在仿真软件模型金宝app(金宝app模型)。在Stateflow枚举数据类型信息®图表,看定义枚举数据类型(Stateflow)。

为枚举指定整数数据类型

当你指定一个枚举数据类型,您可以:

  • 枚举数据类型的大小控制生成的代码通过指定一个超类。

  • 减少RAM /罗使用。

  • 提高代码的可移植性。

  • 改善与遗留代码的集成。

您可以指定这些整数数据类型:

  • int8

  • uint8

  • int16

  • uint16

  • int32

  • 金宝appSimulink.IntEnumType。指定带符号整数的值的范围为您的硬件平台。

使用一个类定义的MATLAB文件

指定一个整数数据类型大小、枚举类来自整数数据类型。

classdef颜色< int8枚举红(0)绿(1)蓝(2)结束结束

代码生成器生成此代码:

typedef int8_T颜色;#定义红(0)(颜色)#定义绿色((颜色)1)# define蓝色((颜色)2)

使用的函数金宝appSimulink.defineIntEnumType

指定一个整数数据类型大小、指定名称-值对StorageType整数数据类型。

金宝appSimulink.defineIntEnumType (“颜色”,{“红色”,“绿色”,“蓝”},(0,1,2),“StorageType”,“int8”)

代码生成器生成此代码:

typedef int8_T颜色;#定义红(0)(颜色)#定义绿色((颜色)1)# define蓝色((颜色)2)

自定义枚举数据类型

当你从一个模型生成代码,使用枚举数据,您可以实现这些静态方法来定制的行为类型在模拟和生成的代码:

  • getDefaultValue——指定枚举数据类型的默认值。

  • getDescription——指定枚举数据类型的描述。

  • getHeaderFile——指定头文件类型定义生成的代码。

  • getDataScope——指定生成的代码是否出口或进口枚举数据类型定义或从一个单独的头文件。

  • addClassNameToEnumNames——指定是否生成的代码的类名变成了一个前缀。

第一种方法,getDefaultValue,相关仿真和代码生成,和描述指定一个默认的枚举值(金宝app模型)。另一种方法是相关代码生成。自定义枚举类型的行为,包括一个版本的方法方法(静态)部分枚举类的定义。如果你不想定制类型,省略了方法(静态)部分。表总结了方法和数据为每一个供应。

静态方法 目的 默认值没有实现方法 自定义返回值
getDefaultValue 指定默认的枚举成员的类。 第一个成员中指定枚举定义 特征向量包含一个枚举成员的名称的类(见实例化枚举(金宝app模型))。
getDescription 指定枚举类的描述。 一个特征向量包含类型的描述。
getHeaderFile 指定一个头文件的名称。该方法getDataScope确定文件的意义。

一个特征向量包含头文件的名称定义枚举类型。

默认情况下,生成的# include指令使用预处理器的分隔符而不是<>。生成的指令# include < myTypes.h >,指定自定义返回值“< myTypes.h >”

getDataScope 指定生成的代码是否出口或进口的定义枚举数据类型。使用这种方法getHeaderFile指定生成的或包含的头文件,它定义了类型。 “汽车” 之一:“汽车”,“出口”,或“进口”
addClassNameToEnumNames 指定是否前缀生成的代码的类名。 真正的

指定一个描述

指定一个描述枚举数据类型,包括该方法的方法(静态)枚举类的部分:

retVal = getDescription()函数% getDescription数据类型的描述(可选)。retVal =“描述”;结束

用MATLAB特征向量代替描述。生成的代码定义枚举类型包括指定的描述。

在生成的代码中导入类型定义

防止生成的代码定义一个枚举数据类型,它允许您提供一个外部文件中的定义,包括这些方法方法(静态)枚举类的部分:

函数retVal = getHeaderFile ()% GETHEADERFILE指定在生成的代码定义这种类型的文件。% getDataScope方法确定指定的文件的重要性。retVal =“imported_enum_type.h”;结束函数retVal = getDataScope ()% GETDATASCOPE指定生成的代码是否进口或出口这种类型。%返回之一:% '汽车':在model_types定义类型。如果头文件指定h,或导入%“出口”:在生成的头文件定义类型%“进口”:从指定头文件导入类型定义%如果您没有定义这个方法,DataScope默认是“汽车”。retVal =“进口”;结束

而不是定义的类型模型_types.h生成的代码,这是默认行为,从指定的进口定义头文件使用# include声明:

# include“imported_enum_type.h”

生成代码不会创建导入的头文件。你必须提供的头文件,使用指定的文件名的方法getHeaderFile,定义枚举数据类型。

创建一个模型对应于现有的金宝appc代码列出,使用金宝appSimulink.importExternalCTypes函数。

出口类型定义生成的代码

生成一个单独的头文件定义枚举数据类型,包括这些方法方法(静态)枚举类的部分:

函数retVal = getDataScope ()% GETDATASCOPE指定生成的代码是否进口或出口这种类型。%返回之一:% '汽车':在model_types定义类型。如果头文件指定h,或导入%“出口”:在生成的头文件定义类型%“进口”:从指定头文件导入类型定义%如果您没有定义这个方法,DataScope默认是“汽车”。retVal =“出口”;结束函数retVal = getHeaderFile ()% GETHEADERFILE指定在生成的代码定义这种类型的文件。% getDataScope方法确定指定的文件的重要性。retVal =“exported_enum_type.h”;结束

生成的代码出口枚举类型定义生成的头文件exported_enum_type.h

类名加前缀

默认情况下,枚举值在生成的代码具有相同的名称的枚举类定义。或者,您的代码可以前缀每个枚举值的枚举类与类的名称。您可以使用这种技术来防止标识符冲突或改善代码的可读性。指定类名加前缀,包括该方法的方法(静态)枚举类的部分:

函数retVal = addClassNameToEnumNames ()% ADDCLASSNAMETOENUMNAMES指定是否要添加类的名字%作为前缀,枚举成员名称生成的代码。%返回true或false。%如果您没有定义这个方法,没有添加前缀。retVal = true;结束

指定返回值真正的使加前缀或类名压制加前缀。如果您指定真正的在课堂上,每一个枚举值出现在生成的代码EnumTypeName_EnumName。枚举类的示例BasicColors枚举数据类型,数据类型定义中生成的代码可能会看起来像这样:

的ifndef _DEFINED_TYPEDEF_FOR_BasicColors_ # define _DEFINED_TYPEDEF_FOR_BasicColors_ typedef enum {BasicColors_Red = 0, / *默认值* / BasicColors_Yellow = 1, BasicColors_Blue = 2,} BasicColors;# endif

枚举类名BasicColors似乎每个枚举名称作为前缀。

控制使用重复的枚举成员的名字

当你导入枚举数据从一个头文件,您可以控制使用重复的代码生成期间枚举成员名。重复的枚举成员名提高代码的可读性。使用该模型配置参数重复的枚举成员名允许重复的枚举成员的名字在不同的枚举类型代码生成或生成一个错误或警告消息。您可以使用复制枚举成员只有两个枚举有相同的名字StorageType和这些规范:

  • DataScope设置为“进口”

  • StorageType设置为“int8”,“int16”,“int32”,“uint8”,或“uint16”

  • 价值都是一样的

例如:

typedef int32_T enum{红色= 0,黄色= 1,蓝色= 2,};typedef int32_T enum{黑= 0,黄色= 1,白色= 2,}B;
你可以有一个黄色的枚举成员枚举一个B没有前缀的成员名和类名来提高代码的可读性。

枚举类型控制生成的代码实现

假设您定义一个枚举类型BasicColors。您可以指定生成的代码实现通过使用类型定义:

  • 一个枚举块。本机整数类型的硬件底层整数类型的枚举成员。

  • 一个类型定义声明和一系列的#定义宏。的类型定义声明,基地在特定整数数据类型,枚举类型名称等int8。宏将枚举成员与底层的整数值。

实现通过使用枚举类型枚举

实现通过使用一个类型定义枚举布洛克:

  • 在仿真金宝app软件中,通过使用一个定义枚举类型classdef块在一个脚本文件中。派生的枚举类型金宝appSimulink.IntEnumType

  • 另外,使用函数金宝appSimulink.defineIntEnumType。没有指定的财产吗StorageType

当您生成代码时,出现在一个类型定义枚举块。

的ifndef _DEFINED_TYPEDEF_FOR_BasicColors_ # define _DEFINED_TYPEDEF_FOR_BasicColors_ typedef enum{红= 0,/ *默认值* /黄色、蓝色,}BasicColors;# endif

使用特定的整数类型实现枚举类型

实现使用一个类型定义类型定义语句和#定义宏:

  • 在仿真金宝app软件中,定义枚举类型使用classdef块在一个脚本文件中。推导出等特定的整数类型的枚举int8

  • 另外,使用函数金宝appSimulink.defineIntEnumType。指定属性StorageType使用特定的整数类型等int8

当您生成代码时,类型定义作为一个出现类型定义声明和一系列的#定义宏。

的ifndef _DEFINED_TYPEDEF_FOR_BasicColors_ # define _DEFINED_TYPEDEF_FOR_BasicColors_ typedef int8_T BasicColors;#定义红((BasicColors) 0) / *默认值* / # define黄色((BasicColors) 1) # define蓝色((BasicColors) 2) # endif

默认情况下,生成的文件模型_types.h包含枚举类型定义。

为枚举类型铸造

安全的铸件

一个金宝app模型数据类型转换块接受一个整数类型的信号。块将输入转换为枚举类型的基本价值观之一。

如果输入值不匹配一个潜在价值的枚举类型的值,仿真软件插入一个安全投来代替输入值的枚举类型默认值。金宝app

启用和禁用安全的铸件

期间您可以启用或禁用安全铸造枚举代码生成模型数据类型转换块或Stateflow块。金宝app

控制安全铸造、启用或禁用浸透在整数溢出块参数。参数是这样工作的:

  • 启用:金宝app仿真软件取代了nonmatching输入值和默认值的枚举值模拟。软件生成一个安全的演员在代码生成功能。

  • 禁用:nonmatching输入值,在模拟仿真软件生成一个错误。金宝app省略了的软件安全投在代码生成功能。在这种情况下,代码更高效。然而,代码可能更容易受到运行时错误。

安全函数生成的代码

这个例子显示了如何安全的功能int32_T ET08_safe_cast_to_BasicColors的枚举BasicColors出现在生成的代码生成32位硬件。

静态int32_T ET08_safe_cast_to_BasicColors (int32_T输入){int32_T输出;/ *初始化输出值为BasicColors默认值(红色)* /输出= 0;如果((输入> = 0)& &(输入< = 2)){/ *输出值设置为输入值如果它属于BasicColors * /输出=输入;}返回输出;}
通过此功能,使用枚举类型的默认值,如果输入值不匹配的基础值的枚举类型的值。

如果块的浸透在整数溢出参数是禁用的,这个函数没有出现在生成的代码。

枚举类型的限制

  • 生成的代码不支持日志记录枚举数据。金宝app

另请参阅

||

相关的话题