主要内容

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

枚举数据类型

枚举数据是受限于有限组值的数据。一个枚举数据类型是一个MATLAB®类的集合枚举值.每个枚举值由枚举的名字和一个潜在的整数软件在内部和生成的代码中使用。以下是枚举数据类型的MATLAB类定义BasicColors,在本节的示例中使用。

classdef BasicColors < 金宝appSimulink. classIntEnumType枚举Red(0) Yellow(1) Blue(2) end end

了解有关枚举数据类型及其在Simulink中的使用的基本信息金宝app®模型,看到在Simulink模型中使用枚举数据金宝app.有关Stateflow中的枚举数据类型的信息®图表,看定义枚举数据类型(Stateflow)

为枚举指定整型数据类型

当您为枚举指定数据类型时,您可以:

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

  • 减少RAM/ROM的使用。

  • 提高代码可移植性。

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

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

  • int8

  • uint8

  • int16

  • uint16

  • int32

  • 金宝app仿真软件。IntEnumType.为您的硬件平台指定带符号整数范围内的值。

中使用类定义MATLAB文件

若要指定整数数据类型大小,请从整数数据类型派生枚举类。

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

代码生成器生成以下代码:

typedef int8_T Colors;#define Red ((Colors)0) #define Green ((Colors)1) #define Blue ((Colors)2)

使用函数金宝appSimulink.defineIntEnumType

若要指定整数数据类型大小,请指定名称-值对StorageType作为整数数据类型。

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

代码生成器生成以下代码:

typedef int8_T Colors;#define Red ((Colors)0) #define Green ((Colors)1) #define Blue ((Colors)2)

自定义枚举数据类型

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

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

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

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

  • getDataScope-指定生成的代码是否将枚举数据类型定义导出到或从单独的头文件导入。

  • addClassNameToEnumNames—指定类名是否在生成的代码中成为前缀。

第一种方法,getDefaultValue,与模拟和代码生成相关,并在指定一个默认枚举值.其他方法只与代码生成相关。方法中包含该方法的一个版本,以自定义枚举类型的行为方法(静态)部分的枚举类定义。如果不想自定义该类型,请省略方法(静态)部分。下表总结了为每种方法提供的方法和数据。

静态方法 目的 默认值无实现方法 自定义返回值
getDefaultValue 指定类的默认枚举成员。 枚举定义中指定的第一个成员 一个字符向量,包含类中枚举成员的名称(参见实例化枚举).
getDescription 指定枚举类的说明。 包含类型描述的字符向量。
getHeaderFile 指定头文件的名称。该方法getDataScope确定文件的重要性。

一个字符向量,包含定义枚举类型的头文件的名称。

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

getDataScope 指定生成的代码是导出还是导入枚举数据类型的定义。使用方法getHeaderFile指定生成的或包含的定义类型的头文件。 “汽车” 之一:“汽车”“出口”,或“进口”
addClassNameToEnumNames 指定是否在生成的代码中给类名加上前缀。 真正的

指定描述信息

为枚举数据类型指定描述,请将此方法包含在方法(静态)枚举类的部分:

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

代入MATLAB字符向量描述.生成的定义枚举类型的代码包含指定的描述。

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

为防止生成的代码定义枚举数据类型,从而允许在外部文件中提供定义,请将这些方法包含在方法(静态)枚举类的部分:

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

而不是定义类型模型_types.h方法从指定的头文件导入定义,这是默认行为# include声明:

# include“imported_enum_type.h”

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

要创建与现有c代码枚举对金宝app应的Simulink枚举,请使用金宝appSimulink.importExternalCTypes函数。

在生成代码中导出类型定义

要生成定义枚举数据类型的单独头文件,请将这些方法包含在方法(静态)枚举类的部分:

函数retVal = getDataScope()指定生成的代码是否导入或导出此类型。返回其中之一:% '自动':在model_types.h中定义类型,如果指定头文件则导入% '导出':在生成的头文件中定义类型% '导入':从指定头文件导入类型定义如果您没有定义此方法,DataScope默认为'Auto'。retVal =“出口”结束函数retVal = getHeaderFile()% GETHEADERFILE在生成的代码中定义此类型的文件。getDataScope方法确定指定文件的重要性。retVal =“exported_enum_type.h”结束

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

为类名添加前缀

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

函数retVal = addClassNameToEnumNames()% ADDCLASSNAMETOENUMNAMES是否添加类名%作为生成代码中枚举成员名的前缀。返回true或false。如果不定义此方法,则不添加前缀。retVal = true;结束

指定返回值为真正的启用类名前缀或as抑制前缀。如果你指定真正的,类中的每个枚举值在生成的代码中显示为EnumTypeName_EnumName.用于示例枚举类BasicColors枚举数据类型,生成代码中的数据类型定义可能如下所示:

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

枚举类名BasicColors作为每个枚举名称的前缀出现。

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

从头文件导入枚举数据时,可以在代码生成期间控制重复枚举成员名的使用。重复的枚举成员名提高了代码的可读性。使用模型配置参数重复枚举成员名在代码生成期间允许不同枚举类型中的重复枚举成员名,或生成错误或警告消息。只有在两个枚举成员名相同的情况下,才可以使用重复的枚举成员名StorageType并有这些规格:

  • DataScope设置为“进口”

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

  • 价值是一样的

例如:

typedef int32_T enum{红= 0,黄= 1,蓝= 2,}A;typedef int32_T enum{黑= 0,黄= 1,白= 2,}B;
你可以有一个黄色的枚举中的枚举成员一个而且B不需要用类名作为成员名的前缀来提高代码的可读性。

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

假设您定义了一个枚举类型BasicColors.你可以通过以下命令指定生成的代码实现类型定义:

  • 一个枚举块。硬件的本机整数类型是枚举成员的基础整数类型。

  • 一个类型定义声明和一系列的#定义宏。的类型定义语句将枚举类型名称基于特定的整数数据类型,例如int8.宏将枚举成员与基础整数值关联起来。

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

类来实现类型定义枚举布洛克:

  • 在Si金宝appmulink中,使用类定义枚举类型classdef块在脚本文件中。从类型派生枚举金宝app仿真软件。IntEnumType

  • 或者,也可以使用函数金宝appSimulink.defineIntEnumType.不指定属性StorageType

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

#ifndef _DEFINED_TYPEDEF_FOR_BasicColors_ #define _DEFINED_TYPEDEF_FOR_BasicColors_ typedef enum {Red = 0, /*默认值*/ Yellow, Blue,} BasicColors;# endif

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

类来实现类型定义类型定义语句和#定义宏:

  • 在Si金宝appmulink中,使用类定义枚举类型classdef块在脚本文件中。从特定的整数类型派生枚举,例如int8

  • 或者,也可以使用函数金宝appSimulink.defineIntEnumType.指定属性StorageType使用特定的整数类型,例如int8

生成代码时,类型定义显示为类型定义声明和一系列的#定义宏。

#define _DEFINED_TYPEDEF_FOR_BasicColors_ typedef int8_T BasicColors;#define Red ((BasicColors)0) /*默认值*/ #define Yellow ((BasicColors)1) #define Blue ((BasicColors)2) #endif . #

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

枚举的类型转换

安全的铸件

Si金宝appmulink数据类型转换块接受整数类型的信号。该块将输入转换为枚举类型的基础值之一。

如果输入值与枚举类型值的基础值不匹配,则Simulink插入一个安全强制转换以用枚举类型默认值替换输入值。金宝app

启用和禁用安全铸造

您可以在Simulink数据类型转换块或状态流块的代码生成期间启用或禁用枚举的安全强制转换。金宝app

若要控制安全铸造,请启用或禁用整数溢出时饱和块参数。参数的作用如下:

  • 启用:金宝app在模拟过程中,Simulink用枚举值的默认值替换不匹配的输入值。软件在代码生成过程中生成安全强制转换函数。

  • 禁用:对于不匹配的输入值,Simulink在模拟过程中产生一个错误。金宝app该软件在代码生成过程中省略了安全强制转换功能。在这种情况下,代码更加高效。然而,代码可能更容易出现运行时错误。

生成代码中的安全强制转换函数

这个例子展示了安全强制转换是如何执行的int32_T ET08_safe_cast_to_BasicColors对于枚举BasicColors为32位硬件生成时出现在生成的代码中。

静态int32_T ET08_safe_cast_to_BasicColors(int32_T输入){int32_T输出;/*初始化输出值为BasicColors (Red)的默认值*/ output = 0;if ((input >= 0) && (input <= 2)){/*如果输出值是BasicColors的成员则将输出值设置为输入值*/ output = input;}返回输出;}
通过此函数,如果输入值与枚举类型的值的基础值之一不匹配,则使用枚举类型的默认值。

如果方块整数溢出时饱和参数禁用时,此函数不会出现在生成的代码中。

枚举类型限制

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

另请参阅

||

相关的话题