0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

c语言|简单的状态机

玩转单片机 来源:玩转单片机 2023-06-14 09:13 次阅读

不管做什么或者实现什么功能,必定会有实现需求的步骤,简单理解就是在某个状态下做某事,这就很符合C语言面向过程的特点,个人认为面向对象其实是面向过程的封装,封装的好处自然就是符合人的思维,以及便于后续的修改移植工作。

| 简单的状态机

相信读者们刚入门学习单片机的时候,应该比较常使用标志位来触发任务运行,这就是简单的状态机。

//主函数
intmain()
{
intflag=0;
while(1)
{
if(flag==0)
{
task_A();
}
elseif(flag==1)
{
task_B();
}
elseif(flag==2)
{
task_C();
}
......
}
}

往往判断语句太多不利于阅读,那就需要对上面的代码进行优化:

//主函数
intmain()
{
intflag=0;
while(1)
{
switch(flag)
{
case0x00:
task_A();
break;
case0x01:
task_B();
break;
case0x02:
task_C();
break;
......
default:
break;
}
}
}

|封装状态机

在项目中使用状态机往往需要封装一下,避免全局变量标志到处飞就不好修改和维护项目,最好的方法就是高内聚低耦合

voidtest(void)
{
staticstate;
if(state==0)
{
if(!task_A())
{
state=1;
}
}
elseif(state==1)
{
if(!task_B())
{
state=2;
}
}
elseif(state==2)
{
if(!task_C())
{
state=0;
}
}
}

intmain()
{
while(1)
{
test();
}
}

|附件

简单写个小demo,加深一下对状态机的理解,这些状态都是面向有限的状态而言。

#include"stdio.h"
#include"stdint.h"

typedefstruct
{
uint8_tflag;
}task_struct;

//触发任务
voidtask_open(task_struct*task)
{
if(!task->flag)
{
task->flag=!task->flag;
}
}

//关闭任务
voidtask_close(task_struct*task)
{
if(task->flag)
{
task->flag=!task->flag;
}
}

//任务初始化
voidtask_init(void)
{
/*初始化*/
//printf("testinit
");
}

//任务处理
voidtask_handle(void)
{
printf("testhandle
");
}

//轮训任务
voidtask_A(task_struct*task,uint8_ttype)
{
if(!task->flag)
{
task_init();
}
else
{
if(!type)
{
/*单次执行*/
task_handle();
/*关闭任务*/
task_close(task);
}
else
{
/*循环执行*/
task_handle();
}
}
}

intmain()
{
task_structtaskA;
task_open(&taskA);
while(1)
{
task_A(&taskA,0);
}

}




审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6001

    文章

    43973

    浏览量

    620854
  • C语言
    +关注

    关注

    180

    文章

    7530

    浏览量

    128763
  • 状态机
    +关注

    关注

    2

    文章

    486

    浏览量

    27182
  • 单封装
    +关注

    关注

    0

    文章

    5

    浏览量

    5307

原文标题:C语言|状态机

文章出处:【微信号:玩转单片机,微信公众号:玩转单片机】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    状态机编程

    状态机编程基于状态机的按键输入软件接口设计一般的教课书中给出的按键输入软件接口程序通常非常简单,在程序中一旦检测到按键输入口为低电平时(图9-2),便采用(调用)软件延时程序延时10ms。然后再
    发表于 07-10 18:00

    状态机简单应用--可乐贩售

    本帖最后由 eehome 于 2013-1-5 09:59 编辑 简单状态机应用,初学者可以看看!
    发表于 07-20 09:03

    c语言状态机资料(转)

    c语言状态机资料 亲 喜欢的拿去用吧
    发表于 08-07 14:32

    raw os 之状态机编程

    hsm 状态机的概念读者自行参考有关概念学习,这里不再表述。推荐看Practical UML Statecharts in c/c++这本书。raw os的状态机理念,很大部分参考了它
    发表于 02-27 14:35

    状态机

    状态机与移位寄存器的简单实例
    发表于 06-21 17:37

    简单状态机与枚举相结合的程序

    做的一个简单状态机与枚举相结合的程序,挺简单的。
    发表于 08-15 08:06

    怎样同时用LAD和ST语言去描写状态机

    怎样用LAD语言表达状态机?怎样用ST语言表达状态机?怎样同时用LAD和ST语言去描写状态机
    发表于 09-30 06:01

    什么是状态机状态机是如何编程的?

    什么是状态机状态机是如何编程的?
    发表于 10-20 07:43

    什么是状态机

    )。。。就是说我们需要将不同的情况划分为不同的状态,每个状态对应相应的操作。这只是状态机的一个很简单的举例。如果单个状态也是一个
    发表于 01-06 08:01

    状态机的相关资料下载

    以前写状态机,比较常用的方式是用 if-else 或 switch-case,高级的一点是函数指针列表。最近,看了一文章《c语言设计模式–状态模式(
    发表于 02-15 06:01

    VHDL语言状态机电路中的设计

    简要介绍了 VHDL 语言进行工程设计的优点,并详细说明了利用VHDL语言设计状态机电电路的过程,最后进行了仿真,仿真结果证明该设计能够实现状态机电路的功能。
    发表于 07-18 10:31 84次下载
    VHDL<b class='flag-5'>语言</b>在<b class='flag-5'>状态机</b>电路中的设计

    状态机概述 如何理解状态机

    本篇文章包括状态机的基本概述以及通过简单的实例理解状态机
    的头像 发表于 01-02 18:03 1w次阅读
    <b class='flag-5'>状态机</b>概述  如何理解<b class='flag-5'>状态机</b>

    单片机C语言 -- 基于条件选择的状态机编程技巧

    单片机C语言 -- 基于条件选择的状态机编程技巧
    发表于 11-23 17:51 16次下载
    单片机C<b class='flag-5'>语言</b> -- 基于条件选择的<b class='flag-5'>状态机</b>编程技巧

    状态模式(状态机)

    以前写状态机,比较常用的方式是用 if-else 或 switch-case,高级的一点是函数指针列表。最近,看了一文章《c语言设计模式–状态模式(状态机)》(来源:embed lin
    发表于 12-16 16:53 7次下载
    <b class='flag-5'>状态</b>模式(<b class='flag-5'>状态机</b>)

    C语言状态机编程思想

    关注、星标公众号,直达精彩内容文章来源:头条-嵌入式在左C语言在右链接:https://www.toutiao.com/i6843028812112855564/有限状态机概念有限状态机...
    发表于 01-13 13:32 14次下载
    C<b class='flag-5'>语言状态机</b>编程思想