stm32的抢占优先级和响应优先级(也叫子优先级)
一、抢占优先级和响应优先级
STM32 的中断向量具有两个属性,一个为抢占属性,另一个为响应属性,其属性编号越小,表明它的优先级别越高。
抢占,是指打断其他中断的属性,即因为具有这个属性会出现嵌套中断(在执行中断服务函数A 的过程中被中断B 打断,执行完中断服务函数B 再继续执行中断服务函数A),抢占属性由NVIC_IRQChannelPreemptionPriority 的参数配置。
而响应属性则应用在抢占属性相同的情况下,当两个中断向量的抢占优先级相同时,如果两个中断同时到达, 则先处理响应优先级高的中断, 响应属性由NVIC_IRQChannelSubPriority 参数配置。例如,现在有三个中断向量,如下表。
若内核正在执行C 的中断服务函数,则它能被抢占优先级更高的中断A 打断,由于B和C 的抢占优先级相同,所以C 不能被B 打断。但如果B 和C 中断是同时到达的,内核就会首先响应响应优先级别更高的B 中断。
二、NVIC 的优先级组
Cortex-M3允许具有较少中断源时使用较少的寄存器位指定中断源的优先级,因此STM32把指定中断优先级的寄存器位减少到4位,这4个寄存器位的分组方式如下:
第0组:所有4位用于指定响应优先级
第1组:最高1位用于指定抢占式优先级,最低3位用于指定响 应优先级
第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级
第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级
第四组:所有4位用于指定抢占式优先级
M3用8bits而STM32用高四位来表示抢占和子优先级:bit=1表示抢占;bit=0表示非抢占即子优先级;所以共有5中方案分组:
分组 Bit7 Bit6 Bit5 Bit4 说明:
第0组 0 0 0 0
第1组 1 0 0 0
第2组 1 1 0 0 抢占共有22=4(0~3);子优先级22=4(0~3),共44=16级嵌套
第3组 1 1 1 0 抢占共有23=4(0~7);子优先级21=2(0~1),共82=16级嵌套
第4组 1 1 1 1
到底谁优先:数字越小优先级越高,抢占级数字小的可剥夺抢占级数字大的
1抢占相同,子优先级不同:此时没有抢占剥夺,此时按照子优先级顺序排序
2抢占和子优先级都相同但有先后:此时无抢占剥夺,依照FIFO,前一个执行完了才能执行后者;
3抢占和子优先级都相同且同时到达:此时按照中断向量表顺序排先后
三、举例说明
中断优先级设置步骤:
系统运行后先设置中断优先级分组。在主函数调用函数:void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);
整个系统执行过程中,只设置一次中断分组。
针对每个中断,设置对应的抢占优先级和响应优先级:
//配置过程
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中断,此处可改为任何有中断功能的模块定时器,外部中断等,
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;// 抢占优先级为1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;// 子优先级位2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据上面指定的参数初始化NVIC寄存器
如果需要挂起/解挂,查看中断当前激活状态,分别调用相关函数即可。
优先级分组只是给抢占优先级与响应优先级在中断优先级寄存器中高四位分配各个优先级数字所占的位数,在程序中只能设定一次。
每写一个关于中断优先级的程序必须包含下列两个函数:
(1)void NVIC_PriorityGroup();//写在主程序中;
(2)NVIC_Init(); //写在初始化配置中
默认情况下,如何不设置中断优先级分组,则中断优先级分组默认为0,即0位抢占优先级,4位响应优先级,则无任何抢占优先级,所以无论中断的优先级设多少,都没有抢占中断的功能,所以,如果想要一个中断打断另一个中断,必须设置中断优先级分组为1,2,3,4.
如设置优先级分组为2:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
具体例子如下:
{
假设NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1)则
// 使能EXTI0中断
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 指定抢占式优先级别1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 指定响应优先级别0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
// 使能EXTI9_5中断
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 指定抢占式优先级别0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 指定响应优先级别1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//TIM3中断
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级0级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //响应优先级3级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
TIM_Cmd(TIM3, ENABLE); //使能TIMx外设
}
在上例子中,优先抢占优先级,其数字越低,优先级越高。相同下比较响应优先级,其数字越低,优先级越高
**Tips:**代码中抢占优先级0,1等,响应优先级(子优先级)0,1,3等,都是由自己设置的,但是必须在抢占优先级或者响应优先级设定的范围内。
stm32的抢占优先级和响应优先级(也叫子优先级)相关推荐
- STM32的抢占优先级和响应优先级
转自野火<零死角玩转STM32> 一.抢占优先级和响应优先级 STM32 的中断向量具有两个属性,一个为抢占属性,另一个为响应属性,其属性编号 越小,表明它的优先级别越高. 抢占, ...
- 【转】STM32中的抢占优先级、响应优先级概念
STM32(Cortex-M3)中有两个优先级的概念--抢占式优先级和响应优先级,有人把响应优先级称作'亚优先级'或'副优先级',每个中断源都需要被指定这两种优先级. 具有高抢占式优先级的中断可以在具 ...
- STM32中断分配——抢占优先级与响应优先级
<原创声明:本文属博主原创,禁止一切形式的转载.抄袭> 在用单片机做数据采集或者控制的时候,有时候需要一个工程开好几个中断,去同时控制舵机.电机.串口数据收发等等,这时候就需要对这若干个中 ...
- 【STM32】NVIC 中断优先级管理,抢占优先级,响应优先级,中断寄存器
文章目录 抢占优先级和响应优先级 抢占 响应 NVIC 的优先级组 中断寄存器 ISER[8] ICER[8] ISPR[8] ICPR[8] IABR[8] IP[240] 中断优先级设置步骤总结 ...
- STM32的中断优先级说明(抢占式与响应式优先级)
注:查看寄存器请看<ARM Cortex-M4权威指南>,由于本人采用库开发,所以就不深究寄存器了.总结资料来源于原子的<STM32F4库开发指南>,总结于此,方便查找. ST ...
- 中断优先级分组与抢占优先级和响应优先级的关系
之前学习嵌入式的时候不太明白中断优先级分组与抢占优先级和响应优先级的关系,比如分组为2,抢占优先级也为2,响应优先级也为2,就是不明白他们之间有什么关系,谁决定谁,总共有多少个数值可供选择. 趁着现在 ...
- Linux——孤儿进程|进程的优先级 用top命令去修改优先级 其他概念 环境变量 PATH 获取环境变量
目录 孤儿进程 进程的优先级 用top命令去修改优先级 其他概念 环境变量 PATH 获取环境变量 习题 孤儿进程 父进程如果提前退出,那么子进程后退出,进入Z之后,那该如何处理呢? 父进程先退出,子 ...
- java 多线程 优先级_java多线程之线程的优先级
在操作系统中,线程可以划分优先级,优先级较高的线程得到CPU资源较多,也就是CPU优先执行优先级较高的线程对象中的任务(其实并不是这样). 在java中,线程的优先级用setPriority()方法就 ...
- java多线程 修改优先级_Java多线程-线程的调度(优先级)
与线程休眠类似,线程的优先级仍然无法保障线程的执行次序.只不过,优先级高的线程获取CPU资源的概率较大,优先级低的并非没机会执行. 线程的优先级用1-10之间的整数表示,数值越大优先级越高,默认的优先 ...
最新文章
- 如何给“物联网小白”讲清楚什么是无线通信模块?很简单,会打电话就行~
- 最短路问题之Bellman-ford算法
- mysql导出数据意义_导出数据库的意义
- .NET6之MiniAPI(一):开始Mini API
- Linux常用命令(知道啦就赶紧收藏吧)
- js方式调用php_举例说明JS调用PHP和PHP调用JS的方法
- lua如何打印行号_LUA教程错误信息和回跟踪(Tracebacks)-34
- MVC +EF+linq 多表联查
- spring jpa查询视图
- tekla钢结构算量_Tekla有用吗?Tekla软件在钢结构项目中有什么作用?
- 利用自己的祖源成分结果画祖源成分饼图
- Unity--初识Live2D Cubism以及通过代码来实现Live2D模型的基本功能(二)
- 主板24pin接口详图_老电源也兼容 简单DIY 24Pin转接线
- JP1081B/9700_USB网卡驱动
- 微信与企业微信的十个区别
- javascript解决猴子分桃问题
- 织梦后台发布文章编辑器不显示的解决办法
- gpu运行pycharm
- 小数形式与科学计数法转换(简)
- 我有一个梦,袁隆平!
热门文章
- 【Java】从Java代码到网络编程,三次握手又该如何理解
- 手动部署SQL审计平台Archery(连接mysql8.x)
- 由“最惨创业者”事件引起的“风险法则”与“生存法则”共生思考
- 单页面自动赚钱无敌策略
- java识别整段地址
- 按图搜索义乌购商品(拍立淘) API
- java安全管理器SecurityManager入门
- 企业微信和个人微信在朋友圈上有何区别?
- NOIP2014提高组A.石头剪刀布
- C++协程(二):Understanding operator co_await