SysTick的降低进程优先级的时机是高还是低

还没有帐号? 赶紧
用户版块帖子
RTX中PendSV,SVC和Systick三个中断的优先级设置
在线时间22255小时
铜币20468威望3032贡献值0银元0
假设设置的NVIC优先级分组是4,也就是0-15抢占优先级,没有子优先级:================================================1200) window.open('/attachment/Fid_29/29_58_c69.jpg?92');" style="max-width:1200" onload="if(is_ie6&&this.offsetWidth>1200)this.width=1200;" >=1200) window.open('/attachment/Fid_29/29_58_537c6a730a5db56.jpg?258');" style="max-width:1200" onload="if(is_ie6&&this.offsetWidth>1200)this.width=1200;" >
脚踏实地,不浮躁,努力做的更好,专注,追求卓越  Fighting!!!
在线时间171小时
铜币214威望13贡献值0银元0
是的&&svc必须比pendsv和systick高一级
访问内容超出本站范围,不能确定是否安全
限100 字节
如果您在写长篇帖子又不马上发表,建议存为草稿
您目前还是游客,请
&回复后跳转到最后一页
Powered by & Copyright Time now is:10-25 10:20 &
版权所有 Gzip enabled
Total 0.089086(s) query 5,STM32设置SysTick中断抢占优先级_中华文本库
第2页/共3页
uint32_t reg_
uint32_t PriorityGroupTmp = (PriorityGroup & 0x07);
/* only values 0..7 are used
SCB-&AIRCR;
/* read old register configuration
reg_value &= ~(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk);
/* clear bits to change
(reg_value
(0x5FA && SCB_AIRCR_VECTKEY_Pos) |
(PriorityGroupTmp && 8));
/* Insert write key and priorty group */
SCB-&AIRCR =
参数范围为0~7,具体如下
随后配置各个中断的优先级,对于外设的中断可以使用固件库的程序,比较直观。
如最前面所给出的例子,但是根据其实现,是不能够用来配置内核中断的,例如
NVIC_InitStructure.NVIC_IRQChannel = SysTick_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
这是错误的,因为内部使用IRQn 寻址,而SysTick_IRQn为-1.
所以对于Sysick 使用core_cm3.h的函数
NVIC_SetPriority(SysTick_IRQn, 4);这时不能显式的看出抢先式优先级与子
优先级,写入的优先级需要根据优先级组的配置来选择。
第2页/共3页
寻找更多 ""16050人阅读
STM32(16)
最近使用STM32时希望将systick的中断优先级降低,但是CMSIS里给出的例子都是类似
& & NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);还是没有配置systick。
后来阅读CM3的技术参考手册,讲解了NVIC的配置。
中断分为内核中断和芯片的中断,配置的寄存器位置不同。芯片的中断配置在NVIC的IP内,内核的中断配置在SCB内。
可以直接调用core_cm3.h里的函数
static __INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
if(IRQn & 0) {
SCB-&SHP[((uint32_t)(IRQn) & 0xF)-4] = ((priority && (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for Cortex-M3 System Interrupts */
NVIC-&IP[(uint32_t)(IRQn)] = ((priority && (8 - __NVIC_PRIO_BITS)) & 0xff);
/* set Priority for device specific Interrupts
}这个函数实现了两类中断优先级的配置。
但是直观上来看看不到抢先式优先级与子优先级。
首先,配置优先级组,可以使用固件库的程序,也可以用core_cm3.h的函数。
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
/* Set the PRIGROUP[10:8] bits according to NVIC_PriorityGroup value */
SCB-&AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityG
static __INLINE void NVIC_SetPriorityGrouping(uint32_t PriorityGroup)
uint32_t reg_
uint32_t PriorityGroupTmp = (PriorityGroup & 0x07);
/* only values 0..7 are used
SCB-&AIRCR;
/* read old register configuration
reg_value &= ~(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk);
/* clear bits to change
(reg_value
(0x5FA && SCB_AIRCR_VECTKEY_Pos) |
(PriorityGroupTmp && 8));
/* Insert write key and priorty group */
SCB-&AIRCR =
}参数范围为0~7,具体如下
随后配置各个中断的优先级,对于外设的中断可以使用固件库的程序,比较直观。如最前面所给出的例子,但是根据其实现,是不能够用来配置内核中断的,例如
NVIC_InitStructure.NVIC_IRQChannel = SysTick_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);这是错误的,因为内部使用IRQn寻址,而SysTick_IRQn为-1.
所以对于Sysick使用core_cm3.h的函数
NVIC_SetPriority(SysTick_IRQn, 4);这时不能显式的看出抢先式优先级与子优先级,写入的优先级需要根据优先级组的配置来选择。
NVIC_SetPriority(SysTick_IRQn, n);
n=0x00~0x03 设置Systick为抢占优先级0
n=0x04~0x07 设置Systick为抢占优先级1
n=0x08~0x0B 设置Systick为抢占优先级2
n=0x0C~0x0F 设置Systick为抢占优先级3
NVIC_SetPriority函数指定中断优先级的寄存器位(STM32只用4位来表示优先级)的数据,例如中断优先级组设置为了2,即高2位用于指定抢占式优先级,低2位用于指定响应优先级,0x00~0x03高2位为0,所以抢占优先级为0;0x04~0x07高2位为1,所以抢占优先级为1,以此类推。&
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:348980次
积分:3423
积分:3423
排名:第10354名
原创:15篇
转载:75篇
评论:28条
(1)(1)(1)(7)(2)(1)(1)(1)(1)(1)(2)(6)(1)(2)(2)(1)(2)(6)(8)(2)(6)(3)(11)(4)(4)(13)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'查看: 3049|回复: 252
systick的优先级到底比外设的优先级高还是低,目前只有2人答对。高手在哪里
提示:systick是内核的外设,其他外设比如串口,adc等是内核之外的外设。
游客,如果您要查看本帖隐藏内容请
额~为了装逼特地看了下资料。Systick在Cortex-M3权威指南里面表明是属于系统异常,优先级为15,看上去明显比外设的优先级高啊。但又写着可编程!不多说先上图。从这段文字来看的话,我觉得Systick的优先级不一定比外设的优先级高,这个具体得看怎么配置,额,除了那三个固定的不能配置以外。
6AT7_M~Q([8N7C3Y86IQ6J6.png (84.5 KB, 下载次数: 1)
15:03 上传
有资料在手,估计查了资料后我变成了20%的人了
我不知道我不知道
第一个????
我不知道我不知道
刀神怎么会不知道,别装逼。
又来偷偷着学习。。。。
我猜是比外设的优先级高,看答案
我觉得应该是高吧
SYStick优先级比外设低,当用作设置延时是要提高优先级。应该没错吧?
谢火锅普及
低& && && && && && && && && && && &
看一下看一下
& && && &&&不清楚啊啊啊啊
低,好像是倒数的
不知道,来学习
低.............
kankan& && && && && && && && && &
听说SysTick 就像是心跳,心跳的优先级应该高些的。。。走,看答案去。。
优先级高啊,不会错的
我猜高吧= = = =
我猜,应该最高.
优先级高啊,不会错的
你就是我说的 80 % 的那部分 人
这个得搞明白~~~~~~~~~~~~我的答案是我不知道
还真不知道
呵呵呵合伙
应该是高吧
啊,低啊,那用SysTick中断做定时器岂不是很不准,难道要用Timer?
额~为了装逼特地看了下资料。Systick在Cortex-M3权威指南里面表明是属于系统异常,优先级为15,看上去明显 ...
1、这里面说的是正确,但是还是没有告诉我们,他的中断优先级要怎么编程。
2、如果我一个外设中断的优先级分组为 2 ,抢占为0 ,子为1,你要配置 systick的优先级比我高或者低,你要怎么配置。
3、systick 配置优先级使用的是 scb 这个外设, 片上外设配置中断是使用 nvic的
默认是systic低,可以设置的比外部中断高。
火哥红外解码实验里,好像讲过这个。具体没细看。
默认是systic低,可以设置的比外部中断高。
火哥红外解码实验里,好像讲过这个。具体没细看。
对,总算有一个回答对的了。我两年前有在视频里面讲过。
低,输了剁手!!
折问题对我来说有点难,我水平差
看看答案,这个想不到
我是来看答案的& && && && && && && && && && && &&&
我猜你也不知道,我看到两个论坛的版主都回答错了,所以很有必要发个帖子来普及下。
我只记得不是最高,不是最低,而是中低水平.
具体就不知道
我只记得不是最高,不是最低,而是中低水平.
具体就不知道
默认的固件库里面的配置是15,即1111(0b),无论你NVIC的中断优先级怎么分组,1111 都是 最低的,如果在一个有中断的应用程序中想用systick做延时,必须把systick的中断优先级改高才行。
1、这里面说的是正确,但是还是没有告诉我们,他的中断优先级要怎么编程。
2、如果我一个外设中断的优先 ...
刚忙完工作,为了把这个逼装完,立马写代码测试了一下。
1.我从火哥的代码中找到配置Systick中断优先级的函数:NVIC_SetPriority (SysTick_IRQn, (1&&__NVIC_PRIO_BITS) - 1);&&实体在core_cm3.h中:
1.png (12.16 KB, 下载次数: 1)
17:26 上传
这里可以看出来内核中断是在SCB中配置的。所以我想配置Systick的中断优先级必然用到NVIC_SetPriority这个函数。
2.那要该怎么配置呢--&如果我一个外设中断的优先级分组为 2 ,抢占为0 ,子为1,你要配置 systick的优先级比我高或者低
&&我写了代码验证了一下,当外部中断优先据分组为 2 ,抢占为0 ,子为1时,那Systick的中断优先级要高的话,那只要2 0 0就好。
&&从第一点说了呀,内核异常在SCB中管理,那分组2已经配置好了,NVIC_SetPriority 这个函数是可以配置抢占级和效应优先级的。
&&所以我就写代码测试了一下,NVIC_SetPriority (SysTick_IRQn, 0); 这样子就可以把Systick的中断优先级配置为2 0 0。
2.png (16.84 KB, 下载次数: 0)
17:32 上传
3.png (13.12 KB, 下载次数: 0)
17:33 上传
实验证明,是先在Systick中断中点亮LED再从外部中断点亮。
然后我把Systick配置成为了2 0 1 即NVIC_SetPriority (SysTick_IRQn, 1),在相同的优先级情况,发现Systick的优先级更高,这条是不是在相同优先及配置的情况下内核异常的优先级比外设高还有待深入验证。
之前没有对这方面了解过,这是我实验结果,算是学习到了一点东西了,不过对NVIC了解得还是不够透彻,只能大概说这么多。
火哥,回个贴看看我理解得对不对啊~我这样子做实验的时候可以配置比外设低或高,在分组确定的情况下。
这个中断优先级是可以设置的,当优先级相同时,内核级中断要优先于外部可屏蔽中断执行,但设置外部可屏蔽中断优先级大于内核级中断时,它是可抢占内核中断的。另外做延时时,若要获得非常精确的延时,可以把Systick的优先级设到最高。
知道是systick是可编程的,当然意味着比外设的级别可高可低了!但是到底如何让其比外设低或者高,就不清楚了
这个中断优先级是可以设置的,当优先级相同时,内核级中断要优先于外部可屏蔽中断执行,但设置外部可屏蔽中 ...
内核外设的优先级比芯片外设的优先级高吧
看来有套路在里面
内核外设的优先级比芯片外设的优先级高吧
错了& && && && && && && && && && && && && &
minDragon 发表于
刚忙完工作,为了把这个逼装完,立马写代码测试了一下。
1.我从火哥的代码中找到配置Systick中断优先级 ...
你理解的是对的,完全正确。在软件优先级相等的情况下,内核的中断优先级都高于外射的。
minDragon 发表于
火哥,回个贴看看我理解得对不对啊~我这样子做实验的时候可以配置比外设低或高,在分组确定的情况下。
对,我在隐藏的帖子第三点里面说了,分析了。
秉火电子论坛,原“野火电子论坛”

我要回帖

更多关于 低优先级队列最高惩罚 的文章

 

随机推荐