ESP32freeRTOS(下)
ESP32 freeRTOS(下)
软件定时器
定时器就像一个闹钟,在一定的时间后会执行响应的程序,硬件定时器是有数量限制的,软件定时器就没有这个限制了
对于 freeRTOS 来说,软件定时器是基于 Daemon Timer Service Task 的任务来实现的,通过 Timer Command Queue 对任务发送命令,然后任务调用相应的定时器回调函数
要用定时器首先要包含头文件 freertos/timers.h
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_task_wdt.h"
#include "freertos/timers.h" //队列所需头文件
void Timer1CallBack(TimerHandle_t xTimer1){
printf("One Shot Timer!\n");
}
void app_main(void)
{
TimerHandle_t xTimer1; //创建定时器句柄
xTimer1 = xTimerCreate("Timer1", pdMS_TO_TICKS(1000), pdFALSE, (void *)0, Timer1CallBack); //创建定时器,参数:定时器名字、周期时间、是否重装定时器(是否只自动重置定时器,false的话只运行一次)、回调函数
xTimerStart(xTimer1, 0);
}
可以把是否重装定时器这个参数设置为 pdTRUE,这样当定时器到时间后还会自动重新开始计时,可以通过 xTimerStop 将定时器停止
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_task_wdt.h"
#include "freertos/timers.h" //队列所需头文件
void Timer1CallBack(TimerHandle_t xTimer1){
printf("One Shot Timer!\n");
}
void app_main(void)
{
TimerHandle_t xTimer1; //创建定时器句柄
xTimer1 = xTimerCreate("Timer1", pdMS_TO_TICKS(1000), pdTRUE, (void *)0, Timer1CallBack); //创建定时器,参数:定时器名字、周期时间、是否重装定时器(是否只自动重置定时器,false的话只运行一次)、回调函数
xTimerStart(xTimer1, 0);
vTaskDelay(6000/portTICK_PERIOD_MS);
xTimerStop(xTimer1, 0); //停止定时器
}