Skip to content

三、FreeRTOS软件定时器

FreeRTOS 软件定时器允许在任务上下文之外的时间间隔内执行函数,是一种高效的非阻塞操作方式。

FreeRTOS软件定时器主要有以下几个API:

函数名功能备注
xTimerCreate创建定时器创建一次性或周期性定时器
xTimerStart启动定时器定时器开始计时
xTimerStop停止定时器停止定时器计时
xTimerChangePeriod修改定时器周期可用于改变定时器运行间隔
xTimerDelete删除定时器释放定时器资源
xTimerReset重置定时器
以下是主要 API 的详细说明:

3.1 API说明:

xTimerCreate

功能: 创建一个软件定时器。

原型:

c

TimerHandle_t xTimerCreate( 
    const char * const pcTimerName,
    const TickType_t xTimerPeriodInTicks,
    const UBaseType_t uxAutoReload,
    void * const pvTimerID,
    TimerCallbackFunction_t pxCallbackFunction 
);

参数说明:

  • pcTimerName:定时器的名称,仅用于调试,可为 NULL
  • xTimerPeriodInTicks:定时器的时间周期(以系统 tick 为单位)。
  • uxAutoReload:是否为自动重载模式,值为 pdTRUE(周期性定时器)或 pdFALSE(一次性定时器)。
  • pvTimerID:用户定义的定时器标识,用于在回调函数中区分不同定时器。
  • pxCallbackFunction:定时器触发时调用的回调函数。

返回值:

成功返回 TimerHandle_t(定时器句柄),失败返回 NULL。-

xTimerStart

功能: 启动一个软件定时器。

原型:

c

BaseType_t xTimerStart( TimerHandle_t xTimer, TickType_t xTicksToWait );

参数说明:

  • xTimer:定时器句柄,由 xTimerCreate 返回。
  • xTicksToWait:阻塞等待时间(以系统 tick 为单位)。通常为 0。 返回值:pdPASS 表示启动成功,pdFAIL 表示失败。

xTimerStop

功能: 停止一个正在运行的定时器。

原型:

c

BaseType_t xTimerStop( TimerHandle_t xTimer, TickType_t xTicksToWait );

参数说明:

xTimer:定时器句柄。 xTicksToWait:阻塞等待时间。 返回值: pdPASS 表示停止成功,pdFAIL 表示失败。

xTimerChangePeriod

功能: 改变定时器的触发周期。

原型:

c
BaseType_t xTimerChangePeriod( TimerHandle_t xTimer, TickType_t xNewPeriod, TickType_t xTicksToWait );

参数说明:

  • xTimer:定时器句柄。
  • xNewPeriod:新的触发周期(以系统 tick 为单位)。
  • xTicksToWait:阻塞等待时间。

返回值: pdPASS 表示成功,pdFAIL 表示失败。

xTimerDelete

功能: 删除一个定时器并释放其资源。

原型:

c
BaseType_t xTimerDelete( TimerHandle_t xTimer, TickType_t xTicksToWait );

参数说明:

  • xTimer:定时器句柄。
  • xTicksToWait:阻塞等待时间。 返回值: pdPASS 表示删除成功,pdFAIL 表示失败。

xTimerReset

功能: 重置定时器并重新开始计时。

原型:

c
BaseType_t xTimerReset( TimerHandle_t xTimer, TickType_t xTicksToWait );

参数说明:

  • xTimer:定时器句柄。
  • xTicksToWait:阻塞等待时间。 返回值:pdPASS 表示成功,pdFAIL 表示失败。

3.2 示例代码:

c
#include <stdio.h>
#include "esp_log.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/timers.h"

static const char *TAG = "main";

// 定时器回调
void TimerCallback_1(TimerHandle_t xTimer)
{
    // 取到定时器的名字
    const char *timerName = pcTimerGetName(xTimer);
    // 取得定时器的ID
    void *timerID = pvTimerGetTimerID(xTimer);
    ESP_LOGI(TAG, "定时器名称:%s,定时器id:%d,定时器回调函数执行", timerName, (int)timerID);
}

void app_main(void)
{
    // 创建定时器句柄
    TimerHandle_t xTimer_1;
    TimerHandle_t xTimer_2;
    xTimer_1 = xTimerCreate("timer1", pdMS_TO_TICKS(1000), pdTRUE, (void *)0, TimerCallback_1);
    xTimer_2 = xTimerCreate("timer2", pdMS_TO_TICKS(2000), pdTRUE, (void *)1, TimerCallback_1);

    xTimerStart(xTimer_1, 0); // 启动定时器
    xTimerStart(xTimer_2, 0); // 启动定时器

    vTaskDelay(pdMS_TO_TICKS(5000));
    //停止定时器
    xTimerStop(xTimer_1, 0);
    xTimerStop(xTimer_2, 0);
}