OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子全套STM32开发资料,上千讲STM32视频教程,RT1052教程免费下载啦...
查看: 569|回复: 15

systick的抢占优先级和响应优先级

[复制链接]

  离线 

2

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2018-1-15
在线时间
13 小时
发表于 2018-7-12 12:57:16 | 显示全部楼层 |阅读模式
1金钱
各位,最近看了systick,看起来很简单的一个定时器。但是在设置中断优先级的时候,有点儿迷糊了。systick中断属于内核异常中断,那他的中断优先级是怎么设置的呢?是否有抢占优先级和响应优先级的说法,NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);   这个函数里面将SCB->SHP【11】=15。怎么理解他的中断时抢占还是响应?拜托了,看了那个内核手册也没太明白。万分感谢。

最佳答案

查看完整内容[请看2#楼]

今天看了一下内核权威参考这本书, 进一步加深了对优先级的理解。 CM3是用8位来配置优先级的, 而AIRCR的3位是用来定义在这8位中优先组分组的起始位的, 000表示从BIT0处进行分组,即BIT0代表子优先级,BIT1-7代表抢占优先级 001表示从BIT1处进行分组,即BIT0、1代表子优先级,BIT2-7代表抢占优先级 010表示从BIT2处进行分组,即3位子优先级,5位抢占优先级 011表示从BIT3处进行分组,即4位子优先级,4位抢占优先级 100 ...
回复

使用道具 举报

  离线 

24

主题

1282

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
2211
金钱
2211
注册时间
2018-5-11
在线时间
409 小时
发表于 2018-7-12 12:57:17 | 显示全部楼层
hougeqvjing 发表于 2018-7-13 15:39
这样说是有些道理的,也就变成了设置成这个分组有两种配置哦?

今天看了一下内核权威参考这本书,
进一步加深了对优先级的理解。
CM3是用8位来配置优先级的,
而AIRCR的3位是用来定义在这8位中优先组分组的起始位的,
000表示从BIT0处进行分组,即BIT0代表子优先级,BIT1-7代表抢占优先级
001表示从BIT1处进行分组,即BIT0、1代表子优先级,BIT2-7代表抢占优先级
010表示从BIT2处进行分组,即3位子优先级,5位抢占优先级
011表示从BIT3处进行分组,即4位子优先级,4位抢占优先级
100表示从BIT4处进行分组,即5位子优先级,3位抢占优先级
101表示从BIT5处进行分组,即6位子优先级,2位抢占优先级
110表示从BIT6处进行分组,即7位子优先级,1位抢占优先级
111表示从BIT7处进行分组,即8位子优先级,0位抢占优先级

为了最大限度地方便移植,
定义了具体芯片的裁减原则,
即可以从LSB(最低位BIT0)开始进行裁减
比如只实现4位,则只有BIT7-4有用,其它位无用
这个时候AIRCR的3位,如果是000,001,010,011效果是一样的,
都是BIT4-7为抢占级,
只有从100开始才会体现出区别,
小于等于011,子优先级位都是0,因这些位不存在,有也相当于没有
100:BIT4开始表示子优先级,即1位子优先级,3位抢占优先级
101:BIT5开始表示子优先级,即2位子优先级,2位抢占优先级
110:BIT6开始表示子优先级,即3位子优先级,1位抢占优先级
111:BIT5开始表示子优先级,即4位子优先级,0位抢占优先级
所以AIRCR这3位的复位值000在4BIT优先级的机器上的实际运行结果与设置为011完全等效。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

  离线 

2

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2018-1-15
在线时间
13 小时
 楼主| 发表于 2018-7-12 13:53:56 | 显示全部楼层
优先级的分组应该是按照SCB_AIRCR中的PRIGROUP来的。也就是说可配置的系统异常中断和其他外设中断共用一个分组。在配置systick时,因为没有设置分组,所以为默认分组状态,然后根据写入到systick的优先级按位分配为抢占优先级和响应优先级。
回复

使用道具 举报

  离线 

2

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2018-1-15
在线时间
13 小时
 楼主| 发表于 2018-7-12 14:27:37 | 显示全部楼层
PRIGROUP的默认值为000,这个是什么分组呢?如果只是设置了systick的优先级,没有设置分组,那么又怎么区分抢占响应优先级呢?
回复

使用道具 举报

  离线 

61

主题

932

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3190
金钱
3190
注册时间
2015-4-26
在线时间
651 小时
发表于 2018-7-12 14:34:30 | 显示全部楼层
按位分,如果你设置为group2,那0xf 高2位是3,低2为是3,就是说抢占是3,响应是3
我有故事,你有酒吗
回复

使用道具 举报

  离线 

2

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2018-1-15
在线时间
13 小时
 楼主| 发表于 2018-7-12 17:57:22 | 显示全部楼层
来俩不甜的 发表于 2018-7-12 14:34
按位分,如果你设置为group2,那0xf 高2位是3,低2为是3,就是说抢占是3,响应是3

group不设置,采用默认值的000,是哪个组呢?
回复

使用道具 举报

  离线 

24

主题

1282

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
2211
金钱
2211
注册时间
2018-5-11
在线时间
409 小时
发表于 2018-7-12 20:16:29 | 显示全部楼层
hougeqvjing 发表于 2018-7-12 17:57
group不设置,采用默认值的000,是哪个组呢?

0组就是0位抢先,4位响应,
而此时SYSTICK的优先级是响应优先级为15,是最低的。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

  离线 

2

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2018-1-15
在线时间
13 小时
 楼主| 发表于 2018-7-13 11:15:13 | 显示全部楼层
warship 发表于 2018-7-12 20:16
0组就是0位抢先,4位响应,
而此时SYSTICK的优先级是响应优先级为15,是最低的。

那个寄存器的默认值,是000,就是0组么?我看那个内核手册对于那个guropp的配置,只有,7,6,5,4这几种配置。
回复

使用道具 举报

  离线 

24

主题

1282

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
2211
金钱
2211
注册时间
2018-5-11
在线时间
409 小时
发表于 2018-7-13 11:35:03 | 显示全部楼层
本帖最后由 warship 于 2018-7-13 11:38 编辑
hougeqvjing 发表于 2018-7-13 11:15
那个寄存器的默认值,是000,就是0组么?我看那个内核手册对于那个guropp的配置,只有,7,6,5,4这几种配 ...

SCB->AIRCR中第8:10位决定分组
共有5种设置结果:7、6、5、4、3
分别对应分组:      0、1、2、3、4
系统复位后为0组, 即复位值为111

我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

  离线 

2

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2018-1-15
在线时间
13 小时
 楼主| 发表于 2018-7-13 12:46:07 | 显示全部楼层
warship 发表于 2018-7-13 11:35
SCB->AIRCR中第8:10位决定分组
共有5种设置结果:7、6、5、4、3
分别对应分组:      0、1、2、3、4

你好,我看了下这个内核的手册,它的复位值是000呢,那个111是在哪儿看到的呀?谢谢了,这个问题困扰我很久了。
2018-07-13 12 44 09.png
回复

使用道具 举报

  离线 

24

主题

1282

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
2211
金钱
2211
注册时间
2018-5-11
在线时间
409 小时
发表于 2018-7-13 13:12:28 | 显示全部楼层
hougeqvjing 发表于 2018-7-13 12:46
你好,我看了下这个内核的手册,它的复位值是000呢,那个111是在哪儿看到的呀?谢谢了,这个问题困扰我很 ...

不好意思,
我刚才实测了一下,

复位后AIRCR的值是:FA050000
复位值还真的是000
这个把我也搞迷糊了,
你看看这个吧:
https://blog.csdn.net/changyourmind/article/details/56858954
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

  离线 

2

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2018-1-15
在线时间
13 小时
 楼主| 发表于 2018-7-13 13:21:50 | 显示全部楼层
warship 发表于 2018-7-13 13:12
不好意思,
我刚才实测了一下,

这个链接,里面也没提到这个题。看来只有在系统初始化的时候就把这个组定义好,这个算不算是这个芯片考虑漏掉的地方呢?
回复

使用道具 举报

  离线 

24

主题

1282

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
2211
金钱
2211
注册时间
2018-5-11
在线时间
409 小时
发表于 2018-7-13 13:47:30 | 显示全部楼层
hougeqvjing 发表于 2018-7-13 13:21
这个链接,里面也没提到这个题。看来只有在系统初始化的时候就把这个组定义好,这个算不算是这个芯片考虑 ...

应该不会,
简单推测理解,
复位值为000是针对最大8位优先级的,即分组0(7位抢占,1位子优先级),
具体的芯片可以裁减(裁减抢占优级数),对于只有4位优先级的F10X,
则映射成3位抢占,1位子优先级?
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

  离线 

2

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2018-1-15
在线时间
13 小时
 楼主| 发表于 2018-7-13 15:39:22 | 显示全部楼层
warship 发表于 2018-7-13 13:47
应该不会,
简单推测理解,
复位值为000是针对最大8位优先级的,即分组0(7位抢占,1位子优先级),

这样说是有些道理的,也就变成了设置成这个分组有两种配置哦?
回复

使用道具 举报

  离线 

2

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2018-1-15
在线时间
13 小时
 楼主| 发表于 2018-7-21 17:53:16 | 显示全部楼层
warship 发表于 2018-7-18 19:27
今天看了一下内核权威参考这本书,
进一步加深了对优先级的理解。
CM3是用8位来配置优先级的,

谢谢你的的专业回答,非常的感谢!!!可否授之以渔,让我也去学习下。。。
一直困扰我的问题终于了合理的答案。。。感谢感谢!!!
回复

使用道具 举报

  离线 

24

主题

1282

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
2211
金钱
2211
注册时间
2018-5-11
在线时间
409 小时
发表于 2018-7-21 19:11:28 | 显示全部楼层
本帖最后由 warship 于 2018-7-21 19:13 编辑
hougeqvjing 发表于 2018-7-21 17:53
谢谢你的的专业回答,非常的感谢!!!可否授之以渔,让我也去学习下。。。。
一直困扰我的问 ...

这本书您应该看过呀,前面您好像好提到过的。Cortex-M3权威指南中文版
http://www.openedv.com/forum.php ... 8%CD%FE%D6%B8%C4%CF
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则




关闭

正点原子双11大促销上一条 /1 下一条

正点原子公众号

QQ|联系我们|手机版|官方淘宝店|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2018-11-15 11:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表
/* */