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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

本文(一基于状态机控制的面向对象的前后台协从多任务系统设计一任务.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

一基于状态机控制的面向对象的前后台协从多任务系统设计一任务.docx

1、一基于状态机控制的面向对象的前后台协从多任务系统设计一任务一、基于状态机控制的面向对象的前后台协从多任务系统设计一、任务分析 根据题目要求,划分任务如下: 1、键盘扫描线程 2、灯显示线程 3、LED1-LED4四个独立线程 4、后台监视线程 5、串口收发中断 共计7个线程1个中断。二、软件整体结构设计 后台 前台 串口中断-| - -| V | int10ms中断 | | serial中断 |- - -|监视monitor| | |- - -| | |键盘扫描keyscan| | 收 RI 检查 |-| - - | | - - | 灯显示displed | | 发 TI 检查 | - - |

2、 | - - | LED1-LED4四个线程lednp | | RETI | - - | - | END | - 图1 软件整体结构设计图 由图1可知,本软件是基于状态机控制的前后台协从多任务系统,其基本原理是通过均衡地分割CPU时间片达到并发多任务的目的。前台任务要求极精确定时,包括键盘扫描、灯显示、LED1-LED4控制,使用10ms定时中断作为步调,可保证时间误差不超过11ms。后台运行人机监控界面,实时性要求不高,只要满足人的生理要求(响应延迟不超过0.5秒)即可,因此将其放在后台,使用剩余时间片。串口收发属于随机事件,发生频率不高,但实时性要求严格,所以用中断实现最为妥帖。三、功能描

3、述 1、人机监控界面monitor (1)help显示在线帮助,说明各种命令的使用方法; (2)mb、mw、md以字节、字、长字格式向内存数据区写入数据/读出数据; 如:mX 地址 个数 数据 mb 10 2 - 从地址10开始读出2个字节数据并显示 mb 20 3 0xaa - 从地址20开始连续写入3个字节,值均为0xaa (3)ls显示各线程状态号; 如: ls monitor - 显示监控状态机的状态变迁 ls led1p - 显示LED1控制状态机的状态变迁 注:此命令只显示变化的状态号,不变化不显示,由此可以动态观察运行情况。例如:显示(0)-(1)-(4).按CTRL+B键退出监

4、视并显示提示符“%”;或者按CTRL+G切换到另一控制台继续输入命令/显示。 (4)bye挂起后台监控,以便节省能源,同时按下key1+key4+key8再次激活(只能在某些支持电源管理的单片机上实现); (5)其他命令:退格、CTRL+C(重启)、CTRL+G(切换控制台,支持2个显存); 2、键盘扫描keyscan 因为不需要软件去抖动,所以很简单。令key=P1即可。假定按下键盘为0。变量key保存采样的键值。 加入软件去抖动也很方便,只要把去抖动状态机层串接在keyscan前即可。这种模块化设计可以平滑增加新功能,不影响其他部分,而且可以实现相当复杂的处理算法。 keyscan每隔10

5、ms采样一次键盘,相对于人手几百毫秒的机械运动就是实时的。 3、灯显示displed 因为是直接驱动,所以直接令 P37.4=led 即可。假定0为亮、1为灭。变量led保存处理后的灯显示值。 4、串口收发中断 关于串口收发中断和显示API函数及缓冲区队列处理不再叙述,详见相关源代码。 5、四个LED控制 详见LED控制状态机一节的说明。四、具体设计思路和采用技术 分析题目的功能需求,核心对象是LED,动作有四种:快闪灭、慢闪灭、快短亮长灭、慢长亮短灭,这样我们似乎要设计4种状态机进行控制,再进一步分析,其实本质只有闪灭和亮灭的区别,其他只不过是时间参数不同,这样我们只要设计两种状态机对应就可

6、以了。再深入想一下,如果以后增加新的动作怎么办?或者这几个灯的动作需要互换位置如何才能不改动程序而灵活实现呢?用户的需求千奇百怪,怎么才能在不改程序的前提下满足未来用户不断增长和变化的需求呢?“数据驱动”技术可以解决这个问题。 = * 数据驱动 * = 数据是灵活的,程序是僵死的,用数据驱动程序流向,既灵活又稳定。(前提是严密的数据合法性检查)程序和数据在计算机里是分家的,程序位于ROM或只读RAM里,不可写,数据位于RAM里,可读写。如果把程序的流程用数据控制,那么不同的数据组合将产生千变万化的程序行为。我们可以把程序的所有功能写在同一个程序里,然后用数据配置定义个性化的程序行为。单一版本的

7、软件为维护和管理带来了方便。 针对本题目,我们可以给每个灯设置一个配置项smsel,如下: if(smsel=1) 闪灭状态机处理; else if(smsel=2) 亮灭状态机处理; else /可以新增其他动作的状态机处理; 由上可知,所有灯的处理程序都是由以上同一个程序段处理,差别只在于各个灯的配置数据不同。LED1和LED2的私有smsel均为1,LED3和LED4的私有smsel均为0,如果有一天客户提出改变LED1为亮灭动作,只要改它的配置数据即可,根本不用动程序。如果要增加LED5、LED6等新的处理,仍然只需调用这段程序控制动作,不必增加代码,加几个smsel私有配置数据就可以

8、了。总之,增加新灯和改变动作,只动数据,不改程序。 - - |状态号state| | LED1数据结构 | - | - | |状态机选择smsel| | | LED2数据结构 | | - | - | | 亮时间on | | | LED3数据结构 | 数据区(属性) - | - | | 灭时间off | 私有数据 | LED4数据结构 | | - | - | |闪亮时间fon| | |。LEDn| V - | - |闪灭时间foff | | |闪灭状态机| | - | |亮闪状态机| 行为动作(方法) |当前时间计数cnt| V |其他状态机| | - - | 键值keyval| 公有数据 图3

9、 LED对象在内存里的映像 - 图2 LED数据结构 如图2、3所示,LED可以用面向对象(OOP)的方法分析。每个灯有自己的属性和方法,映射到内存中就是类的实例化。比如:每个灯有自己的私有数据,当前状态号、状态机选择、亮时间、灭时间、闪亮灭时间,计数,这些数据唯一确定了此灯与众不同的个性,是每个灯特有的。一个灯受A、B两个键的控制,这个键值对外可见,是公有数据。 如图3,所有灯对象使用同一个类方法,每个对象有自己独立的数据区,即:对象只有属性不同,调用的方法程序是同一个,这也可以说是一种数据驱动吧。其实,C+程序在内存里的映像就是图3。 class LED private: unsigned

10、 char state; unsigned char smsel; unsigned int on,off,fon,foff,cnt; public: unsigned char keyval; void smstate();/闪灭状态机 void lmstate();/亮灭状态机 LED led1,led2,led3,led4; 以上是对应图3的C+伪代码。五、LED控制状态机 11 - | | - -| 0空闲 | 10 | | 00/01| | | - 00/01 - | | 2闭态灭 |-| 1延时fon秒亮 |- | - | | 无条件 - 无条件 -| 0空闲 |- | | | 0

11、0/01| |10 | |- | -| 2延时off秒灭 | 1延时on秒亮 |- - 图5 亮灭状态机变迁图 图4、5是LED控制状态机的变迁图,第一个数字是状态号,紧接着是状态描述,条件是AB键状态。如下: B键A键描述 0 0 A、B键同时按下,B键优先级高,忽略A键 0 1 B键按下,关闭灯 1 0 A键按下,闪/亮灯,优先级低于关闭,随时可被B键中断(10ms采样) 1 1 没有键按下,维持原状态 图4的状态2和4不判断按键情况,其他状态每一步都先检测按键输入。 图5的状态1和2不判断按键情况,0状态每一步都先检测按键输入。 现在根据题目要求配置数据,就是初始化每个灯的属性。 LED

12、1-fon=0.5;foff=0.5;off=5;smsel=1 LED2-fon=0.3;foff=0.3;off=1;smsel=1 LED3-on=3;off=4;smsel=2 LED4-on=10;off=6;smsel=2 - |state=0smsel=1on=0off=5|-LED1数据区 |fon=0.5foff=0.5cnt=? | - |state=0smsel=1on=0off=1|-LED2数据区 |fon=0.3foff=0.3cnt=? | - |state=0smsel=2on=3off=4|-LED3数据区 |fon=0foff=0cnt=? | - |sta

13、te=0smsel=2on=10off=6 |-LED4数据区 |fon=0.5foff=0.5cnt=? | - | 闪灭状态机(参见图4状态变迁图) |=5秒”,所以此状态内不进行按键检测,以保证至少关灯5秒。延时满5秒后回到0空闲态检测按键情况,如无按键或又按下B键则继续关灯(0态缺省保持关灯状态,所以此时保证5秒闭灯)。如果按下A键则进入闪烁状态(此时保证了=5秒闭灯)。 2、再看看LED3,其状态变迁如图5所示。 初始状态号state=0,位于空闲状态,此时若无按键(11),则继续检查按键事件(10ms采样),下一状态仍为自己0。 在0态,若按下A键10,状态变迁到S1,亮灯并延时o

14、n秒(on=3秒),因为题目要求“on 状态=3秒”,所以此状态内不进行按键检测,以保证至少亮灯3秒。延时满3秒后回到0空闲态检测按键情况,如无按键或又按下A键则继续亮灯(0态缺省保持亮灯状态,所以此时保证3秒亮灯)。如果按下B键则进入闭灯状态(此时保证了=3秒亮灯)。 在0态,若按下B键01或同时按下A、B键00,状态变迁到S2,亮灯并延时off秒(off=4秒),因为题目要求“off 状态=4秒”,所以此状态内不进行按键检测,以保证至少灭灯4秒。延时满4秒后回到0空闲态检测按键情况,如无按键或又按下B键/AB键则继续灭灯(0态缺省保持灭灯状态,所以此时保证4秒灭灯)。如果按下A键则进入亮灯

15、状态(此时保证了=4秒灭灯)。 可以保存每次采样到的键值,新值覆盖旧值,这样程序就能记住最后一次的按键值,以便状态变迁后处理。 = 如何调试 = 连接PC机和监控串口,输入以下命令: %ls led1p (0)- 此时monitor后台交互界面显示LED1在0状态。按下A键,显示变成 (0)-(1)- 表明LED1进入1状态,此时灯亮,过了0.5秒后显示 (0)-(1)-(3)- 表明LED1进入3状态,此时灯灭,再过0.5秒后显示 (0)-(1)-(3)-(1)- 灯又亮了,就这样每隔0.5秒在控制台上显示一个状态并改变一次灯的状态。过段时间,控制台可能显示 (0)-(1)-(3)-(1)-

16、(3)-(1)-(3)-(1)- 此时按下B键/同时按下AB键,控制台立即显示 (0)-(1)-(3)-(1)-(3)-(1)-(3)-(1)-(2)-(4)- 表明LED1顺序进入2状态和4状态,灯马上灭了,延时5秒后,控制台显示 (0)-(1)-(3)-(1)-(3)-(1)-(3)-(1)-(2)-(4)-(0)- 此时进入0状态,灯依然是灭的,继续等待按键。 在PC键盘按CTRL+B退出状态显示,出现提示符 % 或者按CTRL+G切换到控制台2继续输入命令。 在提示符处输入 %mb 0 16 00000000 00 01 00 00 01 F4 00 32 - 00 32 00 10

17、00 00 01 00 . % 其中显示的内容为LED数据区,00状态号、01状态机选择、00 00亮时间、01 F4灭时间(5秒=500个10ms=0x1F4)、00 32闪亮时间(0.5秒=50个10ms=0x32)、00 32闪灭时间(0.5秒)、00 10当前时间计数(此时为16个10ms,即0.16秒)、00键值(没有键按下)。 后面的数据是LED2的,00状态号、01状态机选择、00亮时间高8位。 可见运行情况可以通过查看内存数据区或者打印状态号获得。六、总结 基于状态机的协从多任务就是把一个大任务分成若干小片,每一步(此处为10ms)顺序执行所有任务的一个状态(节约时间,增加实时性),这样CPU资源被各个任务瓜分,从微观上看是顺序执行,从宏观上看每个任务都好象独占一个CPU,任务是并发的。其实CPU本身就是数字系统,不连续而是离散运行的,完全可以认为分配了时间片的任务单独拥有一个慢些的CPU,用此观点看这个程序更容易理解其工作原理。

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

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