OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5299|回复: 7

基于FreeRTos的绝对延时误差问题,如何提高精准度

[复制链接]

41

主题

276

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2354
金钱
2354
注册时间
2019-10-29
在线时间
380 小时
发表于 2020-7-18 11:27:12 | 显示全部楼层 |阅读模式
1金钱
freertos的绝对延时函数基值是基于freertos的心跳计数的,心跳计数是在滴答定时器中断中进行的,我用绝对延时函数延时5ms的时候,发现有时候误差有0.1ms,通过查看freertos的开发手册,说滴答定时器的中断优先级是最低的,如图1。所以我认为是滴答定时器中断优先级低,被其他中断打断,造成了时间出现误差。现在想将滴答定时器的优先级设置最高,我是在cubmx生成的代码基础上开发的,在main.c文件中设置了滴答定时器的优先级,如图2。刚开始设置的抢占优先级是3,采集的数据计算出误差,如图3。当我将这个抢占优先级设置为0的时候,采集的数据计算出误差,如图4。后面找到一个帖子,说在core_cm3.h中将滴答定时器的优先级设置为0,如图5。然后采集数据的计算出误差,如图6。
这几个地方的滴答定时器设置的优先级顺序是怎样的呢? 我的理解是core_cm3先设置优先级,然后是main.c中那个函数设置的优先级,然后滴答定时器就一直以mian.c中的滴答定时器优先级为准进行计数。那么在freertos的中断优先级是怎样一个顺序呢? freertos中又该如何设置滴答定时器的中断优先级呢?希望大佬指点!谢谢啦

图6

图6

图5

图5

图4

图4

图3

图3

图2

图2

图1

图1

最佳答案

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

楼主要明白,程序压入堆栈、出堆栈这些都需要时间的,调用函数就是出入栈的操作,加上OS任务调度有优先级的,不是你想要多少就是多少的,只要这个误差在允许范围之内即可 1、系统中断处理需要时间 2、任务调度器查找下一个运行任务需要时间 3、切换后,堆栈相关操作需要时间 以上几个时间也需要的,不能理所当然的任务绝对就是很准确的说法,都是相对什么来讲,我在任务中也调用了绝对延时,我延时7s左右的时间,实际上计算tic ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

41

主题

276

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2354
金钱
2354
注册时间
2019-10-29
在线时间
380 小时
 楼主| 发表于 2020-7-22 11:03:25 | 显示全部楼层
本帖最后由 chenyuan 于 2020-7-28 17:11 编辑

单步调试的时候,发现即使前面设置了滴答定时器优先级更高,但是在开启任务调度后,滴答定时器的中断优先级又变成最低了,后面是重新用了一个定时器来计数,将发送数据 放在5ms中断内执行。
configTICK_RATE_HZ =10 000,这个时候是100us进入一次滴答定时器中断,设置为configTICK_RATE_HZ =100 000时,是10us进入一次定时器中断,我在网上看到是说这个频率越高,定时的精度也就越高。但是实际测试的时候用绝对延时函数延时5ms,在configTICK_RATE_HZ =10 000时的精准度还要高于configTICK_RATE_HZ =100 000时,有些不太理解,望大佬指教 !!  谢谢啦
现在就是这个问题了,configTICK_RATE_HZ这个值增大有什么意义? 要增大这个值要注意些什么东西?  谢谢啦!
回复

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2020-7-18 11:27:13 | 显示全部楼层
楼主要明白,程序压入堆栈、出堆栈这些都需要时间的,调用函数就是出入栈的操作,加上OS任务调度有优先级的,不是你想要多少就是多少的,只要这个误差在允许范围之内即可
1、系统中断处理需要时间
2、任务调度器查找下一个运行任务需要时间
3、切换后,堆栈相关操作需要时间
以上几个时间也需要的,不能理所当然的任务绝对就是很准确的说法,都是相对什么来讲,我在任务中也调用了绝对延时,我延时7s左右的时间,实际上计算tick计数最后算出来的时间是6.8~6.9之间,这个误差可以接受,因为这个误差中有串口中断、蓝牙协议栈中断等抢时间执行,测试数据里边,有零星几次是7.01的、7.1的,都可以接受的范围,如果楼主需要非常准确的话,用硬件定时器吧,误差会小很多,结合整个系统,不影响其他东西运行即可
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

0

主题

113

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2538
金钱
2538
注册时间
2019-10-18
在线时间
403 小时
发表于 2020-7-18 11:57:17 | 显示全部楼层
这个所谓的延时函数有分绝对和相对.绝对类似于闹钟的几点几点叫你.相对类似于闹钟的几点后叫你.
节拍类似于分辨率,就是那个叫你的人过多久看一眼手表.比如那家伙一小时看一眼,那么你使用绝对延时函数.
那么如果你5点50的时候让他6点的时候叫你,那么他不忙(没有被其他任务抢占)他会在6点准时叫你,延时就是10分钟,这误差...自己算吧
如果在忙那等吧,等忙完才算事.
你理解的绝对大概率是想岔了,认为是几点让他叫你就是准时的几点了吧
回复

使用道具 举报

41

主题

276

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2354
金钱
2354
注册时间
2019-10-29
在线时间
380 小时
 楼主| 发表于 2020-7-18 12:09:08 | 显示全部楼层
decai 发表于 2020-7-18 11:57
这个所谓的延时函数有分绝对和相对.绝对类似于闹钟的几点几点叫你.相对类似于闹钟的几点后叫你.
节拍类似 ...

那么我想让他每5ms叫我一次,那么当他优先级很低的时候,他就会被其他中断打断,那么就可能是5.1ms叫我一次,如果我将滴答定时器的优先级设置高些,那么能打断他的中断就比较少。那么他可能就是5.01ms来叫我了。我现在想实现的就是他的精度要小,不会说出现0.1ms的误差
回复

使用道具 举报

0

主题

113

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2538
金钱
2538
注册时间
2019-10-18
在线时间
403 小时
发表于 2020-7-18 18:04:25 | 显示全部楼层
本帖最后由 decai 于 2020-7-18 18:08 编辑

被中断打断那是必然的,如果没有关闭中断的话.我说的是任务的优先级,不是中断的优先级.
5ms叫一次,那就是系统节拍200hz.那么你单纯想用这个系统节拍延时函数,就不能做到0.1ms的精确度.
说这些没法配图不好说.可能多查询多个方面的信息才能理解.完全讲清楚可能得出个书...我也正在学习,能力有限,不知道该什么说
回复

使用道具 举报

41

主题

276

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2354
金钱
2354
注册时间
2019-10-29
在线时间
380 小时
 楼主| 发表于 2020-7-21 12:00:55 | 显示全部楼层
configTICK_RATE_HZ =10 000,这个时候是100us进入一次滴答定时器中断,设置为configTICK_RATE_HZ =100 000时,是10us进入一次定时器中断,我在网上看到是说这个频率越高,定时的精度也就越高。但是实际测试的时候用绝对延时函数延时5ms,在configTICK_RATE_HZ =10 000时的精准度还要高于configTICK_RATE_HZ =100 000时,有些不太理解,望大佬指教 !!  谢谢啦
回复

使用道具 举报

41

主题

276

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2354
金钱
2354
注册时间
2019-10-29
在线时间
380 小时
 楼主| 发表于 2020-8-5 14:16:56 | 显示全部楼层
八度空间 发表于 2020-8-5 09:32
楼主要明白,程序压入堆栈、出堆栈这些都需要时间的,调用函数就是出入栈的操作,加上OS任务调度有优先级的 ...

现在用的就是其他的定时器了,固定时间发送一次数据
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 16:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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