怎样设计复杂多任务程序.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
在网上发现这个贴子非常好!不多说了自己看吧!有原文。 如何设计复杂的多任务程序 田开坤 湖北师范学院物电学院电工电子中心 435002 tkaikun@163.com 我们在入门阶段,一般面对的设计都是单一的简单的任务,流程图可以如图 1 所示,通 常会用踏步循环延时来满足任务需要。 面对多任务,稍微复杂的程序设计,沿用图 1 的思想,我们会做出如图 2 所示的程序, 在大循环体中不断增加任务,通常还要用延时来满足特定任务节拍,这种程序设计思想它有 明显的不足,主要是各个任务之间相互影响,增加新的任何之后,以前很好的运行的任务有 可能不正常,例如数码管动态扫描,本来显示效果很好的驱动函数,在增加新的任务后出现 闪烁,显示效果变差了。 初始化 任务体1 延时 任务体2 任务体? 任务体N 变量 任务体0 图1 单一任务简单流程图 图2 多任务简单流程图 很明显,初学者在设计程序时,需要从程序构架思想上下功夫,在做了大量基本模块练 习之后,需要总结提炼自己的程序设计思路(程序架构思想)。 首先我们来理解“任务”,所谓任务,就是需要 CPU 周期“关照”的事件,绝大多数任 务不需要 CPU 一直“关照” ,例如启动 ADC 的启动读取。甚至有些任务“害怕”CPU 一直 “关照”例如 LCD 的刷新,因为 LCD 是显示给人看的,并不需要高速刷新,即便是显示的 内容在高速变化,也不需要高速刷新,道理是一样的。这样看来,让CPU做简单任务一定很 浪费,事实也是如此,绝大多数简单任务,CPU都是在“空转” (循环踏步延时) 。对任务总 结还可以知道,很多任务需要 CPU 不断“关照” ,其实这种“不断”也是有极限的,比如数 码管动态扫描,能够做到40Hz 就可以了,又如键盘扫描,能够做到20Hz(经验值),基本上 也就不会丢有效按键键值了,再如LCD刷新,我觉得做到 10Hz 就可以了,等等。看来,绝 大多数任务都是工作在低速频度。而我们的CPU一旦运行起来,速度又很快,CPU本身就是 靠很快的速度执行很简单的指令来胜任复杂的任务(逻辑)的。如果有办法把“快”的 CPU 分成多个慢的CPU,然后给不同的任务分配不同速度的CPU,这种设想是不是很好呢!确实 很好,下面就看如何将“快”的CPU划分成多个“慢”的 CPU。 根据这种想法,我们需要合理分配CPU资源来“关照”不同的任务,最好能够根据任务 本身合理占用CPU资源,首先看如图 3 所示的流程图,各个任务流程独立,各任务通过全局 变量来交互信息,在流程中有一个重要的模块“任务切换”,就是任务切换模块实现 CPU 合 理分配,这个任务切换模块是怎么实现的呢? 图3 多任务复杂流程图 首先需要理解,CPU 一旦运行起来,就无法停止(硬件支持时钟停止的不在这里讨论), 谁能够控制一批脱缰的马呢?对了,有中断,中断能够让CPU回到特定的位置,设想,能不 能用一个定时中断,周期性的将 CPU这匹运行着的脱缰的马召唤回来,重新给它安排特定的 任务,事实上,任务切换就是这样实现的。 图 A 图 B 图 4 定时中断实现任务切换 如图 4A 所示,CPU 在空闲任务循环等待,定时中断将 CPU 周期性唤回,根据任务设计 了不同的响应频度,满足条件的任务将获得CPU资源,CPU为不同任务“关照”完成后,再 次返回空闲任务,如此周而复始,对于各个任务而言,好像各自拥有一个独立的CPU,各自 独立运行。用这种思想构建的程序框架,最大的好处是任务很容易裁剪,系统能够做得很复 杂。 在充分考虑单片机中断特性(在哪里中断就返回到哪里)后,实际可行的任务切换如图 4B所示,定时中断可能发生在任务调度,随机任务执行的任何时候,图中最大的框框所示, 不管中断在何时发生,它都会正常返回,定时中断所产生的影响只在任务调度模块起作用, 即依次让不同的任务按不同的节拍就绪。任务调度会按一定的优先级执行就绪任务。 总结不同的任务需要CPU关照的频度,选择最快的那个频度来设定定时器中断的节拍, 一般选择 200Hz,或者 100Hz 都可以。另外再给每个任务设定一个节拍控制计数器 C,也就 是定时器每中断多少次后执行任务一次。例如取定时中断节拍为 200Hz,给任务设定的 C=10, 则任务执行频度为 200/10=20Hz,如果是数码管扫描,按 40Hz 不闪烁规律,则任务节拍控制 计数器 C=5 即可。在程序设计中,C 代表着任务运行的节拍控制参数,我们习惯用 delay 来 描述,不同的任务用task0,task1……来描述。 明天继续写如何用代码实现!2009-6-29 下面我们来用代码实现以上多任务程序设计思想。 首先是任务切换 while(1) { if(task_delay[0]==0) task0(

文档评论(0)

189****6140 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档