本帖最后由 水漫金山2017 于 2019-12-3 09:00 编辑
单片机又称微控制器,其工作原理与PC机相似,也就是存储程序和程序控制的工作方式。这里的程序有可能是汇编语言也有可能是C语言,但这里我们即将要讨论的不是用哪种语言编写程序的问题。我想和大家讨论的是一种程序设计模式,也就是讨论一下单片机程序设计中的一种比较通用,合理的方法。当然了,这里还是以C语言程序设计作为例程。我们都知道,从微观上来讲,CPU只能一条条的执行指令。(这里为方便讨论问题,有可能不区分指令和程序)。也就是说,在微观上来讲,CPU在某一个时刻,只能执行一个指令动作,这是我们要明白的第一点。第二点,我们还要知道单片机中还有一个特别好的运行机制,那就是中断。中断可以让任劳任怨的CPU专注于眼前的事情,而不必时刻“担心”着“突然事件”。待到“突然事件”发生,CPU再转头去处理。还有一点,我们要明白,那就是单片机的主频越高,指令执行的越快。(当然了,频率高带来的附作用,也不是我们这篇文章要讨论的)。知道了以上三点,我们现在就开始有关文章主题的讨论。
平时生活中,我们经常用快慢这两个字。比如说,这个人做事真快,吃饭也快,写程序也快,总之吃喝拉撒,衣食住行都快。那么一个人做事快,有什么好处呢?很明显,节约时间,能处理更多的事情,看起来像是很多事情同时做了一样。慢,则一切相反。对单片机这种MHZ频率的机器来讲,实现”看起来像”同时处理更多的事情更是不在话下。这也是单片机程序能并发的物质基础之一。单片机虽然快,但我们也不能随随便便把所有任务都直接丢给单片机去处理,那样会出问题的。比如,我们在刚一接触单片机程序设计时,会这样写程序://主程序: //中断服务程序
void main() void ISR(void)
{ {
//初始化单片机系统 Task1();
Task2();
Inital() Task3();
}
//超级循环
while(1)
{
Task1();
Task2();
Task3();
}
}
这样写单片机程序会因为一个任务的“阻塞”而耽误其他程序的实时响应。比如,Task1,是一个按键扫描程序,其中有大概10ms的消抖时间,如果我们在程序中直接写一个delay_10ms()程序,那么Task2和Task3势必会因为这个延时而耽误运行。所以,为了解决类似这样的冲突,我们提出了一种单片机程序设计模式,一种基于系统节拍时间的程序设计模式。这种设计模式的思想是,在一个系统节拍时间到来,只运行其中一任务(注意,一定是一个任务)。所谓节拍时间是单片机系统提供给每一个任务的运行时间。在实际应用中,其实每个任务的最低响应时间要求可以是不同的,比如,按键可以10 - 20ms扫描一次,动态扫描的LED,总的刷新周期不超过20ms,人眼还是可以接受的,再比如,温度数据采集甚至可以500ms一次,正因为这些差异我们可以实现单片机程序的“并发执行“。
|