有些场景下,状态机可以使得我们的程序代码变得简洁,可扩展,可维护。

先看下状态迁移图。

代码设计分为五个步骤完成状态机。

#include <stdio.h>// 第一步:定义两个事件
typedef enum {STOP,PLAY_PAUSE,EVE_MAX
} EVENT;// 第二步:定义三种状态
typedef enum {PLAY_STA,PAUSE_STA,STOP_SAT,STA_MAX
} STA;typedef void (*func)(void *p);// 第三步:定义状态机结构体
typedef struct
{EVENT evn;STA currentSta;STA nextSta;func handle;
} M_TB;void func_1(void *p) {};
void func_2(void *p) {};
void func_3(void *p) {};
void func_4(void *p) {};
void func_5(void *p) {};
void func_none(void *p) {};// 第四步:定义状态迁移表
const M_TB statFunc[STA_MAX][EVE_MAX] = {{{STOP, PLAY_STA, STOP_SAT, func_1},{PLAY_PAUSE, PLAY_STA, PAUSE_STA, func_2},},{{STOP, PAUSE_STA, STOP_SAT, func_3},{PLAY_PAUSE, PAUSE_STA, PLAY_STA, func_4},},{{STOP, STOP_SAT, STOP_SAT, func_none},{PLAY_PAUSE, STOP_SAT, PLAY_STA, func_5},},
};typedef struct MP3
{STA sta;
} MP3;// 第五步:定义事件驱动处理函数
void process(EVENT eve, MP3 *mp3, void *pmsg) {statFunc[mp3->sta][eve].handle(pmsg);mp3->sta = statFunc[mp3->sta][eve].nextSta;}int main() {int msg = 10;MP3 mp3 = {PAUSE_STA};printf("%d \n", mp3.sta);process(PLAY_PAUSE, &mp3, (void *)&msg);printf("%d \n", mp3.sta);process(PLAY_PAUSE, &mp3, (void *)&msg);printf("%d \n", mp3.sta);process(PLAY_PAUSE, &mp3, (void *)&msg);printf("%d \n", mp3.sta);process(STOP, &mp3, (void *)&msg);printf("%d \n", mp3.sta);return 0;
}

C语言状态机--MP3的事件驱动实现相关推荐

  1. c语言状态机实现坐标切换,C语言状态机最优模式(转)

    近来思绪有点停不下来,构思了一个GUI的框架(用在Cotex-M平台上,很小),期待以后有时间去实现,里面有一个对触摸屏的检测,自然想到使用状态机进行消息的生成和分发,于是想着实现一个状态机实现的模型 ...

  2. c语言按键状态机,C语言状态机编程思想

    原标题:C语言状态机编程思想 有限状态机概念 有限状态机是一种概念思想,把复杂的控制逻辑分解成有限个稳定状态,组成闭环系统,通过事件触发,让状态机按设定的顺序处理事务.单片机C语言的状态机编程,是利用 ...

  3. C语言解析MP3数据结构

    C语言解析MP3数据结构 本章博客编写的初始原因:MP3一般有CBR和VBR两种格式,其中,正常的VBR会把总帧数记录在MP3数据帧的第一帧中,从而利用总帧数计算MP3的总时间.但是,偶尔会遇到一些m ...

  4. C语言状态机编程思想

    关注.星标公众号,直达精彩内容 文章来源:头条-嵌入式在左C语言在右 链接:https://www.toutiao.com/i6843028812112855564/ 有限状态机概念 有限状态机是一种 ...

  5. c语言状态机_【C语言】有限状态机FSM

    有限状态状态机FSM(finite state machine)是为研究有限内存的计算过程和某些语言类而抽象出的一种计算模型.有限状态自动机拥有有限数量的状态,每个状态可以迁移到零个或多个状态,输入字 ...

  6. C语言读取mp3文件的信息

    MP3文件的ID3V1信息与ID3V2信息结构的分析 --吴俊涛2005/05/05 E-mail:bo_tao@126.com QQ:29248671 主 页:http://wjt276.home4 ...

  7. DSP嵌入式C语言状态机,三段式状态机描述及模版

    三段式状态机描述及模版 [复制链接] 本帖最后由 Aguilera 于 2018-11-10 20:23 编辑 时序电路的状态是一个状态变量集合,这些状态变量在任意时刻的值都包含了为确定电路的未来行为 ...

  8. 使用Go语言播放Mp3文件

    这里使用Mp3库为: https://github.com/faiface/beep 这个库可解析播放的文件有WAV, MP3, OGG和FLAC. 参考官方的Wiki文档可以写出如下测试文件: pa ...

  9. linux下用C语言实现MP3播放器

    首先我们要来看几个函数: 接下来我们安装一下madplay这是一个播放器. sudo apt-get install madplay 建议给软件源换成阿里的,下载的快. 安装完成后测试方法为: mad ...

最新文章

  1. python编写赛车游戏单机版_使用Keras和DDPG玩赛车游戏(自动驾驶)
  2. hdu 2006 求奇数的乘积(c语言)
  3. Shell中的for循环
  4. mysql系统搭建互备DB(双主)记录
  5. 韩顺平php视频笔记51-52 数组的概念 创建 遍历
  6. LGOJP1850 换教室
  7. DoIP(一)——基础概念
  8. 计算机兴趣小组学情分析,计算机兴趣小组计划、教案浅析.doc
  9. 云忧cms搭建在宝塔nginx服务器,登录报错
  10. Latex中的括号用法总结
  11. 计算机缓存怎样更改,计算机的缓存大小在哪设置?
  12. 华东理工c语言题库,华东理工大学c语言.doc
  13. 你真的知道什么是元音什么是辅音吗?
  14. AutoLeaders控制组——51单片机学习笔记(蜂鸣器、AT24C02芯片)
  15. Qt5.9程序打包发布
  16. Mybatis缓存机制(一级缓存、二级缓存、三级缓存)
  17. 【优雅编程之道】之数组的7点建议
  18. java计算机毕业设计汽车票订购系统源码+程序+lw文档+mysql数据库
  19. all CUDA-capable devices are busy or unavailable in function ‘setDevice‘
  20. 7天物联网智能家居学习记录---第五天

热门文章

  1. AMD计划发行股票和债券融资10.2亿美元 进行债务重组
  2. pythonppt_python操作ppt下载
  3. 地方普通院校的计算机专业「科班」学生应如何提高自己的竞争力
  4. 经典java面试题(持续更新)
  5. LATEX——algorithm2e 伪代码书写模板
  6. matlab全搜索运动估计,全零检测的部分失真搜索运动估计算法
  7. arduino+四位数码管从0到9999爬升
  8. HTML+CSS:transform空间转换、translate3d空间位移、perspective透视、rotate3d空间旋转\立方体、scale3d空间缩放
  9. BEA助力信达资产实现无纸化办公
  10. Django设置html背景图片失败,出现“GET /images/2.png HTTP/1.1“ 404 2552