中断控制及basepri 与 basepri_max
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、源开关
外设通常有多个中断源,如接收到数据、发送完成、接收超时等等。外设通常提供中断使能寄存器控制哪些中断源产生时要向上汇报(向分开关汇报)。源开关与特定的外设相关,不同的外设会有不同的中断,有不同的中断控制寄存器。有些外设本身有总开关,该总开关控制该外设的所有中断。
源开关影响范围最窄,仅影响外设的某一种中断源。
中断控制及basepri 与 basepri_max的更多相关文章
- STM32中断控制及优先级设置
		M3用8bits而STM32用高四位来表示抢占和子优先级:bit=1表示抢占:bit=0表示非抢占即子优先级:所以共有5中方案分组: 分组 Bit7 Bit6 Bit5 Bit4 说明: 第0组 ... 
- 理解Linux内核之中断控制
		乍一看下边的Linux内核代码,貌似L3389有bug,于是我就绕有兴趣地阅读了一下local_irq_save/local_irq_restore的源代码. /* linux-4.14.12/mm/ ... 
- 嵌入式外部中断控制编程方法论—比較CC2541(51核)和S5PV210(ARM核)
		这是一篇阐述怎样对嵌入式SOC外部中断进行控制编程的方法论文章.希望读者理解本篇文章后.能够具备对市场上全部已经面世和将来面世的嵌入式芯片的外部中断进行控制编程的能力. 笔者原创的技术分享一直都恪守下 ... 
- cc2530的第三次实验,按键中断控制流水灯
		cc2530的第三次实验:按键中断控制流水灯 效果为按一次按键,流水灯亮一次 实验相关电路图: 实验相关寄存器: 初始化函数 //初始化LED灯 //设置P1SEL,通用为0,外设为1 1111110 ... 
- 痞子衡嵌入式:嵌入式MCU中通用的三重中断控制设计
		大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是嵌入式MCU中通用的三重中断控制设计. 我们知道在 MCU 裸机中程序代码之所以能完成多任务并行实时处理功能,其实主要是靠中断来调度的, ... 
- 电赛菜鸟营培训(二)——STM32F103CB之中断控制
		一.中断的概念 中断可以理解为一个有激励给它就会立马给你响应的一个东东.就是说在你执行main函数的内容时,当有这个触发时便会跳转到这个中断内存,执行这段代码. Attention: 1.中断的用法, ... 
- STM32之外部中断控制
		一.STM32外部中断 1.STM32外部中断结构图 如上图所示:主要包括四个环节,GPIO.AFIO.EXTI.NVIC.以STM32F103VE(100脚)为例说明硬件模块的数量: GPIO: ... 
- EXIT(外部中断)控制实验
		实验目的 设计使用外接的按键来作为触发源,使得控制器产生中断,并在中断服务函数中实现控制小灯的亮灭. 按键硬件点路 编程要点 初始化用来产生中断的 GPIO: 初始化 EXTI: 配置 NVIC: 编 ... 
- zju(6)中断控制实验
		1.实验目的 1.学习和掌握Linux下中断驱动的写法: 二.实验内容 1.编写EduKit-IV实验箱Linux操作系统下按键key的驱动: 2.编写EduKit-IV实验箱Linux操作系统下按键 ... 
随机推荐
- Shiro学习(4)INI配置
			之前章节我们已经接触过一些INI配置规则了,如果大家使用过如spring之类的IoC/DI容器的话,Shiro提供的INI配置也是非常类似的,即可以理解为是一个IoC/DI容器,但是区别在于它从一个根 ... 
- JCF——List
			ArrayList LinkedList Vector 
- 序列递推——cf1204E(好题)
			/* 显然用dp[i][j]来表示i个1,j个-1的结果 dp[i][j]由dp[i-1][j]和dp[i][j-1]转移而来 即dp[i][j]对应的所有序列,都可以由dp[i-1][j]在前面加一 ... 
- Linux特殊权限设置以及使用
			Linux文件权限特殊权限(s-s-t) 什么是suid权限 SUID是可执行文件的特殊文件权限,使其他用户能够以文件所有者的有效权限运行文件. 代替执行权限的正常x代替用户的s(指示SUID )特权 ... 
- Java桌球小游戏
			版本一.出现窗口package cn.xjion.game;/** * 出现窗口 * @author xjion * */import java.awt.*;import javax.swing.*; ... 
- Dubbo入门到精通学习笔记(十四):ActiveMQ集群的安装、配置、高可用测试,ActiveMQ高可用+负载均衡集群的安装、配置、高可用测试
			文章目录 ActiveMQ 高可用集群安装.配置.高可用测试( ZooKeeper + LevelDB) ActiveMQ高可用+负载均衡集群的安装.配置.高可用测试 准备 正式开始 ActiveMQ ... 
- Leetcode刷题——007.整数反转
			上代码: #include <cmath> class Solution { public: int reverse(int x) { ; long long tx=llabs(x); ) ... 
- 1. Python版本的选择与安装
			Python综述 Python由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年.Python是一种解释型.面向对象.动态数据类型的高级程序设计语言,它具有卓越的通 ... 
- 2、Appium Desktop 使用介绍
			1.appium运行界面介绍 默认显示监控的 host 和 port , 这和 Appium-Server 中是一致的. 2.点击 “Start Server V 1.7.2” 按钮启动服务,出现如 ... 
- 前端(二十二)—— vue组件:局部组件、全局组件、父组件数据传到子组件、子组件数据传到父组件、父子组件实现todoList
			Vue组件 一.组件介绍 每一个组件都是一个vue实例 每个组件均具有自身的模板template,根组件的模板就是挂载点,根组件也可以显式书写模板,会替换掉挂载点 每个组件模板只能拥有一个根标签 子组 ... 
