单片机设计与开发:前后台系统

  前后台系统的架构简单来说就是一个大的循环,加上中断,就形成了一个整的体系。如 GPIO、定时器、数码管实验等都是前后台系统架构,任务顺序地执行的,而前台指的是中断级,后台指的是 main 函数里的程序即任务级。

  前后台系统又叫作超级大循环系统,这个可以从 while(1) 关键字眼就可以得知。这样的系统比较简单,实时性,并行性要求不太高的情况下是不错的方法,程序设计简单,思路比较清晰。但是当应用程序比较复杂的时候,如果没有一个完整的流程图,恐怕别人很难看懂程序的运行状态,而且随着程序功能的增加,编写应用程序的工程师的大脑也开始混乱。即不利于升级维护,也不利于代码优化。比较复杂一点的应用程序,使用此法虽然能够实现功能,但是自己的思维一直处于混乱状态,导致程序一直不能让自己满意。

  这里通过一个简单的例子来说明前后台系统设计的思想,相信很多人平常也这么用过,但是可能并不知道这就是前后台系统的思想。很简单,我们通过单片机来实现一个温度采集并将温度显示在数码管上的小实验。在这里数码管显示就相当于前台,所以 display() 函数放在中断服务函数里,是它能够 2ms 更新一次数据,然后在主函数通过 while(1) 循环实现后台任务,即温度采集与数据处理,最终实现温度实时更新。代码框架如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
void display() //数码管显示函数
{
........ //段选
........ //位选
........ //消影
}
void init_timer() //定时器0初始化
{
TMOD = 0x01;
TH0 = (65536-2000)/256;
TL0 = (65536-2000)%256;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void main()
{
uint temp;
uchar adc,num;
init_timer(); //定时器初始化
while(1)
{
...... //温度采集
...... //数据处理
}
}
void timer() interrupt 1 //定时器0中断服务函数
{
TH0 = (65536-2000)/256;
TL0 = (65536-2000)%256;
display(); //每2ms显示一次
}

  当然,前后台系统设计一定要注意一条原则:

  紧急的事务一定要用中断处理,中断只处理紧急事务!

  在前后台系统当中,关键的时间操作必须通过中断操作来保证实时性,由于前后台系统中的任务是顺序执行的,中断服务函数提供的信息需要后台程序走到该处理这个信息这一步时才能得到处理的,倘若任务数越多,实时性更加得不到保证,因为循环的执行时间不是常数,程序经过某一特定部分的准确时间也是不能确定的。进而,如果程序修改了,循环的时序也会受到影响。很多基于微处理器的产品采用前后台系统设计,例如微波炉、电话机、玩具等。在另外一些基于微处理器的应用中,从省电的角度出发,平时微处理器处在停机状态(halt),所有的事都靠中断服务来完成。

坚持原创技术分享,您的支持将鼓励我继续创作!