最近刚把 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;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行,耗时太长,现将其改成每次扫描一行: