中断优先级和中断嵌套的概念对于系统设计非常重要。一般来说,中断可以分为一般紧急的中断和特别紧急的中断,具体的区分取决于系统设计的需求。在此,我将简单介绍相关寄存器,但不提供具体的示例说明。
中断的产生背景通常还更加复杂。举个例子,当我正在看电视时,突然来了个电话。我必须中断当前的活动,处理接电话的”中断”程序。而正在通话中,我又听到了水开的声音,这时又发生了水开的”中断”。我需要先放下电话,去关闭煤气,然后再回来继续电话通话,最后再看电视。这里涉及到一个优先级的问题。
还有一种情况,当我看电视时,突然听到水开的声音,水开的”中断”发生了。我需要进入关闭煤气的”中断”程序。然而,在关闭煤气的同时,电话铃声响起。此时,我处理的顺序是先关闭煤气,然后接听电话,最后继续看电视。
从这两个过程中我们可以得出一个结论:一旦最紧急的事情发生,无论当时处于哪个”程序”中,我们必须先处理最紧急的事情,然后再解决其他事情。
在单片机程序中,有时也遇到这样的情况。有一般紧急的中断和特别紧急的中断,具体取决于系统设计。这就涉及到中断优先级和中断嵌套的概念。今天我先简单介绍相关寄存器,但不提供示例说明。
中断优先级有两种,一种是抢占优先级,一种是固有优先级,先介绍抢占优先级。来看表1和表2。
表1:IP——中断优先级寄存器的位分配(地址0xB8、可位寻址)
image-20240116182324794
表2:IP——中断优先级寄存器的位描述
IP 这个寄存器的每一位,表示对应中断的抢占优先级,每一位的复位值都是 0,当我们把某一位设置为 1 的时候,这一位的优先级就比其它位的优先级高了。
比如我们设置了 PT0位为 1 后,当单片机在主循环或者任何其它中断程序中执行时,一旦定时器 T0 发生中断,作为更高的优先级,程序马上就会跑到 T0 的中断程序中来执行。
反过来,当单片机正在 T0中断程序中执行时,如果有其它中断发生了,还是会继续执行 T0 中断程序,直到把 T0 中的中断程序执行完毕以后,才会去执行其它中断程序。
当进入低优先级中断中执行时,如又发生了高优先级的中断,则立刻进入高优先级中断执行,处理完高优先级级中断后,再返回处理低优先级中断,这个过程就叫做中断嵌套,也称为抢占。
所以抢占优先级的概念就是,优先级高的中断可以打断优先级低的中断的执行,从而形成嵌套。当然反过来,优先级低的中断是不能打断优先级高的中断的。
表3:中断查询序列
image-20240116182330515
那么既然有抢占优先级,自然就也有非抢占优先级了,也称为固有优先级。在表3中的最后一列给出的就是固有优先级,请注意,在中断优先级的编号中,一般都是数字越小优先级越高。
从表3中可以看到一共有 1~6 共 6 级的优先级,这里的优先级与抢占优先级的一个不同点就是,它不具有抢占的特性,也就是说即使在低优先级中断执行过程中又发生了高优先级的中断,那么这个高优先级的中断也只能等到低优先级中断执行完后才能得到响应。既然不能抢占,那么这个优先级有什么用呢?
答案是多个中断同时存在时的仲裁。比如说有多个中断同时发生了,当然实际上发生这种情况的概率很低,但另外一种情况就常见的多了,那就是出于某种原因我们暂时关闭了总中断,即 EA=0,执行完一段代码后又重新使能了总中断,即 EA=1,那么在这段时间里就很可能有多个中断都发生了,但因为总中断是关闭的,所以它们当时都得不到响应,而当总中断再次使能后,它们就会在同时请求响应了,很明显,这时也必需有个先后顺序才行,这就是非抢占优先级的作用了——如表3中,谁优先级最高先响应谁,然后按编号排队,依次得到响应。
抢占优先级和非抢占优先级的协同,可以使单片机中断系统有条不紊的工作,既不会无休止的嵌套,又可以保证必要时紧急任务得到优先处理。在后续的学习过程中,中断系统会与我们如影随形,处处都有它的身影,随着学习的深入,相信你对它的理解也会更加的深入。
以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !