简略的程序只要用简略的办法就能够了,我在此之前也只会这一种办法。也便是:
void main()
{
init();//初始化
while (1)
{
module01();//模块1,或若干句子
}
}
匠人在书中讲到工作驱动机制,例如:
void main()
{
init();
while (1)
{
if (工作1条件)
shijian1();//履行工作1
if (工作2条件)
shijian2();//履行工作2
if (工作3条件)
shijian1();//履行工作3
。。。。。。
}
}
曾经编的一些多工作程序中,我也用过相似的思维,可是用了许多条件的嵌套,编出的程序远没有这种明晰。
上面的办法也叫次序调度机制,在每次循环中每个工作都或许被履行到,还有一种优先调度机制:
void main()
{
init();
while (1)
{
if (工作1条件)
{
shijian1();//履行工作1
conTInue;
}
if (工作2条件)
{
shijian2();//履行工作2
conTInue;
}
if (工作3条件)
{
shijian3();//履行工作3
conTInue;
}
。。。。。。
}
}
将优先级最高的工作放在前面,被履行到的概率最大。可是假定前面的工作频率太高,后边的就有或许履行不到了。
最精彩的部分要数多使命并行运转。简略的多进程程序仍是很简略的,比如一起操控流水灯和数码管(动态),独自的流水灯是赋值后延时,再赋值,再延时。假设要一起操控数码管,只要把之前用作延时的那段时刻用来扫描数码管就行了。简略说来,便是把曾经糟蹋掉的时刻充分利用起来。
略微杂乱一点的多使命运转就要略微动些脑筋了,能够把每个使命看做一个进程,每个进程能够被分为多个阶段,每个阶段履行时刻较短。多个进程的每个阶段替换进行:进程1阶段1,进程2阶段1,进程1阶段2,进程2阶段2,……
我想到两种办法完成各阶段的分配,第一种是人为设定好每个阶段完毕的条件,等待着某个阶段“自动”完毕然后进入另一个进程的某个阶段。这种办法每个阶段所用的时刻是不确认的,可是每个阶段所做的工作是确认的。第二种办法是每进入一个阶段,就敞开一个定时器,比及定时器计到设定的时刻就强制完毕这个阶段,开端另一个进程的某个阶段。这样每个阶段运转的时刻都是固定的,可是一般不能明确地知道在这个阶段将使命履行到哪里(有点像量子力学的测禁绝原理了)。
用定时器完成进程的分配:
#include
#include
unsigned char fond = 0;
#pragma interrupt_handler tc0:10
void tc0()//定时器0溢出中止,假定共有3个进程
{
fond++;
if(fond == 3) fond = 0;
}
void shijian1()
{
char a1;
。。。。。//读取前次数据
a1 = fond;
while (fond == a1)
{
。。。。//持续运转
}
。。。。。//保存本次数据
}
void shijian2()
{。。。。。。}
void shijian3()
{。。。。。。}
void main()
{
TCCR0 = 0x05;//设8M晶振,1024分频,每秒均匀产生30.5次中止,运用中可视状况而定
TIMSK |= BIT(0);
SREG |= BIT(7);
while (1)
{
switch (fond)
{
case 0:
if (工作1条件)
shijian1();
else
fond++;//假定此工作产生的条件不满足,就让fond加1以便履行下一个工作
break;
case 1:
if (工作2条件)
shijian2();
else
fond++;
break;
case 2:
if (工作3条件)
shijian3();
else
fond=0;
break;
}
}
}
除此之外,还能够规划一段专门用于分配CPU时刻的程序,能够更体系地处理多进程的问题,这就很有些操作体系的感觉了。
在运用中不限于这几种办法,依据实际状况的杂乱程度能灵敏运用各种办法编出最合适的程序才是最重要的。别的,匠人同志还说过这么句话:简略的,才是最有用的。