先来回顾一下:
  在第2章中介绍了界面函数结构,它的思想是主进程为主体,外部的按键等作为特殊情况单独处理。但是当接触到的程序更复杂时,尤其是当程序里还要进行精确定时时,用单进程结构已经满足不了要求了,这就进一步产生了第3章的结构——定时器分配任务。
  定时器分配任务结构在主进程结构基础上开辟了一个定时器进程,在这个进程里进行按键扫描任务、计时任务等。此时这些任务是不会被中断的,定时并且精确地每隔一段时间执行一次。当时的看法是:这些定时器里的进程完成任务后把结果保存,主进程可以选用这些结果进行处理。
  此外定时器还要进行一个特殊的功能——给主进程下达命令,通知主进程进行某种动作。这个功能的本质就是向主进程提供了时间信息。
  这种结构已经结合了定时器,并且已经把一些简短的代码直接放到了定时器中断处理程序里了,但还有相当一部分代码放在主进程里。不是说不能放在主进程里,而是当时没有明确出定时器中的各个进程是如何形成的,这些定时器中的任务有什么更深刻的特征。
  本章就是专门讨论这些放在定时器里执行的任务。

1. 什么是占用式程序

  一个进程在一个时刻只能处理一个任务。

  每个任务是为了完成一个功能,如果这个功能的实现过程是一直占用进程处理资源的话,就称这个任务函数是占用式程序结构。

  最常见的占用式程序结构就是延时函数了,比如最常用的5ms延时函数

  这一章将介绍的是主循环调用任务函数的一种非常常用的结构。到目前为止,在主进程的构建方面,除了顺序调用我只用到过这一种构建方式,并且用得非常多。在2011年的电子设计大赛上,笔者就用了这种程序结构获得了安徽省第一的成绩,可见这种结构的威力。之所以叫它“界面函数”结构,是因为它各个函数就像一个个界面一样,在每个界面(函数)中完成某些特定的功能,我没找到这种结构的通用叫法。

  写过单片机程序都知道,在main函数的结尾会有个 while(1) 循环,它就是单片机的归宿。

  在不考虑中断的情况下,整个单片机的最根本任务就是这个循环,由于在主函数里,在此我们称它为“主循环”,认为main函数及其调用的所有子函数(以及子函数调用的子函数)都在“主进程”里。