对 Stateflow 数据的运算
Simulink® 模型中的 Stateflow® 图具有一个动作语言属性,该属性定义可以在状态和转移动作中使用的运算。语言属性是:
MATLAB® 作为动作语言。
C 语言作为动作语言。
有关详细信息,请参阅使用 MATLAB 和 C 作为动作语言语法时的差异。
二元运算
下表总结了 Stateflow 图中所有二元运算的解释,按优先级顺序列出(0 = 最高,10 = 最低)。二元运算采用左结合,因此在任何表达式中,具有相同优先级的运算符均为从左到右计算。其他运算的计算顺序未指定。例如,在以下赋值中:
A = f() > g();
f()
和 g()
的计算顺序未指定。为了获得更可预测的结果,好的编码做法是将依赖求值顺序的表达式拆分成多个语句。
运算 | 优先级 | MATLAB 作为动作语言 | C 作为动作语言 |
---|---|---|---|
| 0 | 幂。 | 幂。此运算等效于 C 库函数 通过清除启用 C 语言位运算图属性来启用此运算。有关详细信息,请参阅启用 C 语言位运算。 |
| 1 | 乘法。 | 乘法。 |
| 1 | 除法。 | 除法。 |
| 1 | 余数。非整数操作数首先会转换为整数。 | |
| 2 | 加法。 | 加法。 |
| 2 | 减法。 | 减法。 |
| 3 | 不支持。使用 | 将 |
| 3 | 不支持。使用 | 将 |
| 4 | 比较,大于。 | 比较,大于。 |
| 4 | 比较,小于。 | 比较,小于。 |
| 4 | 比较,大于或等于。 | 比较,大于或等于。 |
| 4 | 比较,小于或等于。 | 比较,小于或等于。 |
| 5 | 比较,等于。 | 比较,等于。 |
| 5 | 比较,不等于。 | 比较,不等于。 |
| 5 | 不支持。请使用 | 比较,不等于。 |
| 5 | 不支持。请使用 | 比较,不等于。 |
| 6 | 逻辑 AND。对于按位 AND,请使用 |
有关详细信息,请参阅按位运算和启用 C 语言位运算。 |
| 7 | 不支持。对于按位 XOR,请使用 | 按位 XOR(默认值)。通过选中启用 C 语言位运算图属性来启用此运算。有关详细信息,请参阅按位运算和启用 C 语言位运算。 |
| 8 | 逻辑 OR。对于按位 OR,请使用 |
有关详细信息,请参阅按位运算和启用 C 语言位运算。 |
| 9 | 逻辑 AND。 | 逻辑 AND。 |
| 10 | 逻辑 OR。 | 逻辑 OR。 |
一元运算和动作
下表总结了 Stateflow 图中所有一元运算和动作的解释。一元运算:
优先于二元运算符。
采用右结合,因此在任何表达式中,它们均为从右向左计算。
运算 | MATLAB 作为动作语言 | C 作为动作语言 |
---|---|---|
| 逻辑 NOT。对于按位 NOT,请使用 |
有关详细信息,请参阅按位运算和启用 C 语言位运算。 |
| 不支持。请使用 | 逻辑 NOT。 |
| 求负。 | 求负。 |
| 不支持。请使用表达式 | 递增。等效于 |
| 不支持。请使用表达式 | 递减。等效于 |
赋值运算
下表总结了 Stateflow 图中赋值运算的解释。
运算 | MATLAB 作为动作语言 | C 作为动作语言 |
---|---|---|
| 简单赋值。 | 简单赋值。 |
| 不支持。使用类型转换运算以覆盖定点提升规则。请参阅类型转换运算。 | |
| 不支持。请使用表达式 | 等效于 |
| 不支持。请使用表达式 | 等效于 |
| 不支持。请使用表达式 | 等效于 |
| 不支持。请使用表达式 | 等效于 |
| 不支持。请使用表达式 a = mod(a,b) 或 a = rem(a,b) 。 | 等效于 |
| 不支持。请使用表达式 | 等效于 a = a&b (按位 AND)。通过选中启用 C 语言位运算图属性来启用此运算。有关详细信息,请参阅按位运算和启用 C 语言位运算。 |
| 不支持。请使用表达式 | 等效于 a = a^b (按位 XOR)。通过选中启用 C 语言位运算图属性来启用此运算。有关详细信息,请参阅按位运算和启用 C 语言位运算。 |
| 不支持。请使用表达式 | 等效于 a = a|b (按位 OR)。通过选中启用 C 语言位运算图属性来启用此运算。有关详细信息,请参阅按位运算和启用 C 语言位运算。 |
类型转换运算
要将一种类型的值转换为另一种类型,请使用类型转换运算。您可以将数据转换为显式类型或另一个变量的类型。
转换为显式数据类型
要将数值表达式转换为显式数据类型,请使用以下类型转换函数之一:double
、single
、int8
、int16
、int32
、int64
、uint8
、uint16
、uint32
、uint64
和 boolean
。例如,以下语句将表达式 x+3
转换为 16 位无符号整数,并将该值赋给数据 y
:
y = uint16(x+3);
或者,在使用 MATLAB 作为动作语言的图中,您可以使用 cast
函数并指定 "double"
、"single"
、"int8"
、"int16"
、"int32"
、"int64"
、"uint8"
、"uint16"
、"uint32"
、"uint64"
或 "logical"
作为输入参量。例如,以下语句将表达式 x+3
转换为 16 位无符号整数,并将它的值赋给 y
:
y = cast(x+3,"uint16");
要将表达式转换为定点类型,使用 MATLAB 作为动作语言的图支持调用 fi
(Fixed-Point Designer) 函数。例如,以下语句将表达式 x+3
转换为字长为 8 位、小数长度为 3 位的有符号定点值:
y = fi(x+3,1,8,3);
在使用 C 语言作为动作语言的图中,使用 fixdt
(Simulink) 表达式作为参量来调用 cast
函数。例如,以下语句将表达式 x+3
转换为字长为 8 位、小数长度为 3 位的有符号定点值:
y = cast(x+3,fixdt(1,8,3));
基于其他数据转换类型
为了更方便地转换类型,您可以将数值表达式的类型转换为与另一个 Stateflow 数据相同的类型。
在使用 MATLAB 作为动作语言的图中,使用关键字 "like"
调用 cast
函数。例如,以下语句将 x+3
的值转换为与数据 z
相同的类型,并将该值赋给 y
:
y = cast(x+3,"like",z);
在使用 C 语言作为动作语言的图中,type
运算符返回现有 Stateflow 数据的类型。在 cast
运算中,使用此返回值代替显式类型。例如,以下语句将 x+3
的值转换为与数据 z
相同的类型,并将该值赋给 y
:
y = cast(x+3,type(z));
按位运算
下表总结了在使用 C 语言作为动作语言的 Stateflow 图中的所有位运算的解释。
运算 | 描述 |
---|---|
a & b | 按位 AND。 |
a | b | 按位 OR。 |
a ^ b | 按位 XOR。 |
~a | 按位 NOT。 |
| 将 a 右移 b 位。 |
| 将 a 左移 b 位。 |
除了移位运算 a >> b
和 a << b
以外,您必须通过选择启用 C 语言位运算图属性来启用其他所有按位运算。请参阅启用 C 语言位运算。
按位运算在二进制级别上处理整数。非整数操作数首先会转换为整数。整数操作数按照 C 提升规则来确定结果的中间值。然后,再将此中间值转换为您为运算结果指定的类型。
按位运算和整数溢出
用来为按位运算的中间值赋值的隐式转换会导致溢出。要保留结果的最右侧位并避免意外行为,请禁用图属性对整数溢出进行饱和处理。
例如,此模型中的两个图都计算按位运算 y = ~u
。图通过使用 32 位的目标整数大小来计算此运算的中间值,因此该值中最左侧的 24 个位均为 1。当图将中间值赋给 y
时,向 uint8
的转换会导致整数溢出。每个图的输出取决于图如何处理整数溢出。
如果启用对整数溢出进行饱和处理,图会对按位运算的结果进行饱和处理并输出零值。
如果禁用对整数溢出进行饱和处理,图会对按位运算的结果进行绕回处理,并输出最右侧的八个位。
有关详细信息,请参阅对整数溢出进行饱和处理。
指针和地址运算
下表总结了在使用 C 语言作为动作语言的 Stateflow 图中的指针和地址运算的解释。
运算 | 描述 |
---|---|
| 地址运算。与自定义代码和 Stateflow 变量结合使用。 |
| 指针运算。仅用于自定义代码变量。 |
例如,sf_bus_demo
模型包含接受指针作为参量的自定义 C 函数。当图调用自定义代码函数时,它使用 &
运算按地址传递 Stateflow 数据。有关详细信息,请参阅在 Stateflow 图中集成自定义结构体。
使用 MATLAB 作为动作语言的图不支持指针和地址运算。指向结构体的指针只能在只读模式下使用,并且仅在传递这些指针的调用期间有效。
通过应用程序实现替换运算
如果您有 Embedded Coder® 或 Simulink Coder™,您可以将代码生成器配置为在代码生成期间应用代码替换库 (CRL)。代码生成器更改它为运算生成的代码以满足应用程序要求。使用 Embedded Coder,您可以开发和应用自定义代码替换库。
代码替换库的运算条目可以指定积分或定点操作数和结果模式。您可以对以下运算使用运算条目:
加法
+
减法
-
乘法
*
除法
/
例如,在以下表达式中,如果 u1
、u2
和 y
的类型能匹配代码替换库中的一种加法,则可以用特定于目标的实现替换表达式中的加法运算符 +
:
y = u1 + u2
C 语言状态图语义会限制运算符条目匹配,因为 C 语言状态图使用目标整数大小作为其在算术表达式中的中间类型。例如,以下算术表达式将中间的加法计算为一个目标整数类型的值:
y = (u1 + u2) % 3
有关使用 MathWorks® 提供的代码替换库的详细信息,请参阅什么是代码替换? (Simulink Coder)和代码替换库 (Simulink Coder)。有关开发自定义代码替换库的信息,请参阅What Is Code Replacement Customization? (Embedded Coder)和Code You Can Replace From Simulink Models (Embedded Coder)。