ImageVerifierCode 换一换
格式:DOCX , 页数:10 ,大小:299.31KB ,
资源ID:29529236      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/29529236.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(有限状态机在单片机编程中的应用.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

有限状态机在单片机编程中的应用.docx

1、有限状态机在单片机编程中的应用学习笔记 有限状态机在单片机编程中的应用 在单片机编程中,如果在不使用操作系统的情况下同时执行多个任务,可能会遇到下面这些情况: 一个任务的执行时间过长,导致其他任务无法及时执行 在一些任务中大量使用 delay() 等函数进行软件延时,这些延时函数占用过多时间,影响其他任务的执行 一些复杂任务的程序逻辑不清晰,不便于以后对程序进行维护,或添加新功能本文介绍的有限状态机,可以做到将一个耗时较长的复杂任务分解为多个简单任务,同时使代码逻辑更加清晰,从而解决上述问题。目录: 1. 什么是有限状态机 ) 2. 有限状态机的作用 分解耗时过长的任务 避免软件延时对 CPU

2、 资源造成浪费 使程序逻辑更加清晰 3. 有限状态机的实现 通过 switch - case 语句实现 通过 Arduino 库实现 其他方式 4. 示例一:按键去抖动程序的优化 传统的按键去抖动程序 】 优化后的按键去抖动程序 5. 示例二:通过有限状态机实现的闹钟程序 6. 后记1. 什么是有限状态机根据维基百科上的定义,有限状态机(finite-state machine, FSM,简称状态机)是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。1为了理解这句话,假设自己还有三天就要考试,这时候就要进入紧张的备考状态,将空闲时间用在复习上。但是,为了保证足够的精力,小睡一会儿

3、也是十分有必要的。那么,什么时候复习,什么时候睡觉呢可以这样描述:在复习的时候:如果 感到瞌睡,则 睡觉如果 没有感觉到瞌睡,则 继续复习在小睡的时候:(如果 感觉不再瞌睡,则 开始复习如果 感觉依旧瞌睡,则 继续睡觉也可通过一幅简单的示意图(也叫状态转移图)表示出来:这个例子其实就是一个简单的有限状态机,其中,复习和小睡是两个状态,感觉瞌睡和感觉清醒这两个条件可以使状态发生转换。2另外,Programming Basics3 网站上也提供了状态机相关的教程,用形象化的图片解释了什么是有限状态机,可通过此链接访问。在嵌入式程序设计中,如果一个系统需要处理一系列连续发生的任务,或在不同的模式下对

4、输入进行不同的处理,常常使用有限状态机实现。例如测量、监测、控制等控制逻辑型应用。42. 有限状态机的作用 分解耗时过长的任务大家应该都知道,CPU 没有并行执行任务的能力。计算机同时运行多个程序,其实是多个程序依次交替执行,给人以程序同时运行的错觉。各个程序在什么时候开始执行,执行多长时间后切换到下一个程序,由操作系统决定。/单片机执行多任务也是类似的过程,但由于其资源有限,为了节省对 CPU 和存储空间的占用,在很多情况下没有使用操作系统。这时,单片机中运行的各个任务必须在一定时间内主动执行完毕,才能保证下一个任务能够及时执行。对于一些需要长时间执行的任务,例如按键去除抖动、读取和播放 M

5、P3 文件等,采用有限状态机的方式,将任务划分为多个小的步骤(状态),每次只执行其中的一步。这样,其他任务就有机会插入到这个任务之中,确保了各个任务都能按时执行。 避免软件延时对 CPU 资源造成浪费对于一些简单的程序,可通过 delay(), delay_ms() 之类的函数进行软件延时。这些延时函数,一般是通过将某个变量循环递加或递加,到达一定值后跳出循环,从而通过消耗 CPU 时间实现了延时。这种方式虽然简单,但在延时函数执行的过程中,其他程序无法运行,消耗了大量 CPU 资源。而通过状态机,有助于减少软件延时的使用,提高 CPU 利用率。请参考下文中的 示例一:按键去抖动程序的优化,这

6、一例子展示了如何通过软件延时分解耗时较长的任务,同时减少软件延时的使用。 使程序逻辑更加清晰通过状态机,将一个复杂任务划分为多个状态,可以使程序清晰易懂,便于维护。以后想要添加、删除程序中的功能,都会变得非常容易。;下文中的 示例二:通过状态机实现的闹钟 展示了如何通过状态机优化程序逻辑。3. 有限状态机的实现 通过 switch - case 语句实现如果使用 C 语言,switch - case 语句,即可简单地实现有限状态机。/* 定义各个状态所对应的数值 */#define STATUS_A 0#define STATUS_B 1#define STATUS_C 2:/* 该变量的值即

7、为当前状态机所处的状态 */uint8_t currentStatus = STATUS_A; /* 通过状态机实现的某个任务, * 需要放入 while(1) 等地方循环执行 * /void fsm_app(void) switch(currentStatus) /* 根据现在的状态执行相应的程序 */ ; case STATUS_A: /* 状态 A */ doThingsForStatusA(); /* 执行状态 A 中需要执行的任务 */ /* 若满足状态转换的条件,则转换到另一个状态 */ if(condition_1) currentStatus = STATUE_B; break

8、; case STATUS_B: /* 状态 B */ doThingsForStatusB(); /* 执行状态 B 中需要执行的任务 */ /* 若满足状态转换的条件,则转换到另一个状态 */ if(condition_2) currentStatus = STATUE_C; if(condition_3) currentStatus = STATUE_A; ! break; case STATUS_C: /* 状态 C */ doThingsForStatusB(); /* 执行状态 B 中需要执行的任务 */ /* 若满足状态转换的条件,则转换到另一个状态 */ if(conditio

9、n_4) currentStatus = STATUE_A; break; default: currentStatus = STATUE_A; 通过这段程序,即可实现一个具有三个状态的状态机。状态转移图如下图所示: 通过 Arduino 库实现对于 Arduino 用户,还可以使用 FSM Library 实现。这一库将有限状态机进行了封装,可以以更简洁的方式实现状态机。下载地址及使用说明: 其他方式对于一些更复杂的任务,使用 switch - case 语句,代码可能会太简洁。这时候,使用其他方式实现状态机,可能会更好。具体请查阅相关资料。4. 示例一:按键去抖动程序的优化 传统的按键去抖

10、动程序初学单片机时,我们接触的按键去抖动程序一般是这样的5:void keyscan()$ if(key1 = 0) 示例二:通过有限状态机实现的闹钟程序最近正在制作一个闹钟。这个闹钟支持播放 MP3 格式的闹钟声6,支持贪睡模式,同时还有一些功能打算以后再添加上。为了使程序逻辑更加清晰,也为了更方便地添加新功能,我打算采用有限状态机实现。相关程序如下:#include #include #include #include diag/* 相关常量定义 */#define ALARM_MUSIC_END 0 后记在单片机编程时,如果遇到代码复杂、任务占用时间过长等问题,可以尝试通过有限状态机解决。 、

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1