|核心机制
状态机是非常常用的框架之一,本质就是通过记录状态值来执行对应动作,但是有个问题就是每个对应的状态值都有对应的动作,如果碰到需要等待信号量再触发的情况下需要特定处理,有没更好的方法处理这种情况呢,答案很多是有的。要解决这需求就要保证代码退出时和下次进入时的位置是不变的,怎么实现呢?
实现这个需求的方式有很多,这里就使用纯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文章
595浏览量
69153 -
C语言
+关注
关注
183文章
7642浏览量
144625 -
状态机
+关注
关注
2文章
497浏览量
28852
原文标题:C语言|特殊状态机
文章出处:【微信号:玩转单片机,微信公众号:玩转单片机】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
基于C语言的状态机实现方案
如何设计自动驾驶系统的状态机
有限状态机的硬件描述语言设计方法
什么是状态机?状态机5要素
状态模式(状态机)
C语言状态机编程思想

聊聊C语言|特殊状态机
评论