FreeRTOS 定时器精度研究

来源:本站
导读:目前正在解读《FreeRTOS 定时器精度研究》的相关信息,《FreeRTOS 定时器精度研究》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《FreeRTOS 定时器精度研究》的详细说明。
简介:FreeRTOS 以其移植方便,高度可定制,footprint 小,使其在嵌入式操作系统中的份额不容小觑! 尤以免费 license,颇受开发者青睐。

背景介绍

FreeRTOS 以其移植方便,高度可定制,footprint 小,使其在嵌入式操作系统中的份额不容小觑! 尤以免费 license,颇受开发者青睐。

问题描述

客户在基于cortex-m3的平台上使用FreeRTOS系统提供的定时器功能时,意外发现定时器的精确度不够高。譬如,设置1秒钟的定时器,理论上1秒超时,并且执行相应的回调函数。但是调试却发现,有时回调函数是在1.4秒后被执行!这对于精度要求较高的实时系统,是不能接受的!

问题复现与分析

首先在stm32f407-discovery平台移植FreeRTOS,并创建一个定时器,在其回调函数里toggle led灯,并测量被执行的时间。鉴于FreeRTOS是一个多任务可抢占式系统,这个问题需要在多种情况下分析。

Case 1 :

单任务,即系统里仅有timertask和idle task。整个系统最高优先级为4,Timer task的优先级为默认优先级2。

在这种环境下,回调函数能精确的以1秒的时长超时执行回调函数。虽然此刻精度能满足要求,但是实际的系统一般会包含多个task。

以下为测试的日志,显而易见,该定时器严格1秒钟超时。

expired 1000

expired 2000

expired 3000

expired 4000

expired 5000

expired 6000

Case 2 :

多任务,即系统里不仅有timertask和idle task,还有用户创建的task。整个系统最高优先级为4,Timer task的优先级为默认优先级2。

以下为测试的日志。

UART Printf Example:retarget the C library printf function to the UART

UART Printf Example:retarget the C library printf function to the UART

UART Printf Example:retarget the C library printf function to the UART

expired 1000

UART Printf Example:retarget the C library printf function to the UART

UART Printf Example:retarget the C library printf function to the UART

UART Printf Example:retarget the C library printf function to the UART

UART Printf Example:retarget the C library printf function to the UART

UART Printf Example:retarget the C library printf function to the UART

expired 3000

UART Printf Example:retarget the C library printf function to the UART

UART Printf Example:retarget the C library printf function to the UART

UART Printf Example:retarget the C library printf function to the UART

expired 4000

UART Printf Example:retarget the C library printf function to the UART

UART Printf Example:retarget the C library printf function to the UART

expired 5000

UART Printf Example:retarget the C library printf function to the UART

UART Printf Example:retarget the C library printf function to the UART

UART Printf Example:retarget the C library printf function to the UART

expired 6000

此时定时器回调函数有时能准确地被调度执行,有时则偏差较大,与期望值整整延迟了1秒钟。

Case 3 :

多任务,即系统里不仅有timer task和idle task,还有用户创建的task。整个系统最高优先级为4,Timertask的优先级为默认优先级4。这样设置优先级,是希望能通过将timer task设置为最高优先级,以期望调度器能优先调度执行timer task。

以下为实测的日志。

UART Printf Example:retarget the C library printf function to the UART

UART Printf Example:retarget the C library printf function to the UART

UART Printf Example:retarget the C library printf function to the UART

expired 1000

UART Printf Example:retarget the C library printf function to the UART

UART Printf Example:retarget the C library printf function to the UART

UART Printf Example:retarget the C library printf function to the UART

UART Printf Example:retarget the C library printf function to the UART

UART Printf Example:retarget the C library printf function to the UART

expired 3000

UART Printf Example:retarget the C library printf function to the UART

UART Printf Example:retarget the C library printf function to the UART

UART Printf Example:retarget the C library printf function to the UART

expired 4000

UART Printf Example:retarget the C library printf function to the UART

UART Printf Example:retarget the C library printf function to the UART

expired 5000

UART Printf Example:retarget the C library printf function to the UART

UART Printf Example:retarget the C library printf function to the UART

UART Printf Example:retarget the C library printf function to the UART

expired 6000

虽然调整了timertask的优先级至最高,但是依然会出现严重的偏差。

解决方案

考虑到FreeRTOS定时器的精准性不高,建议客户使用SysTick或者MCU的外设硬件定时器。

提醒:《FreeRTOS 定时器精度研究》最后刷新时间 2024-03-14 00:54:11,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《FreeRTOS 定时器精度研究》该内容的真实性请自行鉴别。