定时器和中断的关系,以及为什么应该尽量减少使用延时函数

1.关于定时器和中断两者的关系,以及为什么应该尽量选择定时器,减少使用延时函数。

  在很长一段时间,我都以为中断服务函数里的内容执行完成后,才能再一次开始计时,直到昨天晚上请教了我们副教授,我才知道原来定时器是定时器,中断时中断,进入中断服务函数执行里面内容以及执行完成后退出中断服务函数,这些都是独立于定时器的。

      举个简单的例子,我们设定TMOD = 0x01, TH0 = -9 (对于11.0592MHZ,是标准2.5ms);但是我们中断服务函数里的内容要3ms才能执行完成,那么我们不可能再有机会执行主函数的内容(对于单任务的单片机是这样的),因为我们2.5ms进一次中断服务函数,3ms完成一次中断服务函数的内容,这两个东西都是同时进行的,我们还没完成3ms的任务,又会被打断重新进入中断服务函数重新执行。

     只要初始化了定时器,它就会不停的开始加,不会因为你单片机正在处理的任何事情而中断工作。

     中断会打断CPU正在做的事情,转而处理中断服务函数里的事情,这里就涉及到一个问题,对于某些时序很严格的工作,比如说单总线的通信,以及IIC等通信,在传输数据的时候是不能被打断的,否则数据就传输失败(传输一个字节的数据必须连续,传输多个字节的时候如果中途要处理更紧急的事情可以在传输完某个字节后暂时离开,同时对总线做一些处理,处理完后再回来继续传输剩下的的字节,这也是比较特殊的情况)。所以对于一些对时序要求严格的程序,我们可以暂时关闭中断,执行完后再打开中断,但是是关闭所有中断还是关闭部分中断,取决于工程里面任务的优先级,比如说板子着火了和传输数据比,哪个更紧急?? 但是无论如何,关闭中断是不会对定时器产生影响的,定时器还能用。

    其实我想表达的核心呢,还是想说中断和定时器不能一概而论,就算没有开启中断, 定时器也可以用来计时,并且定时器不会因为进入了中断函数就停止计时。

    接下来我就能接着上面的核心,解释为什么应该尽量避免延时函数,而选择定时器了。先举个例子,我们一节课45分钟,假如上到40分钟的时候老师突然出去接电话,并且唧唧歪歪了十分钟,回来的时候已经下课5分钟了,如果是延时函数,老师回来会继续讲五分钟然后下课,但是如果是定时器,老师一看已经下课五分钟了,会直接下课。每次,无论你在干什么,定时器都会工作,但是延时函数是只有你执行它的时候,它才工作。

    举个单片机工作的个例子,比如说我们的LED流水灯每50ms流动一次,我们如果用延时函数,那么我们这50ms的间隙只能做无用功,等50ms后再流动一次,继续做无用功,51单片机是us级的设备,读一条指令大概1us,执行一次流水灯流动也就1us左右,却要浪费一整个单片机。如果用定时器就不一样了,我们可以边执行其他程序,边等待。

                                                                             励志成为一名卓越的工程师的萌新的第一篇博客                                                                                                       

你可能感兴趣的:(单片机)