可以看到,主循环其实不进行任何实际功能的处理,它完成的只是调用各个任务函数。
对于比较大型复杂的系统,main 函数的主循环里根本不放要实际处理的代码,而是把所有任务函数归到一起,根据选择进入相应的任务函数,当处理完该任务之后又会回到主循环,由主循环再次分配任务。
此时主循环的作用就是调配任务(当然用来调配任务的主循环本身也是一个最基本的任务),而在被调配的任务里面可能还会再次被该任务调配的子任务。
再来看看被调用的任务函数,这些函数已经不只是完成一些简单功能了,它并不是执行一些固定操作后返回,每个任务函数都有自己的一套控制逻辑,并且“不那么容易返回”。
这些任务函数同属于一个进程,但是同一时刻只有一个可以运行。当进入某个函数时,可以说进程被这个函数阻塞,其他函数得不到运行。但这也就是我们需要的效果,因为每个函数都有自己的一套控制逻辑,完全不需要考虑其他界面函数。而在函数退出时,可以由该函数本身指定下一个要进入的函数,或者本来就是由于外部修改了 FlagPage 变量才导致该函数退出的。
这种程序结构特别适合于多种“界面”的功能。一般情况下,主进程不会停留在主循环里,而是偶尔退出到主循环重新分配下一个将要进入的函数,大部分时间会停留在某个界面函数里。
此外,这些函数之间有一些公共变量,这些变量的作用就是被各个函数使用,甚至用于函数间
通信,辅助完成这些函数之间的逻辑结构的构建。比如 1.1 节中的那个重要的 FlagPage变量,这个标志变量就指明了当前工作于哪种工作模式下,任何函数(包括中断进程中的函数)都可以通过改变此变量来切换工作模式。
也有一些与函数对应的用于完成特定功能的变量。比如用于数码管或者显示屏显示的现存,这些显存是有特定用处的,一般其他函数不会使用(但确实是公共变量,是可以被使用的)。
将它们明确分类一下,整个系统都有哪些东西呢:
1、整体的程序框架是由各个界面函数和少数关键的全局变量构建起来的。这是构成系
统的主体框架。
2、每个界面函数在完成特定功能时,会携带一些为自己服务的“私有的”变量和函数。
3、为整个框架服务的还有一些常用的变量和函数,它们完成的是一些通用功能,可以把它们理解为“库函数”。
以上都是对一个进程的结构的讨论,并没有涉及到中断。