您的位置 首页 ADAS

占用式和非占用式程序结构剖析

最近刚把 DYS388 项目了结,期间写了不少程序,写着写着想到了一下东西,于是总结了一下。一、什么是占用式程序一个进程在一个时刻只能处理一个任务。

最近刚把 DYS388 项目了断,期间写了不少程序,写着写着想到了一下东西,所以总结了一下。

一、什么是占用式程序

一个进程在一个时刻只能处理一个使命。

每个使命是为了完结一个功用,假如这个功用的完结进程是一向占用进程处理资源的话,就称这个使命函数是占用式程序结构。

最常见的占用式程序结构便是延时函数了,比方我最常用的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;r8;r++) p=>

{

//扫描赤色

DPw = ~(0x01

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

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

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。

这下还没完,咱们发现每次扫描中都有延时,延时进程中什么也不做,这是极大的糟蹋,咱们需求再此改造,把延时去掉:

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/adas/142397.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部