RTOS之UCOS(一)--- 有限状态机

本文详细介绍了有限状态机(FSM)的概念,包括定义、要素和C语言实现,并探讨了其在MCU程序设计中的应用,特别是在无操作系统环境下的事件驱动模型。通过状态机,可以将任务进行分割,降低中断处理的复杂性,提高程序的模块化和可读性。文中还提供了状态机在WIFI和BLE协议栈开发中的应用示例,强调了状态机在任务管理和事件响应中的关键作用。
摘要由CSDN通过智能技术生成

一、什么是有限状态机

1.1 有限状态机的定义

有限状态机(FSM: Finite-state machine)是一种用来进行对象行为建模的工具,其作用主要是描述对象在它的生命周期内所经历的状态序列,以及如何响应来自外界的各种事件。它把复杂的控制逻辑分解成有限个稳定状态,在每个状态上判断事件,变连续处理为离散数字处理,符合计算机的工作特点。同时,因为有限状态机具有有限个状态,所以可以在实际的工程上实现。但这并不意味着其只能进行有限次的处理,相反,有限状态机是闭环系统,有限无穷,可以用有限的状态,处理无穷的事务。在计算机科学中,有限状态机被广泛用于建模应用行为、硬件电路系统设计、软件工程,编译器、网络协议、和计算与语言的研究。

1.2 有限状态机的要素

根据有限状态机的定义,可以提炼出几个构成要素,首先是被分解为有限个当前状态,在每个状态上判断事件是否发生,外界事件触发后的响应动作,事件响应后的状态迁移等四个要素。

下面用一个图示和一个数据结构分别描述一个状态机单元:
状态机工作原理

typedef struct FsmTable_s
{
   
    uint8_t event;                /* 触发事件 */
    uint8_t CurState;             /* 当前状态 */
    void (*eventActFun)(void *);  /* 动作函数 */
    uint8_t NextState;            /* 跳转状态 */
}FsmTable_T;

1.3 有限状态机的C语言实现

前面用一个结构体FsmTable_s描述一个当前状态及其触发事件、动作函数和跳转状态等。如果要描述该状态机所有的状态,则可以将每个状态以数组或链表的形式组织起来,考虑到数组较简单且我们需要时刻直到当前所处的状态,故再用一个结构体表示一个状态机如下:

typedef struct FSM_s
{
   
    FsmTable_T *FsmTable;         /* 状态迁移表 */
    uint8_t curState;             /* 状态机当前状态 */
    uint8_t stuMaxNum;            /* 状态机状态迁移数量 */
}FSM_T;

该结构体中一个指针配合一个状态数量构成一个状态数组,再加上当前状态便可描述该状态机的所有状态及当前所处的状态。

由前面状态机的定义可知,状态机是由事件驱动的,我们拿到一个状态机首先要了解其有哪些状态、当前处于哪个状态,其次要清楚当前状态有事件触发时如何响应,所以状态机的实现最重要的是状态机的初始化和事件响应。前面已经给出了描述状态机的数据结构,下面给出状态机的初始化函数与事件响应函数如下:

/*==================================================================
* Function  : FSM_Init
* Description : 状态机初始化
* Input Para  : pFsm状态机对象,pTable状态迁移表,stuMaxNum迁移表数量
*               curState当前状态
* Output Para : 
* Return Value: 
==================================================================*/
void FSM_Init(FSM_T *pFsm, FsmTable_T *pTable, uint8_t stuMaxNum, uint8_t curState)
{
   
    pFsm->FsmTable = pTable;
    pFsm->curState = curState;
    pFsm->stuMaxNum = stuMaxNum;
}

/*==================================================================
* Function  : FSM_EventHandle
* Description : 状态机处理函数
* Input Para  : pFsm状态机对象, event触发事件, parm动作执行参数
* Output Para : 
* Return Value: 
==================================================================*/
void FSM_EventHandle(FSM_T *pFsm, uint8_t event, void *parm)
{
   
    FsmTable_T *pAcTable = pFsm->FsmTable
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流云IoT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值