将Stateflow中的Action Language设置为MATLAB;
在Chart中,让两个数相除,如下图所示;Tsig、Tstep、Rate的类型均为uint8 (对应C语言的unsigned char) 如果对该模型进行编译,那么上图中的 Rate = Tsig/Tstep,将生成如下代码:
41 uint8_T x; // 此为生成的中间变量
42 ttt_DW.counter = 0U;
43 ttt_B.out = 0.0;
44 if (ttt_B.Tstep == 0) { //对分母为0的情况进行处理
45 if (ttt_B.Tsig == 0) {
46 ttt_B.Rate = 0U; // 如果分母和分子同时为0,那么计算结果为0
47 } else {
48 ttt_B.Rate = MAX_uint8_T; // 如果仅仅是分母为0,分子并不为0,那么结果为此类型的最大值,即255
49 }
50 } else { // 对分母不为0的情况进行处理
// 如果分母为0,那么结果为类型最大值;
// 否则,进行正常运算
// 为了运算的需要,这里将分子的数据长度进行了临时性的强制转换;
// 计算结束后,数据类型会自动转为Rate的设定类型(uint8)
51 ttt_B.Rate = (uint8_T)(ttt_B.Tstep == 0U ? MAX_uint32_T : (uint32_T)
52 ttt_B.Tsig / ttt_B.Tstep);
// 处理计算结果的“四舍五入”问题
53 x = (uint8_T)((uint32_T)ttt_B.Tsig - (uint8_T)((uint32_T)ttt_B.Rate *
54 ttt_B.Tstep));
// 如果
55 if ((x > 0) && (x >= (int32_T)((uint32_T)ttt_B.Tstep >> 1) + (ttt_B.Tstep &
56 1))) {
57 ttt_B.Rate++;
58 }
59 }
|