码迷,mamicode.com
首页 > 其他好文 > 详细

SylixOS屏蔽中断实现

时间:2017-10-17 12:23:37      阅读:128      评论:0      收藏:0      [点我收藏+]

标签: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

原文地址:http://xiaoyaolanyun.blog.51cto.com/2586643/1973163

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!