1. 创建定时器
定时器的创建使用
xTimerCreate
函数。该函数有以下参数:
pcTimerName
:定时器的名字,主要用于调试。xTimerPeriodInTicks
:定时器的周期,以系统节拍计时。uxAutoReload
:定时器是否自动重载。如果为pdTRUE
,定时器将在到期后自动重启;如果为pdFALSE
,定时器将在到期后停止。pvTimerID
:一个用户定义的标识符,可以在回调函数中使用。pxCallbackFunction
:定时器到期时调用的回调函数。
TimerHandle_t xTimer;
xTimer = xTimerCreate(
"MyTimer", // 定时器名字
pdMS_TO_TICKS(1000), // 定时器周期,单位为毫秒
pdTRUE, // 自动重载
( void * ) 0, // 定时器标识符
vTimerCallback // 回调函数
);
if (xTimer == NULL) {
// 创建定时器失败
} else {
// 创建定时器成功
}
2. 开始定时器
定时器的启动使用
xTimerStart
函数。该函数有以下参数:
xTimer
:定时器句柄。xTicksToWait
:如果队列已满,任务需要等待的节拍数。
if (xTimerStart(xTimer, 0) != pdPASS) {
// 启动定时器失败
} else {
// 启动定时器成功
}
3. 停止定时器
定时器的停止使用
xTimerStop
函数。该函数有以下参数:
xTimer
:定时器句柄。xTicksToWait
:如果队列已满,任务需要等待的节拍数。
if (xTimerStop(xTimer, 0) != pdPASS) {
// 停止定时器失败
} else {
// 停止定时器成功
}
代码示例:
#include "FreeRTOS.h"
#include "task.h"
#include "timers.h"
void vTimerCallback(TimerHandle_t xTimer) {
// 定时器回调函数
printf("Timer expired!\n");
}
void vTaskFunction(void *pvParameters) {
TimerHandle_t xTimer;
// 创建定时器
xTimer = xTimerCreate(
"MyTimer", // 定时器名字
pdMS_TO_TICKS(1000), // 定时器周期,单位为毫秒
pdTRUE, // 自动重载
( void * ) 0, // 定时器标识符
vTimerCallback // 回调函数
);
if (xTimer == NULL) {
// 创建定时器失败
} else {
// 创建定时器成功
if (xTimerStart(xTimer, 0) != pdPASS) {
// 启动定时器失败
} else {
// 启动定时器成功
}
}
// 任务循环
for (;;) {
// 停止定时器(例如在某些条件下)
if (/* some condition */) {
if (xTimerStop(xTimer, 0) != pdPASS) {
// 停止定时器失败
} else {
// 停止定时器成功
}
}
vTaskDelay(pdMS_TO_TICKS(2000)); // 延时以模拟任务的其他操作
}
}
int main(void) {
// 创建任务
xTaskCreate(vTaskFunction, "Task", configMINIMAL_STACK_SIZE, NULL, 1, NULL);
// 启动调度器
vTaskStartScheduler();
// 如果程序运行到这里,说明调度器启动失败
for (;;);
}