http://blog.sina.cn/dpool/blog/s/blog_6f2b6ba80101bwka.html?vt=4
本文是2013年写的,后来整理成了系统文章,请访问 http://nicekwell.net/ 查看单片机编程系列文章。
以下是2013年原文:
经过这几天做的程序,和以前做电子钟时的感悟,现在对单片机的整个程序结构做一下总结。相信这个总结是很有必要的,在组织大型复杂程序结构时需要有一个正确的理论指导。
感觉这种程序结构的很多想法和操作系统非常像,但是毕竟没学过操作系统,有些表述可能不准确,欢迎批评指正。
首先介绍一下任务的概念,main函数最后是一个死循环,它就是一个任务,是整个系统最基础的任务。除main函数的主循环无条件执行外,其实每一个进程和任务都是一个有条件跳出的循环,当这个任务没有完成时就会一直在这个循环里,当任务完成了就会从循环跳出,结束这个任务。当然也有一些简单的任务没有循环,就是一些顺序代码执行完了就结束,也可以认为它是一个简单的任务。
其实所谓的任务在单片机里本质上也就是一个函数,只不过这个函数可能“没那么容易结束”,需要达到一定的目的才会结束,把这样的函数称作“任务”。
如果要完成的是一个很简单的功能,我们可以把这个功能的一小段代码直接放到主循环里,单片机所有的精力都会放在这段代码上(暂不考虑中断)。
但是如果程序结构比较复杂,有多种任务可能会处理,主循环可以调用其它的任务函数而转到其它任务,但是一旦跳转到其它任务里,主循环和其它任务都不会得到执行。
所以有这么一个特点:由主循环调用的任务都只能单独地运行,进入一个任务,就不能处理其它任务。
对于比较大型复杂的系统,main函数的主循环里根本不放要实际处理的代码,而是把所有任务函数归到一起,根据选择进入相应的任务函数,当处理完该任务之后又会回到主循环,由主循环再次分配任务。
此时主循环的作用就是调配任务(当然用来调配任务的主循环本身也是一个 最基本的任务),而在被调配的任务里面可能还会再次被该任务调配的子任务。
既然主循环用来调配任务,那什么时候该进入什么任务呢?
1、 顺序调用。这是最简单的了,几个任务按顺序进行。
像飞思卡尔智能车的程序就是这种结构,先进行传感器扫描 - 再进行转向角计算 - 再进行最大速度计算 - 再进行速度控制,就这几个任务不断重复。虽然在主循环里只是简单调用一下函数,而被调用的任务函数可能很复杂,比如转向角计算这个函数,对它支持函数专门写出一个c文件,而这个文件的代码量甚至比main函数所在文件的代码量都要大。
2、 可能各个任务之间存在逻辑关系,在各个任务里面直接指定下一个要进入的任务。
比如电子钟里面的模式切换,1602从一个界面进入到另一个界面都