当前位置: 首页 > news >正文

状态机枚举应用框架

简介状态机应用比较广泛不同工作状态切换、寄存器数据采集多可以使用状态。比如电量灯显、从机寄存器数据获取。一、状态机框架根据不同的功能切换不同的工作状态。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 | (1bit) #define MODBUS_CLR_BIT(val,bit) val ~(1bit) #define MODBUS_GET_BIT(val,bit) val(1bit) 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 --; }
http://www.zskr.cn/news/1376765.html

相关文章:

  • UVa 285 Crosswords
  • 番茄小说下载器:Rust架构下的多格式内容获取与处理系统深度解析
  • 全面战争:战锤3 2026官方正版最新版pc免费下载(看到请立即转存 资源随时失效)手机版通用
  • Linux线程控制:从用户态控制到内核级克隆全链路解析
  • OneMore:深度解析如何突破OneNote内容管理瓶颈的全能插件
  • 3步掌握视频转PPT:从数小时手动截图到3分钟智能提取
  • 百考通一键生成高校标准任务书框架
  • 解决方案:猫抓浏览器扩展 - 现代网页媒体资源捕获与流媒体解析的专业工具
  • 机器学习势函数揭秘行星深处二氧化硅相变与熔化行为
  • 小佩智能猫砂机 MAX 二代深度拆机与原理剖析
  • Selenium工程化实践:定位、等待与Page Object的稳定性设计
  • [实战] 制造业数字化中的气泡图标注(Balloon Annotation)规范与全流程解析
  • 3个步骤掌握AMD Ryzen处理器调试:免费开源SMUDebugTool完整教程
  • 深入理解 ARMv7-A|异常/中断处理
  • 机器学习优化核物理α衰变预测:从两势方法到超重核探索
  • 终极AMD处理器调试指南:5步掌握硬件性能调优核心技巧
  • 符号的魔法:数学、物理、化学中那些有趣的故事
  • 终极指南:如何快速解锁网易云NCM加密音乐,实现格式自由转换
  • 2026宿迁黄金 铂金 白银 彩金回收口碑榜出炉:这五家店稳居前列,靠谱又放心 - 前途无量YY
  • AlienFX Tools终极指南:如何轻松掌控Alienware灯光与风扇
  • MySQL报错注入与堆叠注入的底层原理与实战对抗
  • 告别黄牛票!5分钟配置大麦网自动化抢票神器
  • 2026宿州黄金 铂金 白银 彩金回收口碑榜出炉:这五家店稳居前列,靠谱又放心 - 前途无量YY
  • 魔兽争霸III终极增强方案:WarcraftHelper完整配置与优化指南
  • LaTeX公式到Word转换终极指南:3分钟搞定学术文档排版难题
  • Claude Code从安装到使用详细教程(2026最新版)可绑定国内模型DeepSeek或智谱GLM
  • MAPED技术:电子衍射材料分析新突破
  • 周报5.24
  • 超详细AttentionTransformer:从原理到完整架构全覆盖
  • 大模型---MetaGPT