OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子全套STM32开发资料,上千讲STM32视频教程,RT1052教程免费下载啦...

查看: 555|回复: 8

systick中断优先级为15,是否会导致延时不准确?

[复制链接]

  离线 

7

主题

16

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2018-1-20
在线时间
6 小时
发表于 2018-4-21 14:47:49 | 显示全部楼层 |阅读模式
1金钱
视频教程中10.2节讲到,systick的中断优先级应设为最低值15,那么任何中断都可以将其打断。而延时函数vTaskDelay、delay_ms都通过systick来延时的。
如果打断systick的那个中断执行时间较长,是不是就导致延时不准了?
另外请教下,视频中设置的节拍是1ms,如果想让实时性更高,是不是把宏configTICK_RATE_HZ改大就可以了?似乎还要改其他地方?
谢谢!

最佳答案

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

是的,所以中断应该越短越好,另外,不建议把configTICK_RATE_HZ调太大,没特殊要求,1ms最大了,最好5ms, 否则任务切换会占用很多CPU。
回复

使用道具 举报

  离线 

505

主题

9万

帖子

31

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
131579
金钱
131579
注册时间
2010-12-1
在线时间
1209 小时
发表于 2018-4-21 14:47:50 | 显示全部楼层
是的,所以中断应该越短越好,另外,不建议把configTICK_RATE_HZ调太大,没特殊要求,1ms最大了,最好5ms, 否则任务切换会占用很多CPU。
回复

使用道具 举报

  离线 

21

主题

176

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
289
金钱
289
注册时间
2017-11-29
在线时间
104 小时
发表于 2018-4-21 19:04:18 来自手机 | 显示全部楼层
我觉得是的,比如串口的中断抢占优先级设成6(优先级分组是4),那么串口中断服务函数里的处理就要干净利索,所谓快进快出,否则耽误systick的延时处理。 但是应用任务无论优先级多少,都不会对Systick的处理造成影响。
回复

使用道具 举报

  离线 

7

主题

16

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2018-1-20
在线时间
6 小时
 楼主| 发表于 2018-4-22 12:20:27 | 显示全部楼层
正点原子 发表于 2018-4-21 14:47
是的,所以中断应该越短越好,另外,不建议把configTICK_RATE_HZ调太大,没特殊要求,1ms最大了,最好5ms, ...

明白了。谢谢老大
回复

使用道具 举报

  离线 

7

主题

16

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2018-1-20
在线时间
6 小时
 楼主| 发表于 2018-4-22 12:20:56 | 显示全部楼层
正点原子公众号
wen619 发表于 2018-4-21 19:04
我觉得是的,比如串口的中断抢占优先级设成6(优先级分组是4),那么串口中断服务函数里的处理就要干净利索 ...

有道理。3q
回复

使用道具 举报

  离线 

15

主题

151

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
427
金钱
427
注册时间
2014-4-29
在线时间
198 小时
发表于 2018-4-24 16:22:27 | 显示全部楼层
vTaskDelayUntil()函数可以了解一下,经过一段绝对时间后唤醒任务
比相对时间延时vTaskDelay()要准一点
回复

使用道具 举报

  离线 

14

主题

57

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2014-7-17
在线时间
16 小时
发表于 2018-6-3 09:24:24 | 显示全部楼层
但是用Cube进行初始化的话,systick的优先级默认就是最高级啊(除非绕过Cube直接在文件中修改)。
回复

使用道具 举报

  离线 

8

主题

444

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1228
金钱
1228
注册时间
2015-8-25
在线时间
202 小时
发表于 2018-6-3 11:02:19 | 显示全部楼层
xianshasaman 发表于 2018-4-24 16:22
vTaskDelayUntil()函数可以了解一下,经过一段绝对时间后唤醒任务
比相对时间延时vTaskDelay()要准一 ...

vTaskDelayUntil()函数也只是相对的比时vTaskDelay()准一点,vTaskDelayUntil()只能保证按照一定的周期取消阻塞进入就绪态,如果有更高优先级任务或中断,则还是要等待其他的高优先级任务或中断运行结束才能轮到调用vTaskDelayUntil()延时的任务,所以说vTaskDelayUntil()也不一定就能周期性的运行,只是相对vTaskDelay()好一点
回复

使用道具 举报

  离线 

2

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2018-1-15
在线时间
12 小时
发表于 2018-7-12 12:50:46 | 显示全部楼层
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);   这条语句是将SYSTICK的抢占优先级设置多少,响应优先级多少呢?
回复

使用道具 举报

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

本版积分规则




关闭

必看:"原子哥”力荐上一条 /1 下一条

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

GMT+8, 2018-8-19 19:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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