占用式和非占用式程序结构分析.doc

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
占用式和非占用式程序结构分析

?最近刚把?DYS388?项目了结,期间写了不少程序,写着写着想到了一下东西,于是总结了一下,在这骚一把,高手勿喷啊。 一、什么是占用式程序 ????一个进程在一个时刻只能处理一个任务。 ????每个任务是为了完成一个功能,如果这个功能的实现过程是一直占用进程处理资源的话,就称这个任务函数是占用式程序结构。 ????最常见的占用式程序结构就是延时函数了,比如我最常用的5ms延时函数 ????void?delay5(unsigned?char?n) ????{ ?????????unsigned?int?i; ?????????for(;n0;n--) ?????????????for(i=4700;i0;i--);???//12MHz,1T ????} ????在完成5ms功能过程中是一直占用调用它的进程处理资源的,在此期间不能进行其它任务。 ????还有一个很常见的占用式程序——数码管扫描,不过在这里我不举数码管扫描的例子,而举这次在DYS388中使用的8*8彩色点阵屏的扫描程序: ????void?refresh7() ????{ ?????????unsigned?char?r; ?????????for(r=0;r8;r++) ?????????{ ?????????????//扫描红色 ?????????????DPw?=?~(0x01r);??//修改完了再导通指定行 ?????????????DPr?=?~vm7r[r];//送入R灯IO接口显示 ?????????????DELAY7?(light7);//显示时间长度 ?????????????DPw=0xff; ?????????????DPr=0xff; ?????????????DPg=0xff; ?????????????DPb=0xff; ?????????????DELAY7?(32-light7);//灭灯时间长度 ?????????????//为了简洁,这里把绿色和蓝色的扫描程序省略,它们的结构和红色扫描是一样的 ?????????} ????} ????这个函数是7色模式下的屏幕扫描程序,调用一次此函数会把整个屏幕扫描一遍。 ????r代表行数,r循环8次代表屏幕的8个行;在每次循环里,先导通对应的行和需点亮的灯,然后延时light7个单位,再关闭所有显示,再延时32-light7个单位。 ? 二、占用式程序的缺点 ????占用式程序最大的缺点就是执行时间太长,耽误对其它任务的响应。另外就是资源浪费,很多时间浪费在执行中的延时上。 ????当然,可以在这些占用式程序中嵌入其它代码以及时处理其它任务,但是这样会造成程序结构混乱,嵌入的其它代码还会影响本程序的执行。如果嵌入的代码功能简单还好,如果功能复杂,尤其是当嵌入的代码也是占用式的,就会严重影响程序执行速度。 ? ? 三、对占用式程序的改造 ????在此以DYS388的扫描程序为例,对其进行改造。 ????首先,每次调用就扫描8行,耗时太长,现将其改成每次扫描一行: ????void?refresh7() ????{ ?????????static?unsigned?char?r=0; ?????????//扫描红色 ?????????DPw?=?~(0x01r);??//修改完了再导通指定行 ?????????DPr?=?~vm7r[r];//送入R灯IO接口显示 ?????????DELAY7?(light7);//显示时间长度 ?????????DPw=0xff; ?????????DPr=0xff; ?????????DPg=0xff; ?????????DPb=0xff; ?????????DELAY7?(32-light7);//灭灯时间长度 ?????????//为了简洁,这里把绿色和蓝色的扫描程序省略,它们的结构和红色扫描是一样的 ????? ?????????r++; ?????????if(r==8) ?????????????r=0; ????} ????用一个静态变量r来记忆行数,这样每次调用此函数只需扫描一行,执行速度是原来的8倍,可以比较快地响应其它任务了。 ????但是这样还不够,每次扫描都会扫描三种颜色,时间还是有点长,下面再次改造,改为每次只扫描一种颜色: ????void?refresh7() ????{ ?????????static?unsigned?char?r=0; ?????????static?unsigned?char?flagrgb=0;??//当前需要点亮的颜色,0-R,1-G,2-B ?????????flagrgb++; ?????????if(flagrgb==3)?????//说明三种颜色都扫描完了 ?????????{ ???

文档评论(0)

xy88118 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档