关于定时中断的常见问题

Q:延时函数和定时器的区别?

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

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

 

Q:中断函数为什么不在主函数中运行? 

A:主函数是一个函数,中断函数也是一个函数,它们是独立的函数,所以是分开的。中断是异步的,异步的意思就是中断在任何时候都可以打断主函数的运行,进而运行优先级更高的中断函数。所以中断就是打断主函数去执行更高优先级别的中断函数的一个过程,你想一下?你中断函数在主函数里,打断的就是主函数,即使你中断函数优先级高又怎样?也不会给你执行。换句话说就是,写在主程序中就只能一步一步执行,达不到优先级高的目的了。

 

Q:当中断服务程序执行完了之后,程序返回主程序第一行,还是返回中断前所在语句?

A:返回中断前那一句,把因中断而没做完的事继续做下去。在程序正常执行的时候,如果来了一个中断。那么,单片机会保存当前地址然后立即进入中断服务函数。执行完毕后,回到保存的地址处也就是中断发生的地方继续向下执行。

 

案例举例:

因为你放在主函数中,如果正在执行第12行的时候,2.5ms的一个中断又来了,那这个流水灯都还没执行就被打断去执行time++;这一条语句了,然后才又返回到被之前打断的位置状态继续执行。这样回到time++;这条一句和CPU的进栈出栈都耗了时间,所以就容易不准确。所以建议动作尽量多的放在中断里。

posted @ 2022-05-14 10:02  iZJ"Qq4577105  阅读(185)  评论(0编辑  收藏  举报