SylixOS屏蔽中断实现

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SylixOS屏蔽中断实现相关的知识,希望对你有一定的参考价值。

1.Cortex M7的异常掩码寄存器

1.1 PRIMASK寄存器

    PRIMASK寄存器可以屏蔽除NMI(不可屏蔽中断)与硬件fault(硬件错误)之外的所有异常。PRIMASK关中断的汇编代码如图 11所示,PRIMASK开中断的汇编代码如图 12所示。

技术分享

图11 PRIMASK关中断

技术分享

图12 PRIMASK开中断

1.2 FAULTMASK寄存器

    FAULTMASK寄存器可以屏蔽除NMI之外的所有异常,包括硬件fault。使用FAULTMASK寄存起开关异常的汇编代码如图 13所示。

技术分享

图 13 FAULTMASK开关异常

1.3 BASEPRI寄存器

    BASEPRI寄存器是常规异常的优先级阈值寄存器,其可以对中断进行更细腻的控制,其可以屏蔽优先级低于某一阈值的中断。如图 14表示屏蔽优先级不高于0x60的中断。



技术分享

图14 BASEPRI寄存器使用示例

2.SylixOS屏蔽中断

2.1 SylixOS中断异常处理程序屏蔽中断

    SylixOS中断异常处理程序使用BASEPRI寄存器,利用优先级来屏蔽中断和异常。因为系统是用SVC异常实现中断堆栈的压栈与出栈,如果屏蔽所有中断和异常则无法相应SVC异常。

    系统在进入中断异常服务程序后,会设置BASEPRI寄存器,利用优先级屏蔽中断。如图 21所示。


技术分享

图 21 中断异常服务程序屏蔽中断


2.2 archIntDisable屏蔽中断


    archIntDisable函数同样使用优先级屏蔽中断。同中断异常处理程序一样,需要设置BASEPRI寄存器的值,如图 22所示。

技术分享

图 22 archIntDisable屏蔽中断


    应该注意的是如果tick中断优先级设置过高,导致BASEPRI寄存器无法屏蔽tick中断,则会破坏系统中断服务程序的原子性。tick中断会打断其他中断,同理其他设备中断优先级设置过高也会出现无法被屏蔽的情况。










本文出自 “逍遥蓝云的家” 博客,请务必保留此出处http://xiaoyaolanyun.blog.51cto.com/2586643/1973163

以上是关于SylixOS屏蔽中断实现的主要内容,如果未能解决你的问题,请参考以下文章

SylixOS 中断流程

SylixOS 中断流程

SylixOS 共用中断号机制

SylixOS中GIC通用中断控制器——GIC实现

SylixOS Lite版本中断优先级设置

SylixOS 中断系统分析