OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子新作:阿波罗STM32F767&F429&探索者STM32F4开发板&赶快来下载资料哦。

查看: 958|回复: 10

FreeRTOS学习之两个延时函数的问题,急急急

[复制链接]

  离线 

7

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2015-11-26
在线时间
27 小时
发表于 2017-12-13 10:54:24 | 显示全部楼层 |阅读模式
4金钱
最近在学习,FreeRTOS,看到延时这里的时候总有些想不通,所以来此提问希望大家指教。
一、vTaskDelete()是相对延时,是相对与xTickCount(Systick的中断计数)来延时的,所以要依靠systick中断计数准确才能延时准确,那么问题来了,如果在一个任务中调用了vTaskDelete(),systick的计数周期是1ms,当任务正在发生时,有一个高优先级的中断发生,高优先级的中断处理需要5ms(夸张一点),那么此时延时还会准确么?在任务的切换和调度中也有许多进入临界和关中断的地方,这些地方的执行会不会影响延时呢??

二、vTaskDelayUntil()是绝对式延时,是相对与*pxPreviousWakeTime的延时,而且是每次执行完vTaskDelayUntil()自动更新,所以就可以做到固定频率执行了,但是还是向上面说的那样,如果在一个任务中调用了vTaskDelete(),systick的计数周期是1ms,当任务正在发生时,有一个高优先级的中断发生,高优先级的中断处理需要5ms(夸张一点),那么此时延时还会准确么?在任务的切换和调度中也有许多进入临界和关中断的地方,这些地方的执行会不会影响延时呢??虽然在下面的图片上说会压缩其他任务的时间,这是压缩的时间是如何同步的呢?


以上图片的连接来源:http://blog.csdn.net/cheatscat/article/details/78113726
这里有不是很明白希望大家答疑解惑,小弟谢谢了

最佳答案

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

你自己发的链接,最后一段话,总结!!!!!!
回复

使用道具 举报

  离线 

1

主题

41

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
355
金钱
355
注册时间
2017-12-11
在线时间
93 小时
发表于 2017-12-15 16:52:57 | 显示全部楼层
以下我个人看法,如果有错误,还请多多指教!

首先,你的假设似乎就有问题。
如果有高优先级中断,也不应该在其ISR中处理5ms时间,否则,就是你程序设计的问题。ISR中只应该做类似简短的赋值,清标志等动作。

其次,rtos一般关中断,只是关闭basipri中断,这就意味着内核仍然可以进入systick中断,所以应该,不会对内核延时产生影响。
回复

使用道具 举报

  离线 

2

主题

99

帖子

0

精华

高级会员

Rank: 4

积分
605
金钱
605
注册时间
2017-5-17
在线时间
106 小时
发表于 2017-12-13 10:54:25 | 显示全部楼层
QQ图片20171215222443.png 你自己发的链接,最后一段话,总结!!!!!!
回复

使用道具 举报

  离线 

7

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2015-11-26
在线时间
27 小时
 楼主| 发表于 2017-12-13 10:55:03 | 显示全部楼层
原子哥求助攻
回复

使用道具 举报

  离线 

12

主题

229

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1063
金钱
1063
注册时间
2017-7-6
在线时间
157 小时
发表于 2017-12-13 22:13:21 | 显示全部楼层
正点原子公众号
同问,FreeRTOS里面滴答定时器是最低优先级,如果高优先级中断跑了超过2MS,那基本就时基就不正常了。有没有大神来答疑解惑的
回复

使用道具 举报

  离线 

0

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2017-12-7
在线时间
12 小时
发表于 2017-12-14 13:11:15 | 显示全部楼层
我也是刚学也发表下我的看法:
vTaskDelete()和vTaskDelayUntil()延迟函数只是将当前任务由运行态转为阻塞态,每过一个时间片内核就会运行在所有就绪态的任务中选取优先级最高的任务运行下一个时间片。
那么被上述延时函数转为阻塞态的任务就不停的等待延时是否到期,如果没到期就继续等待,如果到期就将被刚才被延时的任务由阻塞态转为就绪态。这里只是转为就绪态,使得其有权被内核从个个处于就绪态的任务选取运行,但还要比较优先级,优先级最高的将转为运行态。

延时是没问题的到时间了就会使被阻塞的任务转为运行态,但是并不一定会立即执行(许多进入临界段的也可能不会转为运行态)。

你举的5MS高优先级的例子应该还是会运行5MS的,不然高优先级还有啥意思?
回复

使用道具 举报

头像被屏蔽

  离线 

75

主题

84

帖子

0

精华

禁止发言

积分
277
金钱
277
注册时间
2017-11-8
在线时间
15 小时
发表于 2017-12-15 15:45:36 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

头像被屏蔽

  离线 

75

主题

84

帖子

0

精华

禁止发言

积分
277
金钱
277
注册时间
2017-11-8
在线时间
15 小时
发表于 2017-12-15 15:46:34 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

头像被屏蔽

  离线 

75

主题

84

帖子

0

精华

禁止发言

积分
277
金钱
277
注册时间
2017-11-8
在线时间
15 小时
发表于 2017-12-15 15:48:23 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

  离线 

12

主题

229

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1063
金钱
1063
注册时间
2017-7-6
在线时间
157 小时
发表于 2017-12-15 17:09:07 | 显示全部楼层
i123 发表于 2017-12-14 13:11
我也是刚学也发表下我的看法:
vTaskDelete()和vTaskDelayUntil()延迟函数只是将当前任务由运行态转为阻 ...

首先我看完xTaskIncrementTick()源码,并不是每个节拍到了高优先级就会抢占低优先级任务,只有是当高优先级任务延时到了或则在开启时间片轮转调度的情况下,当前优先级就绪任务列表的列表项>1(即到时间轮转调度了)。楼主问的中断优先级而不是任务优先级。ST支持16级中断,FreeRTOS支持32级任务优先级,两者并无关系
回复

使用道具 举报

  离线 

0

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2017-12-7
在线时间
12 小时
发表于 2017-12-15 20:57:53 | 显示全部楼层
1547674987 发表于 2017-12-15 17:09
首先我看完xTaskIncrementTick()源码,并不是每个节拍到了高优先级就会抢占低优先级任务,只有是当高优 ...

     看了你的回复,我也搜了下xTaskIncrementTick()这个函数看看,不过发现有人已有对关于延时函数延时函数的讲解了,那里分析:如果任务由于优先级比较低之类的问题, 在延时返回就绪状态后没有及时被运行,那么实际时间就开始飘。
(链接:http://www.jianshu.com/p/1b8203d953fd)说了会飘。
    感觉和我之前的回复差不多。
    关于中断优先级和任务优先级这两个之间没有任何关系,不管中断的优
先级是多少,中断的优先级永远高于任何任务的优先级,即任务在执行的过程中,中断来了就开始执行中断服务程序。
   
回复

使用道具 举报

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

本版积分规则




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

GMT+8, 2018-4-25 07:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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