为什么要将stm8 中断优先级类分成优先级?如何分级?

用心创造滤镜
扫码下载App
汇聚2000万达人的兴趣社区下载即送20张免费照片冲印
扫码下载App
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(2336)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_081067',
blogTitle:'linux中断优先级',
blogAbstract:'Interrupt in Linux(硬件篇)—— APIC2 收藏\r\n 18:35\r\n\r\n\r\n\r\n\r\n\r\n\r\nInterrupt in Linux(硬件篇)—— APIC2 收藏 \r\n1.2.2 LAPIC\r\n收到来自IOAPIC的中断消息后,LAPIC会将该中断交由CPU处理。和IOAPIC比较,LAPIC具有更多的寄存器以及更复杂的机制。但对于处理来自IOAPIC的中断消息,最重要的寄存器还是IRR、ISR以及EOI。',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:0,
publishTime:8,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}计算机系统结构 第三章自考练习题答案_图文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
计算机系统结构 第三章自考练习题答案
||暂无简介
总评分3.7|
浏览量2286
阅读已结束,如果下载本文需要使用
想免费下载本文?
下载文档到电脑,查找使用更方便
还剩2页未读,继续阅读
你可能喜欢 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
中断优先级
下载积分:50
内容提示:中断优先级
文档格式:PDF|
浏览次数:170|
上传日期: 14:05:47|
文档星级:
该用户还上传了这些文档
中断优先级
官方公共微信STM32学习笔记:外部中断的使用_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
STM32学习笔记:外部中断的使用
上传于||暂无简介
阅读已结束,如果下载本文需要使用
想免费下载本文?
下载文档到电脑,查找使用更方便
还剩5页未读,继续阅读
你可能喜欢STM32中断优先级(默认和不默认情况)
可能对于刚接触抢占式优先级和响应优先级的人来说学习STM32的中断优先级有点障碍,这里先介绍下优先级:
具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。
当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。
STM32 可以支持的 68 个外部中断通道,已经固定的分配给相应的外部设备。每个中断
通道都具备自己的中断优先级控制字节 PRI_n(8 位,但在 STM32 中只使用 4 位,高 4 位有
效),每 4 个通道的 8 位中断优先级控制字(PRI_n)构成一个 32 位的优先级寄存器(Priority
Register)。68 个通道的优先级控制字至少构成 17 个 32 位的优先级寄存器,它们是 NVIC
寄存器中的一个重要部分。
5.对于这 4bit 的中断优先级控制位还必须分成 2 组看:从高位开始,前面是定义抢先式优
先级的位,后面用于定义子优先级。4bit 的分组组合可以有以下几种形式:
第0组:所有4位用于指定响应优先级
第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级
第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级
第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级
第4组:所有4位用于指定抢占式优先级
由于我们使用STM32的库函数,所以这里介绍如何使用库函数设置需要的优先级
可以通过调用STM32的固件库中的函数NVIC_PriorityGroupConfig()选择使用哪种优先级分组方式
这个函数在帮助文件的标准外设驱动的CMSIS\CMSIS_Expord_Function下;
这个函数的参 数有下列5种:
NVIC_PriorityGroup_0 =& 选择第0组
NVIC_PriorityGroup_1 =& 选择第1组
NVIC_PriorityGroup_2 =& 选择第2组
NVIC_PriorityGroup_3 =& 选择第3组
NVIC_PriorityGroup_4 =& 选择第4组
这里要注意的是
,在系统复位初始化之后,默认使用的是第0组优先级分组
接下来就是指定中断源的优先级,下面以一个简单的例子说明如何指定中断源的抢占式优先级和响应优先级:
如果应用程序储存在ROM中,并且不需要改变异常服务程序,则我们可以把整个向量表
编码到ROM的起始区域(从0
地址开始的那段)。在这种情况下,向量表的偏移量将一直为
0, 并且中断向量一直在ROM中,因此上例可以大大简化,只需3
1. 建立优先级组
2. 为该中断指定优先级
3. 使能该中断
// 选择使用优先级分组第1组
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
// 使能EXTI0中断 初始化采用和GPIO一样的结构体形参
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQC
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_IRQC//这里指的是外部中断9-5线
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //
指定抢占式优先级别0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //
指定响应优先级别1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
要注意的几点是:
1)如果指定的抢占式优先级别或响应优先级别超出了选定的优先级分组所限定的范围,将可能得到意想不到的结果;
这里的范围是指第4组抢占式优先级0~15, 第二组抢占式优先级范围0~3,响应优先级0~3;剩下几组同理
2)抢占式优先级别相同的中断源之间没有嵌套关系;
3)如果某个中断源被指定为某个抢占式优先级别,又没有其它中断源处于同一个抢占式优先级别,则可以为这个中断源指定任意有效的响应优先级别。也就是说抢占式优先级高的一定可以中断中断优先级低的
二,开关总中断:
在STM32/Cortex-M3中是通过改变CPU的当前优先级来允许或禁止中断。
PRIMASK位:只允许NMI和hard fault异常,其他中断/异常都被屏蔽(当前CPU优先级=0)。
FAULTMASK位:只允许NMI,其他所有中断/异常都被屏蔽(当前CPU优先级=-1)。
在STM32固件库中(stm32f10x_nvic.c和stm32f10x_nvic.h)
定义了四个函数操作PRIMASK位和FAULTMASK位,改变CPU的当前优先级,从而达到控制所有中断的目的。
新库中下面两个函数等效于关闭总中断:
void__disable_irq (void);
void __disable_fault_irq (void);
下面两个函数等效于开放总中断:
void __enable_irq (void);
void __enable_fault_irq (void);
上面两组函数要成对使用,不能交叉使用。
第一种方法:
PRIMASK 用于除能在NMI 和硬fault
之外的所有异常,它有效地把当前优先级改为0(可编程优先级中的最高优先级)。
void__disable_irq (void);//关闭总中断
void __enable_irq (void);//开放总中断
__set_PRIMASK(1);
__set_PRIMASK(0);&
第二种方法:
FAULTMASK 更绝,它把当前优先级改为‐ 1 。这么一来,连硬fault 都被掩蔽了。使用方案与PRIMASK
的相似。但要注意的是,FAULTMASK 会在异常退出时自动清零。
void __disable_fault_irq (void); //关闭总中断
void __enable_fault_irq (void);//开放总中断
__set_FAULTMASK(1);
__set_FAULTMASK(0);&
void__disable_irq (void);//关闭总中断
void __enable_irq (void);//开放总中断
上面说的可能大家看完之后第一感觉就是一头雾水,可能有点绕,下面我就结合自己的经验直白的谈谈STM32的中断优先级的、
含义和结合库函数的使用方法
库函数中提到的PreemptionPriority含义是抢占式优先级,subPriority含义是响应优先级,也叫亚优先级。何为抢占式优先级?
顾名思义,是指在抢占式优先级不同时,抢占式优先级高的可以中断抢占式优先级低的,也就是所谓的嵌套!相同的抢占式优先级之间是不可以中断嵌套的。打个比方,如果系统采用的是第4组优先级分组方式,就意味着所有的4位都被用来指定抢占式优先级,也就是说,这样一来抢占式优先级就有16个等级,通过你对需要的中断源进行中断优先级赋值,就可以实现你所希望的高优先级中断函数在低优先级中断函数未执行完之前就开始执行,即中断嵌套,该分组方式最多可以完成1个中断和15级嵌套。
通过上面我们知道抢占式优先级高的可以中断优先级低的,但是响应优先级跟抢占式优先级有什么联系呢?这里我就
打个可能不太形象的比喻,帮助大家理解一下,如果说抢占式优先级是某个等级的政府机关的话,那响应优先级就是这个政府机关里面的部门,政府机关权力有高低之分,同样每个部门之间也有权力大小之分。
下面的话语言我组织不好可能有点绕,但是大家一定要仔细看:
不同的政府机关(抢占式优先级)之间可以相互中断,但是同一个政府机关里面的不同部门(即抢占式中断优先级相同,响应优先级不同)之间不能相互中断,因为内部不能相互打架,即使响应优先级高的来了,如果此时有响应优先级低的中断服务程序正在执行,他一定要等到对方执行完之后才可以执行,但是要注意一点,虽然他不可以打断比他响应优先级低的中断服务函数,但是他有“插队”的特权,即当有多个相同抢占式优先级同时到来的时候,响应优先级高的虽然中断来的比较迟,但是他有优先执行的特权!问题又来了,如果抢占式优先级和响应优先级都相同的中断同时中断或是排队时孰先孰后呢,这就要看他们在中断向量表中的位置了,也就是说中断入口地址低的优先。
下面的问题大家就很容易理解了,不同的响应优先级不影响抢占式优先级,打个比喻就是权力高的政府机关中最烂部门说话都比权力低的政府机关中最好的部门说话好使。即权力高,可以抢断,嵌套
刚刚发现有些人把STM32的中断通道数和外部单片机引脚数混为一谈,中断通道数跟单片机引脚个数没有任何关系,目前M3内核无论多少引脚的单片机中断通道数都是84个,而无论引脚有多少个,这些引脚只占用6个通道,即0~4线分别占用一个通道,5~9线10~15线占用两个中断通道,一个中断通道可能对应很多外设
以上内容是在网上找的~
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。}

我要回帖

更多关于 分级基金优先级 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信