打印
[信息]

【实战经验】FreeRTOS定时器精度研究

[复制链接]
4348|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 香水城 于 2017-8-14 09:30 编辑

                               FreeRTOS定时器精度研究


背景介绍
FreeRTOS 以其移植方便,高度可定制,footprint 小,使其在嵌入式操作系统中的份额不容小觑!尤以免费license,颇受开发者青睐。
问题描述
客户在基于cortex-m3 的平台上使用FreeRTOS 系统提供的定时器功能时,意外发现定时器的精确度不够高。譬如,设置1 秒钟的定时器,理论上1 秒超时,并且执行相应的回调函数。但是调试却发现,有时回调函数是在1.4 秒后被执行!这对于精度要求较高的实时系统,是不能接受的!
问题复现与分析
首先在stm32f407-discovery 平台移植FreeRTOS,并创建一个定时器,在其回调函数里toggle led 灯,并测量被执行的时间。鉴于FreeRTOS 是一个多任务可抢占式系统,这个问题需要在多种情况下分析。
    Case 1 :
单任务,即系统里仅有timer task 和idle task。整个系统最高优先级为4,Timer task 的优先级为默认优先级2。
在这种环境下,回调函数能精确的以1 秒的时长超时执行回调函数。虽然此刻精度能满足要求,但是实际的系统一般会包含多个task。以下为测试的日志,显而易见,该定时器严格1 秒钟超时。


   
    Case 2 :
多任务,即系统里不仅有timer task 和idle task,还有用户创建的task。整个系统最高优先级为4,Timer task 的优先级为默认优先级2。
以下为测试的日志。

此时定时器回调函数有时能准确地被调度执行,有时则偏差较大,与期望值整整延迟了1 秒钟。
    Case 3 :
多任务,即系统里不仅有timer task 和idle task,还有用户创建的task。整个系统最高优先级为4,Timer task 的优先级为默认优先级4。这样设置优先级,是希望能通过将timer task 设置为最高优先级,以期望调度器能优先调度执行timer task。
以下为实测的日志。


虽然调整了timer task 的优先级至最高,但是依然会出现严重的偏差。
解决方案
考虑到FreeRTOS 定时器的精准性不高,建议客户使用SysTick 或者MCU 的外设硬件定时器。

更多实战经验请看:【ST MCU实战经验汇总贴】

沙发
flydream0| | 2016-5-13 17:25 | 只看该作者
从FreeRTOS的源码文件timers.c中的的prvTimerTask函数可以看出FreeRTOS的定时器的运行原理是:
通过一个定时器任务不断的从定时器列表中取出下一个定时器数据块,然后通过定时器的tick与当前系统tick进行比较里判断是否到时,若到时,则回调定时器对应的处理函数,若时间还未全部消耗掉,则继续等待剩下的时间。这里关键是判断是否超时的方式,此方式在prvSampleTimeNow函数内:
xTimeNow = xTaskGetTickCount();
        if( xTimeNow < xLastTime )
        {
           。。。
      }
else
{

}
很明显,这是软实时的定时器,系统只是不断被动地查询当前系统tick来判断定时器是否超时的,这种方式在原理上就不可能有很好的精确度。

硬实时的定时器精确度才会高些。

使用特权

评论回复
板凳
icecut| | 2016-5-13 17:36 | 只看该作者
flydream0 发表于 2016-5-13 17:25
从FreeRTOS的源码文件timers.c中的的prvTimerTask函数可以看出FreeRTOS的定时器的运行原理是:
通过一个定 ...

软实时和硬实时看情况使用,一般任务软实时.靠系统负载不高来搞定.重要周期任务硬实时,直接绕过 os 使用中断实现.
更重要的是合理分配 os 的执行,将复杂的东西,影响实时的东西启动时初始化,避免在 cpu 负载大时进行抢占 cpu

使用特权

评论回复
地板
mzhboy| | 2016-5-14 11:29 | 只看该作者
这是什么鬼的设计思想。

一般来说不是应该是 每个 tick 检查软定时器的值么,为了让 systick尽量短,放pendsv也成嘛,虽然带来抖动,但起码还是准的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:意法半导体(中国)投资有限公司
简介:STM32技术专家

596

主题

17078

帖子

283

粉丝