毕业论文开发语言企业开发JAVA技术.NET技术WEB开发Linux/Unix数据库技术Windows平台移动平台嵌入式论文范文英语论文
您现在的位置: 毕业论文 >> 嵌入式 >> 正文

什么是占用式程序及占用式程序的改造

更新时间:2013-7-10:  来源:毕业论文

什么是占用式程序

  一个进程在一个时刻只能处理一个任务。
    每个任务是为了完成一个功能,如果这个功能的实现过程是一直占用进程处理资源的话,就称这个任务函数是占用式程序结构。
    最常见的占用式程序结构就是延时函数了,比如我最常用的5ms延时函数
    void delay5(unsigned char n)
    {
         unsigned int i;
         for(;n>0;n--)
             for(i=4700;i>0;i--);   //12MHz,1T
    }
    在完成5ms功能过程中是一直占用调用它的进程处理资源的,在此期间不能进行其它任务。
    还有一个很常见的占用式程序——数码管扫描,不过在这里我不举数码管扫描的例子,而举这次在DYS388中使用的8*8彩色点阵屏的扫描程序:
    void refresh7()
    {
         unsigned char r;
         for(r=0;r<8;r++)
         {
             //扫描红色
             DPw = ~(0x01<<r);  //修改完了再导通指定行
             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 = ~(0x01<<r);  //修改完了再导通指定行
         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)     //说明三种颜色都扫描完了
         {
             flagrgb=0;    //从红色开始扫描
             r++;     //开始扫描下一行
             if(r==8) //如果发现行都扫描结束则从第行开始扫描
                  r=0;
         }
    
         switch(flagrgb)
         {
         case 0:  //扫描红色
             DPw = ~(0x01<<r);  //修改完了再导通指定行
             DPr = ~vm7r[r];//送入R灯IO接口显示
             DELAY7 (light7);//显示时间长度
             DPw=0xff;
             DPr=0xff;
             DPg=0xff;
             DPb=0xff;
             DELAY7 (32-light7);//灭灯时间长度
             break;
         case 1:  //扫描绿色  
            //省略代码
             break;
         case 2:  //扫描蓝色
            //省略代码
             break;
         }
    }
    改造完成之后,执行时间再次缩短,变成了刚才的1/3。
    这下还没完,我们发现每次扫描中都有延时,延时过程中什么也不做,这是极大的浪费,我们需要再此改造,把延时去掉:
    void refresh7()
    {
         static unsigned char r=0;
         static unsigned char flagrgb=0;  //当前需要点亮的颜色,0-R,1-G,2-B
         static unsigned char num=0;
         num++;
         if(num==32)
         {
             num=0;
             flagrgb++;
             if(flagrgb==3)     //说明三种颜色都扫描完了
             {
                  flagrgb=0;    //从红色开始扫描
                  r++;     //开始扫描下一行
                  if(r==8) //如果发现行都扫描结束则从第行开始扫描
                       r=0;
             }
         }
    
         if(num<light7)     //说明需要点亮
         {
             switch(flagrgb)
             {
             case 0:  //扫描红色
                  DPw = ~(0x01<<r);
                  DPr = ~vm7r[r];//送入R灯IO接口显示
                  break;
             case 1:  //扫描绿色  
                  DPw = ~(0x01<<r);
                  DPg = ~vm7g[r];
                  break;
             case 2:  //扫描蓝色
                  DPw = ~(0x01<<r);
                  DPb = ~vm7b[r];
                  break;
             }
         }
         else //说明不需要点亮
         {
             DPw=0xff;
             DPr=0xff;
             DPg=0xff;
             DPb=0xff;
         }
    }

设为首页 | 联系站长 | 友情链接 | 网站地图 |

copyright©youerw.com 优尔论文网 严禁转载
如果本毕业论文网损害了您的利益或者侵犯了您的权利,请及时联系,我们一定会及时改正。