举例说明下,中断何时会被丢弃与不会被丢弃:
假设正在执行INT0中断服务程序中,程序执行时间很长,还未结束(遇RETI指令视为结束!)
而外设正通过串口向CPU发送数据1,2,3,4……
这时收到发来了【1】,RI被置位,由于INT0未结束,而串口无法响应中断;
須臾【2】又收到了,RI再次置位,不过RI原本已是1,置位也是白置,SBUF中的【1】,被【2】挤掉了。
这时INT0结束了,RI=1的申请被执行,于是转串口中断服务,也就收到了【2】,这样【1】就丢失了。
这时【3】又发来了,RI又被硬件置1。由于程序写的很糟糕,应在开始就清RI,结果,在中断服务程序结束前才清RI。这样【3】也丢了。
然后【4】来了,当然就收到了。
【关键点】记住:
1、每个中断源有一个IF标记,中断源动作(起效)时,IF被硬件置1,但它只是【申请】中断,是否被被批准【响应】,还取决于其它条件(被允许、已打开、无更高、同级在执行、CPU当前指令执行完毕……)。
2、由于一个中断源只有一个标记IF,会出现以下三种情况:
2.1、中断源动作了,IF被置1,但未被响应(如串口收到【1】未被响应),又来了N次动作(如串口又陆续收到【2】……【N】),那么只有中断响应前的一个【N】会被收到,在N之前的全部丢失。
2.2、中断响应后IF未被清除保持1,在中断服务退出后,会再次进入中断。也即数据【1】被无限次当作串入的数据。
所以必须及时清除中断标记IF。提示:注意看手册,有的IF在中断响应后会由硬件自动清除。
2.3、中断源动作让IF=1,在未被响应之前,误将IF清成0,则中断申请取消,无法响应,即丢失。这在共用一个中断入口的中断源中时易发生。
例如,串行中断服务程序:先看了TI=0无发送中断,于是转至查看RI=1,就在处理接收数据过程中,TI变1了、之后服务程序也结束了,不过程序写的比较差,在退出中断前,才清除了RI、TI。这样就丢失了一个TI。
|