news 2026/5/25 9:12:32

状态机枚举应用框架

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
状态机枚举应用框架

简介

状态机应用比较广泛,不同工作状态切换、寄存器数据采集多可以使用状态。

比如:电量灯显、从机寄存器数据获取。

一、状态机框架

根据不同的功能,切换不同的工作状态。

typedef enum ReadDeviceDat_e { PS_R_STA1, PS_R_STA2, PS_R_STA3, PS_R_STA4, PS_R_NUM }PS_ReadIDeviceDat_e; PS_ReadIDeviceDat_e g_enReadDeviceDat = PS_R_STA1; switch(g_enReadDeviceDat) { case PS_R_STA1: ... break; case PS_R_STA2: ... break; case PS_R_STA3: ... break; case PS_R_STA4: ... break; default:break; }

二、状态机+定时器框架

适用于执行一个动作之后,需要定时一段时间执行另一个操作的场景。

#define PS_MODULES_RX_LEN 10 #define SYSTEM_5MS_FLAG 0 #define SYSTEM_10MS_FLAG 1 #define MODBUS_SET_BIT(val,bit) val |= (1<<bit) #define MODBUS_CLR_BIT(val,bit) val &= ~(1<<bit) #define MODBUS_GET_BIT(val,bit) val&(1<<bit) typedef struct PS_Tim_s { uint16_t m_u16SystemTimFlag; uint16_t m_u16SysTim10ms; }PS_SysTim_S; _GLOBEXT_ PS_SysTim_S g_stuSysTim; typedef enum ReadDeviceDat_e { PS_R_STA1, PS_R_STA2, PS_R_STA3, PS_R_STA4, PS_R_NUM }PS_ReadIDeviceDat_e; PS_ReadIDeviceDat_e g_enReadDeviceDat = PS_R_STA1; switch(g_enReadDeviceDat) { case PS_R_STA1: ... ... MODBUS_CLR_BIT(g_stuSysTim.m_u16SystemTimFlag,SYSTEM_10MS_FLAG); g_stuSysTim.m_u16SysTim10ms = 0; g_enReadDeviceDat = PS_R_STA2; break; case PS_R_STA2: if(MODBUS_GET_BIT(g_stuSysTim.m_u16SystemTimFlag,SYSTEM_10MS_FLAG)) { ... ... MODBUS_CLR_BIT(g_stuSysTim.m_u16SystemTimFlag,SYSTEM_10MS_FLAG); g_stuSysTim.m_u16SysTim10ms = 0; g_enReadDeviceDat = PS_R_STA3; } break; case PS_R_STA3: if(MODBUS_GET_BIT(g_stuSysTim.m_u16SystemTimFlag,SYSTEM_10MS_FLAG)) { ... ... MODBUS_CLR_BIT(g_stuSysTim.m_u16SystemTimFlag,SYSTEM_10MS_FLAG); g_stuSysTim.m_u16SysTim10ms = 0; g_enReadDeviceDat = PS_R_STA4; } break; case PS_R_STA4: if(MODBUS_GET_BIT(g_stuSysTim.m_u16SystemTimFlag,SYSTEM_10MS_FLAG)) { ... ... MODBUS_CLR_BIT(g_stuSysTim.m_u16SystemTimFlag,SYSTEM_10MS_FLAG); g_stuSysTim.m_u16SysTim10ms = 0; g_enReadDeviceDat = PS_R_STA1; } break; default:break; }

定时器时间需要单独在定时器中计时,计时到了就置位。

void pri_iic_commu_tim5ms(void) { if(get_sta) //根据实际应用 { g_stuSysTim.m_u16SysTim10ms++; if(g_stuSysTim.m_u16SysTim10ms >= 10) //10ms { g_stuSysTim.m_u16SysTim10ms = 0; MODBUS_SET_BIT(g_stuSysTim.m_u16SystemTimFlag,SYSTEM_10MS_FLAG); } } }

三、状态机+定时器优化版

这个代码量更少,适用于FLASH、RAM空间紧张的场景,使用起来也比较简单。

#define SET_TIME_20MS 20 //20ms typedef enum ReadDeviceDat_e { PS_R_STA1, PS_R_STA2, PS_R_STA3, PS_R_STA4, PS_R_NUM }PS_ReadIDeviceDat_e; PS_ReadIDeviceDat_e g_enReadDeviceDat = PS_R_STA1; uint16_t g_u16timer = 0; void fun(void) { if(g_u16timer != 0) { return; } g_u16timer = SET_TIME_20MS; switch(g_enReadDeviceDat ) { case PS_R_STA1: ... break; case PS_R_STA2: ... break; case PS_R_STA3: ... break; case PS_R_STA4: ... break; default:break; } } void Timer(void) { if(g_u16timer > 0) g_u16timer --; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/25 9:12:29

3分钟搭建专业级3D抽奖系统:Magpie-LuckyDraw完整使用指南

3分钟搭建专业级3D抽奖系统&#xff1a;Magpie-LuckyDraw完整使用指南 【免费下载链接】Magpie-LuckyDraw &#x1f3c5;A fancy lucky-draw tool supporting multiple platforms&#x1f4bb;(Mac/Linux/Windows/Web/Docker) 项目地址: https://gitcode.com/gh_mirrors/ma/M…

作者头像 李华
网站建设 2026/5/25 9:12:28

《Java 100 天进阶之路》第24篇:Java枚举类型 enum 用法

第24篇&#xff1a;Java枚举类型 enum 用法 &#x1f4cc; 系列导航&#xff1a;《Java 100 天进阶之路》完整目录 | ⬅️ 上一篇&#xff1a;第23篇&#xff1a;缓冲区数据结构 ByteBuffer | ➡️ 下一篇&#xff1a;第25篇&#xff1a;Java类加载与初始化 一、核心知识点 en…

作者头像 李华
网站建设 2026/5/25 9:08:31

计算机网络 --- OSPF

获取未知网段路由信息的方法&#xff1a;静态路由 --- 由网络管理员手工配置的路由信息动态路由 --- 所有路由器运行相同的路由协议&#xff0c;由路由器之间彼此沟通交流&#xff0c;最终计算出到达未知网段的路由信息AS --- 自治系统IGP --- 内部网关协议 --- RIP&#xff0c…

作者头像 李华
网站建设 2026/5/25 9:03:07

深入剖析Android虚拟机与内存管理:原理、优化与实践

引言 在Android开发中,虚拟机(Virtual Machine)与内存管理(Memory Management)是影响应用性能与稳定性的核心因素。随着Android系统的迭代,虚拟机从早期的Dalvik逐步过渡到如今的ART(Android Runtime),其内存管理机制也不断优化。本文将深入探讨ART虚拟机的架构、垃圾…

作者头像 李华