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

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

3天内不再提示

freeRTOS软件定时器的使用

汽车电子技术 来源:嵌入式之入坑笔记 作者: 嵌入式之入坑笔记 2023-02-10 13:55 次阅读

本文的内容结构如下:

1、 freeRTOS中启用定时器

2、freeRTOS的定时器种类

2.1、单次定时器

2.2、周期定时器

3、freeRTOS 软件定时器的API函数

3.1、创建软件定时器

3.2、启动软件定时器

3.3、停止定时器

3.4、复位定时器

3.5、查询定时器是否已经开始运行

4、软件定时器使用实例

freeRTOS中加入了软件定时器这个功能组件,是一个可选的、不属于freeRTOS内核的功能,由定时器服务(其实就是一个定时器任务)来提供。

软件定时器是当设定一个定时时间,当达到设定的时间之后就会执行指定的功能函数,而这个功能函数就叫做 回调函数

也就是说回调函数的两次执行间隔叫做定时器的定时周期。

回调函数: 回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。

1、 freeRTOS中启用定时器

在freeRTOS中要使用软件定时器的话,需要在配置文件freeRTOSConfig.h中设置相应的宏,如下:

#define configUSE_TIMERS        1  //使能软件定时器
#define configTIMER_TASK_PRIORITY    2    // 软件定时器的优先级
#define configTIMER_QUEUE_LENGTH    10    // 软件定时器的队列长度
#define configTIMER_TASK_STACK_DEPTH  (configMINIMAL_STACK_SIZE * 2)    // 软件定时器的堆栈空间大小(单位是字)

2、freeRTOS的定时器种类

2.1、单次定时器

单次定时器定时时间到了就执行一次回调函数,之后不会再执行,只有在再次重新启动的时候才会再执行一次。

2.2、周期定时器

周期定时器根据设定的时间周期地执行的。它一旦启动以后,每执行一次完一次回调函数以后定时器会自动重启,回调函数会周期性的执行。

3、freeRTOS 软件定时器的API函数

3.1、创建软件定时器

TimerHandle_t xTimerCreate
(
                const char * const pcTimerName,   /* 定时器名字 */
                const TickType_t xTimerPeriod,     /* 定时器周期 */
                const UBaseType_t uxAutoReload,   /* 选择单次模式或者周期模式 */
                void  * const pvTimerID,       /* 定时器 ID */
                TimerCallbackFunction_t pxCallbackFunction ); /* 定时器回调函数 */

函数描述:

函数 xTimerCreate 用于创建软件定时器。

1)第 1 个参数: 定时器名字,一般用于调试,方便识别不同的定时器。

2)第 2 个参数: 定时器周期,单位是系统时钟节拍。

3)第 3 个参数: 选择定时器是周期模式还是单次模式。若参数为 pdTRUE ,则表示选择周期模式,若参数为 pdFALSE ,则表示选择单次模式。

4)第 4 个参数: 定时器的 ID。当创建多个不同的定时器,但又使用同一个回调函数时,在回调函数中就可以通过不同的 ID 号来区分不同的定时器。

5)第 5 个参数: 定时器的回调函数。

返回值: 创建成功返回定时器的句柄,失败会返回 NULL。

创建一个单次触发的软件定时器示例如下:

TimerHandle_t singalTIMERS;   //单次定时器
    void singalTimersFunc(TimerHandle_t xTimers); //单次定时器回调函数
    /*创建单次定时器*/
    singalTIMERS = xTimerCreate(
                                  "singalTIMERS",  //软件定时器的名字
                                  1000,            //定时周期,单位是时钟节拍数
                                  pdFALSE,         //定时器模式,pdTRUE为周期定时器,pdFALSE为单次定时器
                                  (void*)1,        //定时器的ID号
                                  singalTimersFunc //定时器回调函数
                                );//

3.2、启动软件定时器

1)在任务中启动

BaseType_t xTimerStart( TimerHandle_t xTimer,     /* 定时器句柄 */
                  TickType_t xBlockTime );  /* 成功启动定时器前的最大等待时间设置,单位系统时钟节拍 */

函数描述:

函数 xTimerStart 用于启动软件定时器。

**1> **第 1 个参数是定时器句柄。

2> 第 2 个参数是成功启动定时器前的最大等待时间设置,单位系统时钟节拍。这是定时器组的大部分 API 函数不是直接运行的,而是通过消息队列给定时器任务发消息来实现的,此参 数设置的等待时间就是当消息队列已经满的情况下,等待消息队列有空间时的最大等待时间。

返回值: 返回 pdFAIL 表示此函数向消息队列发送消息失败,返回 pdPASS 表示此函数向消息队列发 送消息成功。

注意:定时器任务实际执行消息队列发来的命令依赖于定时器任务的优先级,如果定时器任务 是高优先级会及时得到执行,如果是低优先级,就要等待其余高优先级任务释放 CPU 权才可以得到执行。

使用这个函数要注意以下问题:

1> 要使用定时器启动函数前提是已经通过函数 xTimerCreate 成功创建了软件定时器。

2> 在 FreeRTOSConfig.h 文件中使能宏定义:

#define configUSE_TIMERS 1

2)在中断中启动

BaseType_t  xTimerStartFromISR(TimerHandle_t  xTimer
                           BaseType_t*    pxHigherPriorityTaskWoken);

函数描述:

XTimer: 软件定时器的句柄

pxHigherPriorityTaskWoken: 退出此函数时是否要进行任务切换

返回值:

pdPASS: 软件定时器开启成功。

pdFAIL: 软件定时器开启失败。

3.3、停止定时器

1)在任务中停止软件定时器

BaseType_t xTimerStop(TimerHandle_t xTime,
               TickType_t xTicksToWait)

函数描述:

xTimer: 软件定时器的句柄。

xTicksToWait: 阻塞时间,即停止定时器最大的等待时间。

返回值:

pdPASS: 软件定时器停止成功

pdFAIL: 软件定时器停止失败

2)在中断中停止软件定时器

xTimerStopFormISR(TimerHandle_t xTimer,
            BaseType_t pxHigherPriorityTaskWoken);

函数描述:

xTimer: 软件定时器句柄

pxHigherPriorityTaskWoken: 退出此函数时是否要进行任务切换

返回值:

pdPASS: 软件定时器开启成功。

pdFAIL: 软件定时器开启失败。

3.4、复位定时器

1)在任务中复位

BaseType_t xTimerReset(TimerHandle_t  xTimer,
              TickType_t xTicksToWait)

函数描述:

xTimer: 软件定时器的句柄。

xTicksToWait: 阻塞时间,即停止定时器最大的等待时间。

返回值:

pdPASS: 软件定时器复位成功

pdFAIL: 软件定时器复位失败

2)在中断中复位

BaseType_t xTimerResetFromISR(TimerHandle_t xTimer,
                   BaseType_t *pxHigherPriorityTaskWoken);

函数描述:

xTimer: 软件定时器句柄

pxHigherPriorityTaskWoken: 退出此函数时是否要进行任务切换

返回值:

pdPASS: 软件定时器复位成功。

pdFAIL: 软件定时器复位失败。

3.5、查询定时器是否已经开始运行

BaseType_t xTimerIsTimerActive( TimerHandle_t xTimer )

查询定时器以查看它是活动的还是 休眠的

如果出现以下情况,计时器将处于休眠状态:

  1. 已创建但未启动。
  2. 已过期的计时器尚未重新启动。

返回值:

pdFALSE,没有运行。

其他值,运行。

4、软件定时器使用实例

创建2个软件定时器,ID号分别为1、2,这两个软件定时器使用同一个回调函数,在回调函数里面读取定时器的ID,通过ID识别定时器。

1、创建软件定时器
TimerHandle_t SoftWaveTimer1;            //软件定时器1
TimerHandle_t SoftWaveTimer2;            //软件定时器2
void pxSoftWaveTimer(TimerHandle_t xTimer); //软件定时器回调函数


    SoftWaveTimer1 = xTimerCreate(
                                 "softwaveTimer1",
                                 1000,
                                 pdTRUE,
                                 (void*)1,
                                 pxSoftWaveTimer);
     SoftWaveTimer2 = xTimerCreate(
                                 "softwaveTimer2",  //定时器句柄
                                 3000,              //定时器周期
                                 pdTRUE,            //周期/单次定时器
                                 (void*)2,          //定时器ID
                                 pxSoftWaveTimer);  //回调函数指针


2、定时器回调函数
void pxSoftWaveTimer(TimerHandle_t xTimer)
{

    u32 TimerID;
    u8  *TimerName;
    TimerID   = (u32)pvTimerGetTimerID(xTimer);   //获取定时器ID
    TimerName = (u8*)pcTimerGetName( xTimer );    //获取定时名字
    if(TimerID == 1)
    {
        printf("软件定时器%s运行,1S周期\\r\\n",TimerName);
    }
    if(TimerID == 2)
    {
        printf("软件定时器%s运行,2S周期\\r\\n",TimerName);
    }
}


3、启动、关闭定时器
//task1任务函数
void task1_task(void *pvParameters)   //prio = 2
{
    u8 keyVal = 0;
    while(1)
    {
        keyVal = KEY_Scan(0);
        if(keyVal == KEY0_PRES)         //启动定时器
        {
           xTimerStart(SoftWaveTimer1,0);
           xTimerStart(SoftWaveTimer2,0);
        }
        if(keyVal == KEY1_PRES)         //关闭定时器
        {
           xTimerStop(SoftWaveTimer1,0);
           xTimerStop(SoftWaveTimer2,0);
        }
        LED1 ^= 1;
        vTaskDelay(200);   //延时n个时钟节拍
    }
}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 内核
    +关注

    关注

    3

    文章

    1372

    浏览量

    40288
  • 定时器
    +关注

    关注

    23

    文章

    3247

    浏览量

    114764
  • FreeRTOS
    +关注

    关注

    12

    文章

    484

    浏览量

    62159
收藏 人收藏

    评论

    相关推荐

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

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

    转:第19章 FreeRTOS定时器

    第19章FreeRTOS定时器组 本章节为大家讲解FreeRTOS支持的定时器组,或者叫软件定时器
    发表于 09-03 13:13

    【NUCLEO-F412ZG试用体验】FreeRTOS_软件定时器

    FreeRTOS软件定时器不是很准,如果要精确定时建议用硬件定时器,这一点ST的相关官方应用手册是有探究的。本例程,实在上一期试用报告的基
    发表于 12-20 20:01

    freertos软件定时器的回调函数里面能否调用其他API函数?

    freertos软件定时器的回调函数里面能否调用其他API函数?比如在回调函数里添加xSemaphoreGive(BinarySemaphore);/* 处理定时器1任务
    发表于 07-28 08:00

    【转载】AT32 FreeRTOS应用笔记

    .......................................................93FreeRTOS 软件定时器组 .............................. 100
    发表于 08-16 11:56

    STM32CubeMX FreeRTOS软件定时器实验 精选资料推荐

    系统:linux mint xfce 64bit 软件: 1、SW4STM32 2、STM32CubeMX 关于这两个软件在linux的安装教程请看我另一篇博文Linux/Windows配置
    发表于 08-04 09:02

    STM32CubeMX FreeRTOS软件定时器如何实验

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

    freertos软件定时器最高定时精度可以达到多少?

    可以做到1ms的定时
    发表于 10-15 08:05

    FreeRTOS软件定时器编程教程

    软件定时器本质上是一个周期性的任务或单次执行任务。
    发表于 11-17 13:21 1860次阅读

    基于硬件定时器软件定时器

    概括硬件定时器很精确,软件定时器无论如何都有延迟,主要用在不需要精确定时的地方,而且软件定时比较
    发表于 11-25 09:51 8次下载
    基于硬件<b class='flag-5'>定时器</b>的<b class='flag-5'>软件</b><b class='flag-5'>定时器</b>

    FreeRTOS软件定时器的使用步骤

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

    Free RTOS的软件定时器

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

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

    软件定时器是用程序模拟出来的定时器,可以由一个硬件定时器模拟出成千上万个软件定时器,这样程序在需
    的头像 发表于 05-23 17:05 2786次阅读

    FreeRTOS定时器设计实现

    定时器用于根据系统时启动特定的函数,执行相应的任务。FreeRTOS定时器可以配置启动一次或者间隔一定时间执行。
    的头像 发表于 07-25 15:28 2011次阅读
    <b class='flag-5'>FreeRTOS</b>的<b class='flag-5'>定时器</b>设计实现

    如何实现一个软件定时器

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