|核心机制
状态机是非常常用的框架之一,本质就是通过记录状态值来执行对应动作,但是有个问题就是每个对应的状态值都有对应的动作,如果碰到需要等待信号量再触发的情况下需要特定处理,有没更好的方法处理这种情况呢,答案很多是有的。要解决这需求就要保证代码退出时和下次进入时的位置是不变的,怎么实现呢?
实现这个需求的方式有很多,这里就使用纯C来实现:
#includeintfunction(void) { staticintstate; switch(state) { case0: do { printf("state:%d ",state); state=1; return0; case1:; printf("state:%d ",state); }while(0); } } intmain() { function();//输出state:0 function();//输出state:1 function();//输出state:1 while(1) { } }
这里还是采用状态机来实现,由于状态值没有发生改变,函数调用时触发的动作不变,这就保证了函数退出时和再次进入的“入口”相同。
|优化代码
在介绍优化前,先介绍一下C相关的宏:
intmain() { printf("%d ",__LINE__);//显示所在行号 printf("%s ",__func__);//显示所在函数 printf("%s ",__TIME__);//显示当前时间 printf("%s ",__DATE__);//显示当前日期 printf("%s ",__FILE__);//显示所处文件名,在源代码中插入当前源代码文件名 printf("%d ",__STDC__);//编译器遵循ANSI C标准时该标识被赋值为1; return0; }
简单优化一下:
#includeintstate=0; voidfunction_init(void) { state=0; } intfunction_handle(intcondition) { switch(state) { case0: do { state=__LINE__; case__LINE__: if(!condition) return0; else return1; }while(0); } } intmain() { //等待 intcondition=1; function_init(); if(!function_handle(condition)) { printf("pass "); } else { printf("obsolete "); } //触发 condition=0; function_init(); if(!function_handle(condition)) { printf("pass "); } else { printf("obsolete "); } //等待 condition=1; function_init(); if(!function_handle(condition)) { printf("pass "); } else { printf("obsolete "); } //触发 condition=0; function_init(); if(!function_handle(condition)) { printf("pass "); } else { printf("obsolete "); } while(1) { } }
简单封装一下:
#include#defineBegin() switch(state) { case0: #defineWAIT(condition) do { state=__LINE__; case__LINE__: if(!condition) return0; else return1; }while(0) #defineEnd()} intstate=0; voidfunction_init(void) { state=0; } intfunction_handle(intcondition) { Begin(); WAIT(condition); End(); } intmain() { //等待 intcondition=1; function_init(); if(!function_handle(condition)) { printf("pass "); } else { printf("obsolete "); } //触发 condition=0; function_init(); if(!function_handle(condition)) { printf("pass "); } else { printf("obsolete "); } //等待 condition=1; function_init(); if(!function_handle(condition)) { printf("pass "); } else { printf("obsolete "); } //触发 condition=0; function_init(); if(!function_handle(condition)) { printf("pass "); } else { printf("obsolete "); } while(1) { } }
| 最后优化
源码:
#include#include #include #include #definePT_BEGIN() switch(pt->state) { case0: #definePT_END() pt->state=0; return0; } #definePT_WAIT_UNTIL(condition) do { pt->state=__LINE__; case__LINE__: if(!(condition)) return0; }while(0) typedefstruct { uint8_tstate; }pt_t; voidpt_init(pt_t*pt) { pt->state=0; } boolpt_run(pt_t*pt) { returnpt->state!=0; } intthread_fun(pt_t*pt) { staticuint32_tcounter=0; PT_BEGIN(); while(1) { printf("counter=%lu ",counter++); PT_WAIT_UNTIL(counter%10==0); } PT_END(); } intmain() { pt_tpt_a; pt_tpt_b; pt_init(&pt_a); pt_init(&pt_b); while(true) { if(!pt_run(&pt_a)) { thread_fun(&pt_a); } if(!pt_run(&pt_b)) { thread_fun(&pt_b); } } return0; }
最后就完成了一个简单的线程,纯C编写非常方便移植和改写!
审核编辑:刘清
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
封装技术
+关注
关注
12文章
549浏览量
67991 -
C语言
+关注
关注
180文章
7604浏览量
136861 -
状态机
+关注
关注
2文章
492浏览量
27541
原文标题:C语言|特殊状态机
文章出处:【微信号:玩转单片机,微信公众号:玩转单片机】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
基于C语言的状态机实现方案
关于状态机,基础的知识点可以自行理解。本文主要讲解的是一个有限状态机FSM通用的写法,目的在于更好理解,移植,节省代码阅读与调试时间,体现出编程之美。
发表于 09-13 09:28
•848次阅读
如何设计自动驾驶系统的状态机
状态机模块在自动驾驶系统中扮演着关键的角色,它负责管理和控制各个功能的状态转换和行为执行。今天我们来聊聊如何设计自动驾驶系统的状态机 。
发表于 09-19 15:07
•2647次阅读
有限状态机的硬件描述语言设计方法
实验目的
1、 熟悉用硬件描述语言(VHDL)设计一般状态机所包含的几个基本部分;2、 掌握用硬件描述语言(VHDL)设计Moore型和Mealy型有限状态机的方法;3、 了解
发表于 09-03 09:48
•0次下载
状态模式(状态机)
以前写状态机,比较常用的方式是用 if-else 或 switch-case,高级的一点是函数指针列表。最近,看了一文章《c语言设计模式–状态模式(
发表于 12-16 16:53
•9次下载
C语言状态机编程思想
关注、星标公众号,直达精彩内容文章来源:头条-嵌入式在左C语言在右链接:https://www.toutiao.com/i6843028812112855564/有限状态机概念有限状态机
发表于 01-13 13:32
•15次下载
如何生成状态机框架
生成状态机框架 使用FSME不仅能够进行可视化的状态机建模,更重要的是它还可以根据得到的模型自动生成用C++或者Python实现的状态机框架。首先在FSME界面左边的树形列表中选择"R
什么是状态机?状态机的种类与实现
状态机,又称有限状态机(Finite State Machine,FSM)或米利状态机(Mealy Machine),是一种描述系统状态变化的模型。在芯片设计中,
评论