LOADING...

加载过慢请开启缓存(浏览器默认开启)

loading

ESP-IDF与freeRTOS(四) 软定时

ESP-IDF与freeRTOS(四) 软定时

软件定时器

FreeRTOS的软件定时器与硬件无关,没有数量限制,定时器到时间触发任务。

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "esp_spi_flash.h"

#include "freertos/timers.h"

#include "myled.h"

void TimerCallBack(TimerHandle_t xTimer)
{
    const char *strName;
    //取得名字后可在同一个回调函数执行不同的函数过程
    strName = pcTimerGetName(xTimer);
    printf("timer name = %s!\n",strName);
    //取得ID的返回值是返回指针
    //创建定时器的时候传入ID是数字的时候可用如下方法
    //若传入的是地址,如(void*)&id1,则此处取值时获取到的是地址
    int id;
    id = (uint32_t)pvTimerGetTimerID(xTimer);
    printf("timer ID = %d!\n",id);
}

void app_main(void)
{
    TimerHandle_t xTimer1;
    TimerHandle_t xTimer2;

    // 创建timer1,1秒后执行,选择是否自动重装,ID 0,回调函数自定为Timer1CallBack
    xTimer1 = xTimerCreate("Timer1", pdMS_TO_TICKS(1000), pdTRUE, (void *)0, TimerCallBack);
    xTimer2 = xTimerCreate("Timer2", pdMS_TO_TICKS(2000), pdTRUE, (void *)1, TimerCallBack);
    // 启动定时器
    xTimerStart(xTimer1, 0);
    xTimerStart(xTimer2, 0);
    printf("启动定时器1\n");

    //改变timer定时周期
    xTimerChangePeriod(xTimer1,pdMS_TO_TICKS(4000),0);

    // vTaskDelay(pdMS_TO_TICKS(3000));
    // //停止定时器
    // xTimerStop(xTimer1,0);

    // while(1)
    // {
    //     vTaskDelay(pdMS_TO_TICKS(1000));
    //     //重启timer2,让timer2从零计时
    //     xTimerReset(xTimer2,0);
    // }


    // xTaskCreatePinnedToCore(ledTask, "ledTask", 2048, NULL, 1, NULL, 1);
}

到此为止,RTOS简单操作基本结束,下一步开始要学习信号量等内容,任务艰巨。

showimg