中断处理固定优先级与可编程优先级的差别

Facebook
Twitter
LinkedIn

王胜雯,经理,晶心科技股份有限公司

  在现今 SOC 设计中,当周边设备(Peripheral IP)想要和中央处理器(CPU)沟通时,最常使用的机制则是透过中断(Interrupt)。由周边设备触发中断给中央处理器,当中央处理器接收到中断后,则可判断是由哪个周边设备触发中断,接着处理相对应的中断处理程序(ISR,Interrupt Service Routine),藉此达到彼此沟通的目的。但在同时间若有多个周边设备同时触发中断给中央处理器时,优先级别处理就成为了非常重要的一环。

  AndesCore™在中断优先级处理方面,共支持两种模式:固定中断优先级(Fixed Priority)和可编程中断优先级(Programmable Priority)。当配置为固定中断优先级时,中断处理优先级会依照中断输入脚位的顺序来决定优先处理权,脚位数字越小其优先权越高(Low Interrupt Input Number High Priority),而配置在可编程中断优先级时,可将所有中断输入设置成四个层级的优先处理权,中央处理器在同时发生触发中断时会依照其设置的层级来决定优先处理权,若发生层级相同时则再以中断输入脚位的顺序来决定优先处理级。固定中断优先级比较简单,闸门数也稍少;而可编程中断优先级则较有弹性,芯片完成后软件仍然可以根据不同应用更改中断优先级别。

   而在中央处理器进入中断处理程序后,倘若希望能让其他优先级较高的中断触发中央处理器进而处理该中断处理程序,在软件部分又应该怎么设置来达到嵌套中断的结构?我们将在本文介绍给使用者参考,期望能对使用者有所帮助,也希望读者不吝指教提供您宝贵的意见。

1. 中断优先级介绍
AndesCore™共支持两种中断优先级处理模式:固定优先级模式(Fixed Priority)与可编程优先级模式(Programmable Priority)。前者是 AndeStar 架构 V1 及V2 定义的; AndeStar V3/V3m 架构除保留前者的选项以维持向后兼容(backward-compatibility)之外,也加入更有彈性的后者选项。以下的介绍将基于V3m AndesCore™ N801-S 这颗中央处理器。带领使用者循序渐进地了解这两种中断优先级处理模式的差异。

1.1. Definition
AndesCore™ N801-S支持两种中断优先级模式,在硬件配置时就需要先决定中断优先级的模式,如图1的硬件配置窗口所示,首先,我们先介绍关于这两种模式的定义。

图1. 硬件配置窗口

1.1.1 Fixed Priority Mode 
  在AndesCore™ N801-S硬件配置时,若配置在中断固定优先级模式下,中央处理器在多个触发中断同时发生时,则依照中断输入脚位来决定处理顺序,请参考表1。

表1. Fixed Priority Mode 触发中断处理优先级

1.1.2 Programmable Priority Mode
  在AndesCore™ N801-S硬件配置时,若配置在中断可编程优先级模式下,中央处理器在多个触发中断同时发生时,则依照每个中断输入设置的优先层级来决定处理顺序,请参考表2。而在可编程优先级模式下,每个中断输入都有四个优先层级可以让使用者编写软件时设置,用户也可以透过系统寄存器(PPL2FIX_EN) 将模式从可编程优先级模式切换至固定优先级模式。

表2. Programmable Priority Mode 触发中断处理优先级

1.2. System Register
  关于上述两种中断优先级模式,在可编程优先级模式下用户可透过设置AndesCore™ N801-S内部的system register来设置每个中断优先权层级,以及将可程序化优先权模式切换回固定优先级模式。

  设置优先级的system register为INT_PRI(ir18)与INT_PRI2(ir28),每个中断输入都有四个层级让使用者规划,其格式如图2与图3的寄存器配置,而设定值的优先权可参考表3的解释。

图2. Format of Interrupt Priority Register (HW_INT0~HW_INT15)

图3. Format of Interrupt Priority Register2 (HW_INT16~HW_INT31)

  在硬件配 置成可 编程优先级模式下时 ,有一个system register 为INT_CTRL(ir19)。透过设置INT_CTRL.0,用户在硬件配置成可编程优先级模式下切换回固定优先级模式。其格式如图4的缓存器配置,而内容值的意义可参考表4的解释。当PPL2FIX_EN=1时,CPU处理中断的方式则会与硬件配置成固定优先权模式的情况一样,CPU只根据中断输入的号码大小来决定处理顺序。

  控制中断输入 on/off 的 system register 为 INT_MASK2(ir26),用户可以透过设定该寄存器来决定各中断输入是否开启,其各相关描述可参考图 5 与表 5。

图 5. Format of Interruption Masking Register 2

  与中断控制还有一个很重要的System register就是Processor Status Word Register(PSW),其中PSW.GIE(Global Interrupt Enable)是用来控制中断程序致能, PSW.INTL(Interruption Stack Level) 是纪录 CPU 当前中 断层 级的数据 , PSW.CPL(Current Priority Level)则是纪录当前中断优先级数据,其各相关描述可参考图6与表6~表8。

1.3. Nested Interrupt
  在中断处理程序中,最常用到的就是嵌套中断(Nested Interrupt) 的应用,在这个章节将介绍 AndesCore™如何实现嵌套中断处理程序。

当CPU发生中断进入中断处理程序时,硬件会关闭中断致能(PSW.GIE),并将中断层级(PSW.INTL)加一,在离开中断程序后硬件会将中断层级减一,再重新开启中断致能。以AndesCore™ N801-S为例,PSW.INTL可支持至2 Level(01),若要实现嵌套中断的应用,CPU在进入中断处理程序后,需要先将中断层级进行降级(PSW.INTL-1),避免嵌套中断的发生造成中断层级溢位(overflow)而让CPU 进入exception interrupt,降级后再开启中断致能(PSW.GIE),CPU就可以实现嵌套中断程序,可参考图7的流程图说明。发生嵌套中断程序时,CPU硬件会比对当前中断优先级(PSW.CPL),来决定是否让CPU处理该嵌套中断,另外CPU在处理嵌套中断程序时,必须由软件来备份通用寄存器與内容, 用户可以参考AndeSight™中提供的相关demo code。

2. 非嵌套中断优先级处理程序介绍
在介绍完中断处理模式相关定义之后,本章节提供在非嵌套中断 (Non-nested Interrupt)实际开发与应用上的范例,让用户可更了解在不同中断处理模式下的差异。

2.1. Multi-Interrupts at Fixed Priority Mode
  本章节介绍当硬件配置在固定中断优先级模式下时,发生多个中断时,CPU在处理的程序。

图 8 中,表示同时发生 HW_INT1、HW_INT28 与 HW_INT30 三个中断源, 此时 CPU 会依照中断输入号码大小(号码越小优先权越高)来决定处理优先级,所以 CPU 依序先处理 HW_INT1,然后再接着处理 HW_INT28,最后再处理HW_INT30。

图 8. 固定中断优先级 CPU 处理程序(一)

图 9 中,表示同时发生 HW_INT1 与 HW_INT30 两个中断源,在 CPU 处理完 HW_INT1 后应该接着处理 HW_INT30,但在处理 HW_INT1 的同时,外部中断源又接着发生 HW_INT28,所以在 CPU 在处理完 HW_INT1 后会优先处理HW_INT28,然后最后才处理 HW_INT30。

图 9. 固定中断优先级 CPU 处理程序(二)

  图 10 中,表示同时发生 HW_INT28 与 HW_INT30 两个中断源,在 CPU 处理完 HW_INT28 后接着处理 HW_INT30,此时外部发生了 HW_INT1,在没有使用嵌套中断的情况下,此时 CPU 已经在处理 HW_INT30,所以并不会因为HW_INT1 的中断优先权大于 HW_INT30 而去处理 HW_INT1 ,必须等到HW_INT30 处理完毕,最后才处理 HW_INT1。

图 10. 固定中断优先级 CPU 处理程序(三)

2.2. Multi-Interrupts at Programmable Priority Mode
  本章节介绍当硬件配置在可编程中断优先级模式下时,发生多个中断时,CPU 在处理的程序。

  图 11 中,表示同时发生 HW_INT1(PPL=2) 、 HW_INT28(PPL=0) 与HW_INT30(PPL=1)三个中断源,此时 CPU 会依照中断优先权大小(PPL 值越小优先权越高)来决定处理优先级,所以 CPU 依序先处理 HW_INT28(PPL=0),然后再接着处理 HW_INT30(PPL=1),最后再处理 HW_INT1(PPL=2)。

图 11. 可编程中断优先级 CPU 处理程序(一)

图 12 中, 表示同时发生 HW_INT1(PPL=1) 、 HW_INT28(PPL=0) 与HW_INT30(PPL=1)三个中断源,此时 CPU 会依照中断优先级大小来决定处理优先级,而发生中断优先权大小相同时,则再依照中断号码大小(号码越小优先权越高) 来决定处理优先级。 CPU 依序先处理 HW_INT28(PPL=0) , 此时HW_INT1(PPL=1)与 HW_INT30(PPL=1)的 PPL 相同,CPU 则依照中断输入号码大小来决定优先级,所以先接着处理 HW_INT1(PPL=1) , 最后再处理HW_INT30(PPL=1)。

图 12. 可编程中断优先级 CPU 处理程序(二)

图 13 中,表示同时发生 HW_INT28(PPL=0)与 HW_INT30(PPL=1)两个中断源,此时 CPU 会依照中断优先级大小来决定处理优先级,所以 CPU 先处理HW_INT28(PPL=0),但在处理 HW_INT28(PPL=0)的同时,外部中断源又接着发生 HW_INT1(PPL=0),所以 CPU 在处理完 HW_INT28(PPL=0)后会优先处理HW_INT1(PPL=0),最后再处理 HW_INT30(PPL=1)。

图 13. 可编程中断优先级 CPU 处理程序(三)

图 14 中,表示同时发生 HW_INT28(PPL=1)与 HW_INT30(PPL=2)两个中断源,此时 CPU 会依照中断优先权大小来决定处理优先级,所以 CPU 先处理HW_INT28(PPL=1) ,然后接着处理 HW_INT30(PPL=2) ,但在处理HW_INT30(PPL=2)的同时,外部中断源又接着发生 HW_INT1(PPL=0),在没有使用嵌套中断的情况下,此时 CPU已经在处理 HW_INT30(PPL=2),所以 CPU 并不会因为 HW_INT1(PPL=0) 的优先权大于 HW_INT30(PPL=2) 而去处理HW_INT1(PPL=0) , 必须等到 HW_INT30(PPL=2) 处理完毕, 最后才处理HW_INT1(PPL=0)。

图 14. 可编程中断优先级 CPU 处理程序(四)

3. 嵌套中断优先级处理程序介绍
  本章节将介绍嵌套中断(Nested Interrupts)实际开发与应用上的范例,让用户可以更快速了解嵌套中断处理程序的实现。因为固定优先权模式先天逻辑简化后的限制,处理嵌套中断没有可编程优先权模式简捷有效率。如果必需使用嵌套中断,建议硬件配置在可编程优先权模式(Programmable Priority)。下面介绍在此模式下,如何实现嵌套中断处理程序,以下范例中在进入每个中断处理程序后也都已经先完成嵌套中断的软件降级程序。

图 15 中,表示当 CPU 正在处理 HW_INT1(PPL=1)中断源时,若发生嵌套中断 HW_INT30(PPL=1),CPU 并不会进入 HW_INT30(PPL=1)的嵌套中断处理程序中,等到 HW_INT1(PPL=1) 中断处理程序结束后, CPU 才会进入HW_INT30(PPL=1)的中断处理程序中。

图 16 中,表示当 CPU 正在处理 HW_INT1(PPL=1)中断源时,若发生嵌套中断 HW_INT30(PPL=2),CPU 并不会进入 HW_INT30(PPL=2)的嵌套中断处理程序中,倘若此时又再发生嵌套中断 HW_INT28(PPL=0) 时, CPU 则进入HW_INT28(PPL=0)的嵌套中断处理程序中,等到 HW_INT28(PPL=0)中断处理程序结束后回到 HW_INT1(PPL=1)的中断处理程序中,等到 HW_INT1(PPL=1)中断处理程序结束后,CPU 才会进入 HW_INT30(PPL=2)的中断处理程序中。

4. 結語
  在 AndesCore™所提供的两种中断优先级模式里,都可以实现嵌套中断(Nested Interrupt)的处理,透过上述的几种多个中断源发生时,在 AndesCore™ N801-S 处理程序上的范例,相信各位对于嵌套中断与非嵌套中断的实现有了更进一步的了解,对于在中断源的配置上就能依照电路需要来规划输入脚位以及灵活运用可编程优先级中断的功能。在 AndeSight™软件整合开发环境中也提供关于中断处理程序的软件范例,让用户在程序开发过程更为简单与快速。