三、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);
}