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

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

3天内不再提示

聊聊C语言|特殊状态机

玩转单片机 来源:玩转单片机 2023-06-18 14:12 次阅读

|核心机制

状态机是非常常用的框架之一,本质就是通过记录状态值来执行对应动作,但是有个问题就是每个对应的状态值都有对应的动作,如果碰到需要等待信号量再触发的情况下需要特定处理,有没更好的方法处理这种情况呢,答案很多是有的。要解决这需求就要保证代码退出时和下次进入时的位置是不变的,怎么实现呢?

实现这个需求的方式有很多,这里就使用纯C来实现:

#include

intfunction(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;
}

简单优化一下:

#include

intstate=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

    文章

    525

    浏览量

    67921
  • C语言
    +关注

    关注

    180

    文章

    7575

    浏览量

    134792
  • 状态机
    +关注

    关注

    2

    文章

    489

    浏览量

    27408

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

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

收藏 人收藏

    评论

    相关推荐

    基于C语言状态机实现方案

    关于状态机,基础的知识点可以自行理解。本文主要讲解的是一个有限状态机FSM通用的写法,目的在于更好理解,移植,节省代码阅读与调试时间,体现出编程之美。
    发表于 09-13 09:28 674次阅读
    基于<b class='flag-5'>C</b><b class='flag-5'>语言</b>的<b class='flag-5'>状态机</b>实现方案

    如何设计自动驾驶系统的状态机

    状态机模块在自动驾驶系统中扮演着关键的角色,它负责管理和控制各个功能的状态转换和行为执行。今天我们来聊聊如何设计自动驾驶系统的状态机
    发表于 09-19 15:07 2075次阅读
    如何设计自动驾驶系统的<b class='flag-5'>状态机</b>

    c语言状态机资料(转)

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

    有限状态机的硬件描述语言设计方法

    实验目的 1、 熟悉用硬件描述语言(VHDL)设计一般状态机所包含的几个基本部分;2、 掌握用硬件描述语言(VHDL)设计Moore型和Mealy型有限状态机的方法;3、 了解
    发表于 09-03 09:48 0次下载

    状态机举例

    状态机举例 你可以指定状态寄存器和状态机状态。以下是一个有四种状态的普通状态机。 // Th
    发表于 03-28 15:18 947次阅读

    状态机原理及用法

    状态机原理及用法状态机原理及用法状态机原理及用法
    发表于 03-15 15:25 0次下载

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

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

    浅谈状态机的要素、分类

    说到单片编程,不得不说到状态机状态机做为软件编程的主要架构已经在各种语言中应用,当然包括C语言
    的头像 发表于 10-20 17:27 4892次阅读

    FPGA:状态机简述

    本文目录 前言 状态机简介 状态机分类 Mealy 型状态机 Moore 型状态机 状态机描述 一段式
    的头像 发表于 11-05 17:58 7143次阅读
    FPGA:<b class='flag-5'>状态机</b>简述

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

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

    状态模式(状态机)

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

    C语言状态机编程思想

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

    单片状态机浅谈

    说到单片编程,不得不说到状态机状态机做为软件编程的主要架构已经在各种语言中应用,当然包括C语言
    发表于 02-10 10:44 10次下载
    单片<b class='flag-5'>机</b>之<b class='flag-5'>状态机</b>浅谈

    如何生成状态机框架

    生成状态机框架 使用FSME不仅能够进行可视化的状态机建模,更重要的是它还可以根据得到的模型自动生成用C++或者Python实现的状态机框架。首先在FSME界面左边的树形列表中选择"R
    的头像 发表于 09-13 16:54 854次阅读
    如何生成<b class='flag-5'>状态机</b>框架

    什么是状态机状态机的种类与实现

    状态机,又称有限状态机(Finite State Machine,FSM)或米利状态机(Mealy Machine),是一种描述系统状态变化的模型。在芯片设计中,
    的头像 发表于 10-19 10:27 8244次阅读