先来看一下这个东西吧:http://v.youku.com/v_show/id_XNTk2NzExMjg4.html

  看完之后应该会觉得这个东西的结构非常复杂,这是笔者做过的最复杂的项目之一。由于是给公司开发的,所以和上一章一样不能公开源代码,但是会举一些简单的例子说明。
  刚接到这个项目了解了大体功能后,第一反应是用“界面函数”的结构。确实,这个东西是非常适合用界面函数完成的,但是由于当时笔者正在自学C++,于是用C++的思路分析了一下这个项目:
  1、总共有4个界面,而且有两个和列表框好像啊。
  2、几乎所有的动作都是由旋转编码器触发的。
  经过一番思考之后,笔者决定做一次尝试,用面向对象的思想加上事件驱动的机制完成它。

  下面就介绍一下这种结构,也希望能借此说明“对象”和“事件”的概念。

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

1. 什么是占用式程序

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

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

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

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

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

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