zoukankan      html  css  js  c++  java
  • CORTEXM3 异常/中断控制(使能和除能)

    PRIMASK, FAULTMASK 和BASEPRI

    PRIMASK 当它置1 时,就关掉所有可屏蔽的异常,只剩下NMI和硬fault 可以响应。它的缺省值是0,表示没有关中断。

    FAULTMASK 当它置1 时,只有NMI 才能响应,所有其它的异常,包括中断和fault,通通闭嘴。它的缺省值也是0,表示没有关异常。

    BASEPRI 最多有9 位(由表达优先级的位数决定)。它定义了被屏蔽优先级的阈值。
    当它被设成某个值后,所有优先级号大于等于此值的中断都被关(优先级号越大,优先级越低)。
    但若被设成0,则不关闭任何中断,0 也是缺省值。

    为了快速地开关中断,CM3 还专门设置了一条CPS 指令,有4 种用法

    CPSID I ;PRIMASK=1, ;关中断
    CPSIE I ;PRIMASK=0, ;开中断
    CPSID F ;FAULTMASK=1, ;关异常
    CPSIE F ;FAULTMASK=0 ;开异常

    BASEPRI寄存器

    在更精巧的设计中,需要对中断掩蔽进行更细腻的控制——
    只掩蔽优先级低于某一阈值的中断——它们的优先级在数字上大于等于某个数
    那么这个数存储在哪里?就存储在BASEPRI中。不过,如果往BASEPRI中写0,
    则另当别论——BASEPRI将停止掩蔽任何中断。

    例如,如果你需要掩蔽所有优先级不高于0x60的中断,则可以如下编程:

    MOV R0, #0x60 ; pri >= 0x60 : masked
    MSR BASEPRI, R0

    如果需要取消BASEPRI 对中断的掩蔽,则示例代码如下:

    MOV R0, #0
    MSR BASEPRI, R0

    另外,你还可以使用BASEPRI_MAX这个名字来访问BASEPRI寄存器,它俩其实是同一个寄存器。
    但是当你使用这个名字时,会使用一个条件写操作。个中原因如下:
    尽管它俩在硬件水平上是同一个寄存器,但是生成的机器码不一样,从而硬件的行为也不同:

    使用BASEPRI时,可以任意设置新的优先级阈值;
    但是使用BASEPRI_MAX时则“许进不许出”——只允许新的优先级阈值比原来的那个在数值上更小
    也就是说,只能一次次地扩大掩蔽范围,反之则不行。


  • 相关阅读:
    Android程序反编译的方法(转)
    VMware的Easy Install安装
    Oracle ORA12514:TNS:监听程序当前无法识别连接描述符中请求的服务
    Java Eclipse 如何导入外部Jar包
    Oracle IMP00010: 不是有效的导出文件,标题验证失败
    怎样取消Windows 2003 server 意外关机提示
    没有文件扩展“.vbs”的脚本引擎的解决方案
    Oracle init.ora常用配置详解
    eclipse断点调试 出现Source not found
    VMware Workstation 8
  • 原文地址:https://www.cnblogs.com/shangdawei/p/2998996.html
Copyright © 2011-2022 走看看