你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

介绍单片机C语言的状态机编程思想

[复制链接]
gaosmile 发布时间:2021-1-7 12:23
有限状态机概念
; v0 F+ o; V4 T9 w0 e9 F! R

& j2 s0 S) D1 ~& L5 _有限状态机是一种概念思想,把复杂的控制逻辑分解成有限个稳定状态,组成闭环系统,通过事件触发,让状态机按设定的顺序处理事务。单片机C语言的状态机编程,是利用条件选择语句(switch、case或者if、else)切换状态,通过改变状态机状态,让程序按设定的顺序执行。1 M, b6 f: S6 v
有限状态机由有限的状态和相互之间的转移构成,在任何时候只能处于给定数目的状态中的一个。当接收到一个输入事件时,状态机产生一个输出,同时也可能伴随着状态的转移。状态机的原理如下:在当前状态下,发生某个事件后转移到下一个状态,然后决定执行的功能动作。可参考如下示意图:
微信图片_20210107122023.png
应用举例3 Z5 z$ j! ^) J( j
要想使用状态机思想进行编程,需要将任务分解成有限个稳定状态。
7 d: f- c( R1 r  u! H6 w6 S% n& z这里以常见的按键动作进行举例说明:
微信图片_20210107122026.jpg
上图为按键典型的动作图,可以分解为四个状态,分别为:
5 n% B: v7 C- q& M4 j. s( B状态1 = 按键弹起、- h. Q  H5 f7 K
状态2 = 前沿抖动、
6 x- f, U# H2 Z7 x- u2 y( n+ c* f状态3 = 按键按下、
9 F9 u8 m( Z' b0 p状态4 = 后沿抖动。
0 T. G* N0 w) s- z6 W0 p有限状态机的C代码实现如下:
! c# Z3 R# M: b) Q# u" ^
if (定时器 >= 10ms) //10ms是典型消抖时间
$ p: S+ F. m4 S% P6 r4 {. _1 e{3 `1 W( j, f4 i8 B9 F) {
   switch (按键状态)  X& X1 M6 O- r7 |/ o
   {0 e& t* F+ G0 q5 E, m0 J; e+ B
     case 按键弹起状态:
7 L( `. J& A+ Y# D- g7 x! a: p2 R      if (IO读取为低电平) 按键状态=前沿抖动; 6 H) z; U; \" f, Q9 y! W1 y
     break;
1 U# `8 ~$ e2 `: D, P+ g0 Y$ K     case 前沿抖动状态:8 g2 v; U! R' G  a
      if (IO读取为低电平) 按键状态=按键按下;   j3 m4 ?* [; i/ M4 n* S  x
     break;
" _. @' h0 {/ w. ]0 C  p" \     case 按键按下状态:
8 {5 S  E3 g) m8 O9 }      if (IO读取为高电平) 按键状态=后沿抖动;
/ M% F% ]& [; d- y+ [     break;
2 k5 ^7 I1 L% _0 I     case 后沿抖动状态:  e0 J. }4 O3 S7 V2 o
      if (IO读取为高电平) 按键状态=按键弹起; 4 ?- R0 Y4 q1 |) Z2 y
     break;2 @7 O# u8 A9 ^# t
default:按键状态=按键弹起;. ?1 k2 x: C1 j( T% r3 l
   }
$ y( C. B+ D4 l8 `$ \}
5 `1 \5 q7 B- t
状态机编程建议: g3 j4 E9 ^0 M& |
巧妙的使用结构体和枚举一方面可以便于扩展和维护状态机的状态和事件,另一方面可提高程序的可读性。假设有3种状态(状态数可以随意增加),状态枚举如下:8 |, a7 [  r( E6 W1 R
typedef enum {
! F6 p- ~% x& o6 S  state_1=1,* B- s1 ?  }1 i% R
  state_2,
" z% k4 b1 a& X- R  state_36 a( R3 |" Z5 x. r. a2 V
}State;
/ e0 l/ b4 {, f7 E
假设有5个事件(也可以随意增加),事件枚举如下:- Y" d7 q! i4 Z3 U$ m" G, V8 R
typedef enum{) m9 N. O! }1 n9 n7 C
  event_1=1,; i* m5 w5 H" x* l3 E, g3 y' D
  event_2,
1 m: R6 A! N$ n) F3 h' [$ B  event_3,. b( E. |5 d$ \# H0 \$ l( G7 }
  event_4,
1 Q$ b/ [8 a* O  event_5
, z- k% r0 P' o4 }$ U! j! j/ l, G}Event;
* C+ l6 ]$ }# e1 |& v  P) ]/ Y
' Y" d9 ~3 \# x7 ]$ z4 @
定义一个结构体描述如下:) A% g/ Q" d  I% B% a+ m
typedef struct {
, R! z7 ]3 ?, ]1 l# Z) s8 q  State curState;      //当前状态, Q) F# J1 R2 E; D$ H, M* b8 L$ n
  Event eventId;      //事件
7 n3 o" u. r6 `9 N: o0 ]  State nextState;   //下一个状态! ~  N( p3 d, O7 _- n% Y
  Action action;     //动作功能
( |5 J2 ]2 O' C, X4 ?5 p( {5 q}StateEvent;
) z+ B5 T: P. j$ P
根据具体的应用场景调整State和Event,并赋予相应的动作功能,整体的基本流程如下:当前状态->有事件触发->跳到下一个状态->具体的动作功能
微信图片_20210107122029.jpg
总结状态机应用很广泛,也可以锻炼逻辑思维,LoRa消息推送也常采用状态机的思想, 实际上状态机涉及的知识点很多,本篇文章只是简要的介绍了下单片机C语言的状态机编程思想,在日后的开发设计中,需要不断的总结经验并灵活应用。
( p7 D6 W& U9 _6 x) u) d2 s' |% z5 a2 i
赞 收藏 1 评论0 发布时间:2021-1-7 12:23

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版