跳转至

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);   //停止定时器


}

原文: https://www.yuque.com/hxfqg9/iot/hi3ay15qoe863oii