完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
背景介绍
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秒钟超时。 expired 1000 expired 2000 expired 3000 expired 4000 expired 5000 expired 6000 … Case 2 : 多任务,即系统里不仅有 timertask和idletask,还有用户创建的 task。整个系统最高优先级为 4,Timertask的优先级为默认优先级 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 : 多任务,即系统里不仅有 timertask 和 idletask,还有用户创建的 task。整个系统最高优先级为 4,Timertask的优先级为默认优先级 4。这样设置优先级,是希望能通过将 timertask设置为最高优先级,以期望调度器能优先调度执行 timertask。 以下为实测的日志。 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的外设硬件定时器。 |
|
相关推荐 |
|
只有小组成员才能发言,加入小组>>
778浏览 0评论
136浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 09:53 , Processed in 1.133910 second(s), Total 43, Slave 33 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号