操作Stateflow数据
Stateflow®Simulink中的图表®模型具有一个操作语言属性,该属性定义了可以在状态和转换操作中使用的操作。语言属性是:
MATLAB®作为动作语言。
C作为动作语言。
有关更多信息,请参见作为动作语言的MATLAB和C的语法差异.
二元运算
此表根据优先级顺序(0 =最高,10 =最低)总结了Stateflow图中所有二进制操作的解释。二元运算是左结合的,因此在任何表达式中,具有相同优先级的运算符从左向右求值。其他操作的求值顺序未指定。例如,在这个作业中
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 |
逻辑。对于位与,使用 |
|
|
7 |
不受支持的。对于位异或,使用 |
位异或(默认)。选项启用此操作启用c位操作图表属性。有关更多信息,请参见按位操作而且启用c位操作. | |
8 |
逻辑或。对于位或,使用 |
|
|
9 |
逻辑。 |
逻辑。 |
|
10 |
逻辑或。 |
逻辑或。 |
一元操作和动作
此表总结了状态流图中所有一元操作和动作的解释。一元操作:
具有比二进制操作符更高的优先级。
是右结合律,因此在任何表达式中,它们都是从右向左求值的。
赋值操作
此表总结了状态流图中赋值操作的解释。
操作 |
MATLAB作为动作语言 |
C作为行动语言 |
---|---|---|
|
简单的任务。 |
简单的任务。 |
|
不受支持的。使用类型转换操作覆盖定点提升规则。看到类型转换操作. |
定点数的赋值。看到覆盖C图中的定点提升. |
|
不受支持的。使用这样的表达 |
相当于 |
|
不受支持的。使用这样的表达 |
相当于 |
|
不受支持的。使用这样的表达 |
相当于 |
|
不受支持的。使用这样的表达 |
相当于 |
|
不受支持的。使用这样的表达A = mod(A,b) 或A = rem(A,b) . |
相当于 |
|
不受支持的。使用这样的表达 |
相当于A = A &b (位)。选项启用此操作启用c位操作图表属性。有关更多信息,请参见按位操作而且启用c位操作. |
|
不受支持的。使用这样的表达 |
相当于A = A ^b (按位异或)。选项启用此操作启用c位操作图表属性。有关更多信息,请参见按位操作而且启用c位操作. |
|
不受支持的。使用这样的表达 |
相当于A = A |b (按位或)。选项启用此操作启用c位操作图表属性。有关更多信息,请参见按位操作而且启用c位操作. |
类型转换操作
若要将一种类型的值转换为另一种类型,请使用类型转换操作。可以将数据强制转换为显式类型或另一个变量的类型。
转换为显式数据类型
若要将数值表达式转换为显式数据类型,请使用以下类型转换函数之一:双
,单
,int8
,int16
,int32
,int64
,uint8
,uint16
,uint32
,uint64
,布尔
.例如,该语句强制转换表达式x + 3
到16位无符号整数,并将该值赋给数据y
:
Y = uint16(x+3);
或者,在使用MATLAB作为操作语言的图表中,您可以使用投
功能和指定“替身”
,“单身”
,“int8”
,“int16”
,“int32”
,“int64”
,“uint8”
,“uint16”
,“uint32”
,“uint64”
,或“逻辑”
作为输入参数。例如,该语句强制转换表达式x + 3
到16位无符号整数,并将值赋给y
:
Y = cast(x+3,“uint16”);
要将表达式转换为定点类型,使用MATLAB作为动作语言的图表支持调用fi
(定点设计师)函数。例如,该语句强制转换表达式x + 3
作为一个有符号的不动点值,字长为8位,分数长度为3位:
Y = fi(x+3,1,8,3);
在使用C作为动作语言的图表中,调用投
函数使用fixdt
(模型)表达式作为参数。例如,该语句强制转换表达式x + 3
作为一个有符号的不动点值,字长为8位,分数长度为3位:
Y = cast(x+3,fixdt(1,8,3));
基于其他数据转换类型
为了简化类型转换,可以将数值表达式的类型转换为与另一个Stateflow数据相同的类型。
在使用MATLAB作为动作语言的图表中,调用投
关键字函数“喜欢”
.例如,该语句转换的值x + 3
与数据的类型相同z
并将值赋给y
:
Y = cast(x+3,“喜欢”, z);
在使用C语言作为动作语言的图表中类型
operator返回已存在的Stateflow数据的类型。类中的显式类型使用此返回值投
操作。例如,该语句转换的值x + 3
与数据的类型相同z
并将值赋给y
:
Y = cast(x+3,type(z));
按位操作
此表总结了使用C作为动作语言的状态流图中所有按位操作的解释。
操作 |
描述 |
---|---|
A & b |
位和。 |
A | b |
位或。 |
A ^ b |
按位异或。 |
~一个 |
位没有。 |
|
转变一个 在右边b 位。 |
|
转变一个 在左边b 位。 |
除了位移位操作A >> b
而且A << b
,您必须通过选择启用c位操作图表属性。看到启用c位操作.
位运算作用于二进制级别的整数。非整数操作数首先转换为整数。整数操作数遵循C提升规则来确定结果的中间值。然后将此中间值转换为您为操作结果指定的类型。
位操作和整数溢出
用于为位操作的中间值赋值的隐式强制转换可能导致溢出。若要保留结果的最右边位并避免意外行为,请禁用chart属性整数溢出饱和.
例如,该模型中的两个图表都计算按位操作Y = ~u
.这些图表通过使用32位的目标整数大小计算该操作的中间值,因此该值中最左边的24位都是1。当图表将中间值赋给y
,演员阵容到uint8
导致整数溢出。每个图表的输出取决于图表如何处理整数溢出。
如果在整数溢出上饱和启用时,图表将填充按位操作的结果并输出一个值为零。
如果在整数溢出上饱和禁用时,图表将包装按位操作的结果并输出其最右边的8位。
有关更多信息,请参见整数溢出时饱和.
指针和地址操作
该表总结了使用C作为操作语言的状态流图中指针和地址操作的解释。
操作 |
描述 |
---|---|
|
地址操作。与自定义代码和状态流变量一起使用。 |
|
指针操作。仅与自定义代码变量一起使用。 |
例如,模型sf_bus_demo
包含一个以指针为参数的自定义C函数。当图表调用自定义代码函数时,它使用&
操作按地址传递状态流数据。有关更多信息,请参见在状态流图中集成自定义结构.
在使用MATLAB作为动作语言的图表中,不支持指针和地址操作。指向结构的指针应该只在只读模式下使用,并且只在传递它们的调用期间有效。
用应用程序实现替换操作
如果你有嵌入式编码器®或仿真软件编码器™,您可以配置代码生成器在代码生成期间应用代码替换库(CRL)。代码生成器更改它为操作生成的代码,以满足应用程序的需求。使用Embedded Coder,您可以开发和应用自定义代码替换库。
代码替换库的操作项可以指定整型或定点操作数和结果模式。可以使用操作项进行以下操作:
除了
+
减法
-
乘法
*
部门
/
例如,在这个表达式中,可以替换加法运算符+
通过特定于目标的实现u1
,u2
,y
具有允许与代码替换库中的添加项进行匹配的类型:
Y = u1 + u2
C图表语义限制了操作符条目匹配,因为图表在算术表达式中使用目标整数大小作为中间类型。例如,这个算术表达式计算对目标整数的中间加法:
Y = (u1 + u2) % 3
有关使用MathWorks的代码替换库的更多信息®提供,请参阅什么是代码替换?(仿真软件编码器)而且代码替换库(仿真软件编码器).有关开发自定义代码替换库的信息,请参见什么是代码替换定制?(嵌入式编码)而且可以从Simulink模型中替换的代码(嵌入式编码).