0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

FreeRTOS的定时器设计实现

冬至子 来源:ITRelief 作者:Sachefgh Xu 2023-07-25 15:28 次阅读

定时器的概念

定时器用于根据系统时启动特定的函数,执行相应的任务。FreeRTOS的定时器可以配置启动一次或者间隔一定时间执行。

当然,定时器的实现是基于RTOS心跳机制与任务列表的。这意味着其API可以任何RTOS托管下的程序段调用(而中断不行),包括定时器关联的的回调函数。

FreeRTOS提供了间隔执行定时器的运行时序:

图片

API Description ※ 定时器不能在中断中使用

**①****创建定时器 **osTimerNew()

定时器的类型分为单次(One-time )和多次执行(periodic),在创建时进行配置;其中多次执行时序见上图;单次唤起一次后自动停止,需要用户手动再次启动。而多次执行则间隔指定时间就会执行一次,直至用户停止。

osTimerId_t osTimerNew (osTimerFunc_t func, osTimerType_t type, void *argument, const osTimerAttr_t *attr);/*
创建一个定时器,并绑定相应的回调函数      @retval 定时器的ID;  创建失败返回NULL
@param    void(* osTimerFunc_t)(void *argument) //这是回调函数的格式,例:
            -void Timer1_Callback(void *arg); //arg contains various type of variables.
func        -回调函数的地址,即函数名
type        -定时器类型(单次或间隔型):  osTimerOnce -执行单次  osTimerPeriodic -多次执行
*argument   -传递给回调函数的参数;传入地址;缺省填 (void*)0即可
*/

②启动定时器 osTimerStart()

osStatus_t osTimerStart (osTimerId_t timer_id, uint32_t ticks);/*
启动定时器并指定时间间隔.  指定的回调函数在经过本函数指定的ticks后第一次被调用。
@param:
id           -定时器ID
ticks        -间隔时间 (单位心跳数)       
@retval:
osOK         -成功
osErrorISR   -在中断中调用而出错
osErrorParameter: parameter timer_id is either NULL or invalid or ticks is incorrect.
osErrorResource: the timer is in an invalid state.
*/

③停止定时器 osTimerStop()

停止定时器的效果从下一次唤醒开始(回调函数停止自己定时器的情况)

osStatus_t osTimerStop (osTimerId_t timer_id);/*
停止指定的定时器
@retval
osOK
osErrorISR
osErrorParameter: parameter timer_id is either NULL or invalid.
osErrorResource: the timer is not running (you can only stop a running timer).
*/

④查询定时器启动状态osTimerIsRunning()

uint32_t osTimerIsRunning (osTimerId_t  timer_id);/*
@retval
0 U   -未启动、中断中调用、未创建
!0    -已启动
*/

⑤删除定时器 osTimerDelete()

回调函数可以删除调用自己的定时器。

删除后定时器id值变为NULL,可以再调用 osTimerNew() 为其创建新的定时器

osStatus_t osTimerDelete (osTimerId_t timer_id);/*
删除定时器并清理其资源。
@retval: 
  osOK: the specified timer has been deleted.
  osErrorISR: osTimerDelete cannot be called from interrupt service routines.
  osErrorParameter: parameter timer_id is either NULL or invalid.
  osErrorResource: the timer is in an invalid state.
*/

示例

void Timer_Callback (void *arg);                // prototype for timer callback function
uint32_t exec;                                  // argument for the timer call back function
void TimerStop_example (void) {
  osTimerId_t id;                               // timer id
  osStatus_t  status;                           // function return status
  // Create periodic timer
  exec = 1U;
  id = osTimerNew(Timer_Callback, osTimerPeriodic, &exec, NULL);
  osTimerStart(id, 1000U);                      // start timer
  :
  status = osTimerStop(id);                     // stop timer
  if (status != osOK) {
    // Timer could not be stopped
  }
  ;
  osTimerStart(id, 1000U);                      // start timer again
  ;
}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 定时器
    +关注

    关注

    23

    文章

    3148

    浏览量

    112084
  • RTOS
    +关注

    关注

    20

    文章

    776

    浏览量

    118812
  • FreeRTOS
    +关注

    关注

    12

    文章

    473

    浏览量

    61361
  • 串口中断
    +关注

    关注

    0

    文章

    63

    浏览量

    13617
收藏 人收藏

    评论

    相关推荐

    STM32H743是否支持FTP/SNTP?FreeRTOS软件定时器不是很准确怎么解决?

    大家好, 目前在用STM32H743ZIT6,跑FreeRTOS系统,帮忙确认下是否支持FTP/SNTP?另外FreeRTOS软件定时器不是很准确,有没有解决方案或者参考设置?上述程序里是用的100ms
    发表于 04-26 06:50

    FreeRTOS 定时器精度研究

    上使用 FreeRTOS系统提供的定时器功能时,意外发现定时器的精确 度不够高。譬如,设置1秒钟的定时器,理论上1秒超时,并且执行相应的回调函数。但是调试却发现,有时回调函数是在 1.
    发表于 08-30 10:01

    转:第19章 FreeRTOS定时器

    (Daemon任务)19.3 使用软件定时器组注意事项19.4 定时器组API函数19.5 实验例程说明19.6总结19.1定时器组介绍 FreeRTOS软件
    发表于 09-03 13:13

    FreeRTOS 定时器精度研究

    的平台上使用FreeRTOS系统提供的定时器功能时,意外发现定时器的精确度不够高。譬如,设置1秒钟的定时器,理论上1秒超时,并且执行相应的回调函数。但是调试却发现,有时回调函数是在1.
    发表于 10-11 13:42

    FreeRTOS滴答定时器的优先级不是最低吗?

    FreeRTOS滴答定时器的优先级不是最低吗,这里怎么是最高的呢?
    发表于 06-09 15:09

    freeRTOS中的软定时器定时时间,创建定时器后有办法修改吗?

    请教大家,freeRTOS中的软定时器定时时间,创建定时器后有没有办法修改呢?我的想法是 程序里有个循环,循环里改改定时器的时间。但是貌似
    发表于 07-19 08:03

    STM32CubeMX FreeRTOS的软件定时器如何实验

    STM32CubeMX FreeRTOS的软件定时器如何实验
    发表于 10-13 08:29

    什么是软件定时器? 软件定时器实现原理是什么?

    什么是软件定时器?软件定时器实现原理是什么?
    发表于 11-24 06:43

    定时器原理以及一般定时器实现的方式

    定时器原理一般定时器实现的方式有以下几种: 基于排序链表方式: 通过排序链表来保存定时器,由于链表是排序好的,所以获取最小(最早到期)的定时器
    的头像 发表于 08-14 11:15 6329次阅读

    FreeRTOS软件定时器的使用步骤

    FreeRTOS软件Timer有两种:重复性的和一次性的Timer。软件定时器使用有3步。
    的头像 发表于 09-14 15:22 1564次阅读

    freeRTOS软件定时器的使用

    freeRTOS中加入了软件定时器这个功能组件,是一个可选的、不属于freeRTOS内核的功能,由定时器服务(其实就是一个定时器任务)来提供
    的头像 发表于 02-10 13:55 1346次阅读

    Free RTOS的软件定时器

    软件定时器FreeRTOS中的一个重要模块,使用软件定时器可以方便的实现一些与超时或周期性相关的功能。
    的头像 发表于 02-10 15:53 1749次阅读
    Free RTOS的软件<b class='flag-5'>定时器</b>

    什么是软件定时器?软件定时器实现原理

    软件定时器是用程序模拟出来的定时器,可以由一个硬件定时器模拟出成千上万个软件定时器,这样程序在需要使用较多定时器的时候就不会受限于硬件资源的
    的头像 发表于 05-23 17:05 1879次阅读

    定时器设计实现

    ,并返回ITimer类型的共享指针。其中ITimer类中定义了start和stop方法,用于启动或停止当前定时器。 TimerManager还有一个内部类TimerMessageQueue用于实现
    的头像 发表于 11-08 16:50 281次阅读

    如何实现一个软件定时器

    在Linux,uC/OS,FreeRTOS等操作系统中,都带有软件定时器,原理大同小异。典型的实现方法是:通过一个硬件定时器产生固定的时钟节拍,每次硬件
    的头像 发表于 04-29 11:00 114次阅读