一、前言

前文介绍的“后台任务”是一个连续执行的过程,这在自然界中也是一个常见的现象。比如天气一年年周而复始地变化,春夏秋冬四季轮回不止,比如我们每天工作学习,吃饭睡觉,一天一天的过日子,这些就是气候和生活的“后台任务”,构成了气候和生活的基本生命背景。

但是气候和生活最精彩的部分却不是这些“后台任务”,而是中断后台任务的进程,突然插入的片段,比如台风来了,所到之处天摇地动,比如你的手机响了,接到的电话会立马产生影响,快乐?忧愁?无限可能。

这种中断事物当前的运行,临时处理新事件的过程在操作系统的术语中被称为“前台任务”。前台任务的特点是只执行一个比较短的时间,有开始,有结束,唯独不能像“后台任务”那样无限循环没完没了。

在计算机运行过程中,每个中断处理都是一个典型的“前台任务”,中断服务程序(ISR)就是对应各个前台任务的任务函数。

既然前台任务中断了后台任务,那么前台任务执行过后后台任务能不能继续顺利地执行,两者会不会互相影响,这个问题对于不同的单片机,不同的编译器和不同的编程方法,结论是不同的。

由于教科书一般只介绍成功的例子:后台任务被中断后能继续正确运行,前后台任务互相没有影响,下面就介绍一个不成功的例子。

二、前台任务

(1)单片机最有特色的机制就是中断,中断编程是单片机编程中最重要的内容。STC8H系列单片机有丰富的中断资源,其中定时器中断是最基本的。本文用定时器0产生每秒100次的中断,演示作为前台任务的效果。下图是具体的范例程序:

stc单片机远程写程序(STC8位单片机前后台任务编程中的问题)(1)

前台任务程序范例

stc单片机远程写程序(STC8位单片机前后台任务编程中的问题)(2)

前台任务程序范例

(2)其中第37行到43行的初始化程序将定时器0设定为10毫秒的中断周期。对于STC8051单片机,单片机中断有两级开关,首先一个是总中断开关EA,第50行就是打开中断总开关,其次对于每一个能产生中断的片上设备,都有一个中断允许位,只有设置了这个中断允许位,该设备才能产生中断。第43行程序就是允许定时器0产生中断。

为了避免意外,当单片机加电冷复位时,所有的设备中断和总中断都是关闭的,用到谁,打开谁。

(3)为了专门显示前台任务的效果,第54行到第57行后台任务就只是一个空循环,什么事都不做。

(4)第61行到第71行是定时器0的中断服务程序(前台任务函数),在C51语言中,用户用“interrupt”关键字指明中断号,这里是1号中断。

作为前台任务的中断,是由单片机硬件产生的,中断服务程序是由硬件调用的,因此前台任务函数没有调用参数,也没有返回值。前台任务函数名可以是任意的,但在整个程序中必须是唯一的。

(5)前台任务首先将节拍计数变量“Tick0”加1,然后每当Tick0的值为100的整倍数时,用“printf”库函数输出Tick0变量的值。

下面的视频是前台任务执行的效果。

三、前后台任务

(6)我们已经看到了单独的后台任务和单独的前台任务的运行效果,如果我们在一个程序中将前后台任务组合在一起,其效果会不会像教科书中介绍的那样前后台任务独立正确的运行呢?下图是完整的前后台任务程序:

stc单片机远程写程序(STC8位单片机前后台任务编程中的问题)(3)

前后台任务范例

stc单片机远程写程序(STC8位单片机前后台任务编程中的问题)(4)

前后台任务范例

(7)下面是前后台任务程序在STC8H的运行结果视频:

(8)下面是运行效果的一个截屏:

stc单片机远程写程序(STC8位单片机前后台任务编程中的问题)(5)

后台任务出错了

出错的现象奇奇怪怪,出错的原因不是单片机,也不是程序员,出错的原因是“printf”这个库函数。

(9)结论:对于STC8H单片机,使用Keil的C51编译器,“printf”这个库函数不能在前后台任务中同时使用。

,