1、总开关

每个CPU有一个中断总开关。通过CPU中断控制寄存器实现。Cortex-M的中断控制寄存器包括:FAULTMASK、PRIMASK、BASEPRI、BASEPRI_MAX。总开关的本质是变更当前执行优先级,根据Cortex-M的架构设计,只有优先级高于当前执行优先级的中断或异常才能抢占CPU。

FAULTMASK

设置为1后关闭所有中断和异常,包括HardFault异常,只有NMI和Reset可以得到响应。

PRIMASK

设置为1后关闭所有中断和除了HardFault异常外的所有其他异常,只有NMI、Reset和HardFault可以得到响应。

BASEPRI

设置为n后,屏蔽所有优先级数值大于等于n的中断和异常。Cortex-M的优先级数值越大其优先级越低。

BASEPRI_MAX

和BASEPRI类似,但有个限制,即后写入的优先级数值要比当前的BASEPRI值小才会起作用,否则不起作用。影响范围最广,影响CPU内的所有中断源。

事实上BASEPRI_MAX和BASSEPRI是操作同一个寄存器,不过BASEPRI_MAX是一个条件写指令,可以通过下列等效功能代码理解:

// atomic related functions for unittest.
extern uint8_t atomic_BASEPRI; // 用来模拟 BASEPRI 的值 // BASEPRI 设置
static inline uint8_t __set_BASEPRI(uint8_t prio)
{
atomic_BASEPRI = prio;
} // BASEPRI_MAX 设置
static inline uint8_t __set_BASEPRI_MAX(uint8_t prio)
{
if(prio && (atomic_BASEPRI == || atomic_BASEPRI > prio)) {
atomic_BASEPRI = prio;
}
}

疑问:线程模式下,当前优先级和中断优先级的抢占优先级相同,但中断的子优先级比当前子优先级高,会怎么样?当前优先级也分抢占优先级和子优先级吗?

2、分开关

Cortex-M包括一个嵌套向量中断控制器NVIC,每个外设在NVIC中都有一个对应的位,用来控制该外设的中断。

  • 写NVIC->ISER寄存器中外设对应位为1打开中断。
  • 写NVIC->ICER寄存器中外设对应位为1关闭中断。

分开关只影响特定外设的中断。

3、源开关

外设通常有多个中断源,如接收到数据、发送完成、接收超时等等。外设通常提供中断使能寄存器控制哪些中断源产生时要向上汇报(向分开关汇报)。源开关与特定的外设相关,不同的外设会有不同的中断,有不同的中断控制寄存器。有些外设本身有总开关,该总开关控制该外设的所有中断。

源开关影响范围最窄,仅影响外设的某一种中断源。

最新文章

  1. podfile The dependency `` is not used in any concrete target
  2. checkbox
  3. Hello, Android多屏幕版
  4. 算法手记 之 数据结构(线段树详解)(POJ 3468)
  5. GoLang文件增删遍历基本操作
  6. 【SSH 1】SSH框架的基本理解
  7. R.id.layout等不能识别:cannot be resolved or is not a field
  8. Sql server统计查询语句消耗时间
  9. XSS CSRF
  10. iOS 7 - Auto Layout on iOS Versions prior to 6.0
  11. lumen的自定义依赖注入
  12. JDK及JRE目录结构
  13. LeetCode 15 3Sum [sort] <c++>
  14. OpenBUGS抽样数据基本操作
  15. [原创] debian 9.3 搭建Jira+Confluence+Bitbucket项目管理工具(四) -- 安装crowd 3.1.2
  16. BZOJ3420[POI2013]Triumphal arch&BZOJ5174[Jsoi2013]哈利波特与死亡圣器——树形DP+二分答案
  17. PHP - CentOS下开发运行环境搭建(Apache+PHP+MySQL+FTP)
  18. 【css】css 中文字体 unicode 对照表
  19. JDK源码之Lock接口
  20. Spring Cloud Zuul的一个坑

热门文章

  1. [20190725NOIP模拟测试8]题解
  2. Java桌球小游戏1
  3. sql server 2008 数据库数据类型
  4. python去除rpm仓库中同名低版本的包
  5. 通过start.spring.io生成的springboot项目,导入IDE后POM第一行报错
  6. 30-Ubuntu-用户权限-01-用户和权限的基本概念
  7. 基于角色访问控制的OA系统的设计与实现
  8. Linux初学习之 rm 命令
  9. Android SDK中无法安装HAXM installer
  10. linux 6 timezone修改