FreeRTOS学习--56讲 软件定时器

news/2024/7/4 7:18:57

软件定时器:

        用户可自定义定时器的周期,当指定时间到达后调用回调函数,用户在回调函数中处理信息

硬件定时器:
        芯片自带的定时器模块,精度高,能触发中断,用户在中断服务函数中处理信息

软件定时器特点:

        a.在调用函数vTaskStartScheduler()开启任务调度器的时候,会创建一个用于管理软件定时器的任务,这个任务就叫做软件定时器服务任务。软件定时器服务任务,主要负责软件定时器超时的逻辑判断、调用超时软件定时器的超时回调函数以及处理软件定时器命令队列。且回调函数中不能有延时阻塞之类的函数vTaskDelay()vTaskDelayUntil()等

        b.软件定时器刚创建的时候属于休眠态,需要激活才能变为运行态,休眠态其回调函数不会被执行

使用软件定时器的条件:

        a.在FreeRTOSConfig.h中把configCSE_TIMERS置1

        b.configTIMER_TASK_PRIORITY设为31,就是把服务任务的优先级设为最高

        c.configTIMER_QUEUE_LENGTH设为5,把命令队列长度设为5,能接收多个命令

动态创建软件定时器        xTimerCreate()
TimerHandle_t xTimerCreate(
                 const char * const                 pcTimerName,
                 const TickType_t                   xTimerPeriodInTicks,
                 const UBaseType_t              uxAutoReload,
                 void * const                           pvTimerID,
                 TimerCallbackFunction_t      pxCallbackFunction);
 参数:
 软件定时器名,定时器超时时间(系统时钟节拍),定时器模式(pdTRUE 周期定时器,pdFALSE 单次定时器),软件定时器ID(用于多个软件定时器公用一个超时回调函数),软件定时器超时回调函数
 返回值:NULL 软件定时器创建失败,其他值 软件定时器创建成功,返回其句柄

开启软件定时器            xTimerStart()
BaseType_t xTimerStart(TimerHandle_t    xTimer,const TickType_t    xTicksToWait)
参数:待开启软件定时器的句柄,发送命令到软件定时器命令队列的等待时间
返回值:pdPASS 开启成功,pdFAIL 开启失败

停止软件定时器            xTimerStop()
BaseType_t xTimerStop(TimerHandle_t   xTimer,const TickType_t   xTicksToWait);
参数:待停止软件定时器的句柄,发送命令到软件定时器命令队列的等待时间
返回值:pdPASS 停止成功,pdFAIL 停止失败

复位软件定时器            xTimerReset()
BaseType_t xTimerReset(TimerHandle_t xTimer,const TickType_t xTicksToWait);
参数:待复位软件定时器的句柄,发送命令到软件定时器命令队列的等待时间
返回值:pdPASS 复位成功,pdFAIL 复位失败

更改软件定时器的定时超时时间            
BaseType_t xTimerChangePeriod(TimerHandle_t xTimer,const TickType_t xNewPeriod,const TickType_t xTicksToWait);
参数:待更改软件定时器的句柄,新的定时超时时间,发送命令到软件定时器命令队列的等待时间
返回值:pdPASS 复位成功,pdFAIL 复位失败

删除软件定时器        
BaseType_t xTimerDelete(TimerHandle_t xTimer,const TickType_t xTicksToWait);
参数:待删除软件定时器的句柄,发送命令到软件定时器命令队列的等待时间
返回值:pdPASS 删除成功,pdFAIL 删除失败

软件定时器实验

//freertos_demo.c

#include "freertos_demo.h"
#include "./SYSTEM/usart/usart.h"
#include "./BSP/LED/led.h"
#include "./BSP/LCD/lcd.h"
#include "./BSP/KEY/key.h"
#include "./SYSTEM/delay/delay.h"
#include "./MALLOC/malloc.h"
/*FreeRTOS******************************************************************************/
#include "FreeRTOS.h"
#include "task.h"
#include "timers.h"

/************************************************************************************/
/*FreeRTOS配置*/

/* START_TASK 任务 配置
 * 包括: 任务句柄 任务优先级 堆栈大小 创建任务
 */
#define START_TASK_PRIO      1
#define START_TASK_STACK_SIZE 128
TaskHandle_t  start_task_handler;
void start_task(void * pvParameters);

/* TASK1 任务 配置
 * 包括: 任务句柄 任务优先级 堆栈大小 创建任务
  */
  
#define TASK1_PRIO      2
#define TASK1_STACK_SIZE 128
TaskHandle_t  task1_handler;
 void task1(void* pv);
 
 void time1_callback(TimerHandle_t pxTimer);     //申明单次定时器1
 void time2_callback(TimerHandle_t pxTimer);     //申明周期定时器2
/***************************************************************************************/


/**
 * @brief       FreeRTOS例程入口函数
 * @param       无
 * @retval      无
 */
void freertos_demo(void)
{    
    xTaskCreate((TaskFunction_t    )    start_task,         //创建开始任务
                (char*             )    "start_task", 
                (unsigned portSHORT)    START_TASK_STACK_SIZE, 
                (void *            )    NULL, 
                (portBASE_TYPE     )    START_TASK_PRIO, 
                (TaskHandle_t*     )    &start_task_handler );
    vTaskStartScheduler();
}

TimerHandle_t timer1_handle = 0;        //定义单次定时器
TimerHandle_t timer2_handle = 0;        //定义周期定时器
void start_task(void* pvPara)
{
    taskENTER_CRITICAL();         //进入临界区

    //创建单次定时器
     timer1_handle = xTimerCreate( "timer1", 1000,pdFALSE,(void*)1,time1_callback);//定时器名字,超时周期,单次定时器,ID,回调函数
                                    
    //创建周期定时器
     timer2_handle = xTimerCreate( "timer2", 1000,pdTRUE,(void*)2,time2_callback);//定时器名字,超时周期,周期定时器,ID,回调函数

    xTaskCreate((TaskFunction_t    )    task1,              //创建任务一
                (char*             )    "task1", 
                (unsigned portSHORT)    TASK1_STACK_SIZE, 
                (void *            )    NULL, 
                (portBASE_TYPE     )    TASK1_PRIO, 
                (TaskHandle_t*     )    &task1_handler );
                
                
    vTaskDelete(NULL);              //删除start_task任务
    taskEXIT_CRITICAL();            //退出临界区
}


//任务一 按键扫描并控制软件定时器
void task1(void* pv)
{
    uint8_t key = 0;
    while(1)
    {
        key = key_scan(0);
        if(key == KEY0_PRES)
        {
            xTimerStart(timer1_handle,portMAX_DELAY);    //开启定时器1
            xTimerStart(timer2_handle,portMAX_DELAY);    //开启定时器2
        }else if(key == KEY1_PRES)
        {
            xTimerStop(timer1_handle,portMAX_DELAY);   //暂停定时器1
            xTimerStop(timer2_handle,portMAX_DELAY);   //暂停定时器2
        }
        vTaskDelay(10);
    }
}

//time1的超时回调函数
void time1_callback(TimerHandle_t pxTimer)
{
    static uint32_t timer = 0;      //加静态是避免每次进入都初始化一遍
    printf("time1的允许次数:%d\r\n",++timer);
}

//time2的超时回调函数
void time2_callback(TimerHandle_t pxTimer)  //注意里面不能有延时阻塞函数
{
    static uint32_t timer = 0;      //加静态是避免每次进入都初始化一遍
    printf("time2的允许次数:%d\r\n",++timer);
}


http://lihuaxi.xjx100.cn/news/1920473.html

相关文章

oracle下载

前言: 官网上提供都是最新的什么19c 21c这些版本,我要的是 11g 12c 或者更老的 8i 9i 这些版本。 准备下载一个oracle12c 版本,但是找了很久,最终…详情请看下面 oracle 数据库版本介绍 Oracle数据库有多个长期支持版本&#x…

JAVA 如何实现多个资源服务器的同步?

在实现多个资源服务器的同步时,我们可以使用Java中的一些技术和工具。以下是一种可能的实现方式: 明确资源服务器同步的需求。假设我们有三个资源服务器,每个服务器上都存储了一些数据,我们需要确保这些数据在所有服务器上都是一…

兔子的序列

题目: 输入描述: 第一行一个整数 n,表示序列的长度。 第二行有 n 个整数 ai,表示序列中的 n 个数分别是多少。 输出描述: 输出仅一行,表示这个序列的名字,也就是这个序列中最大的非完全平方…

flutter flutter pub cache clean和flutter clean区别

flutter pub cache clean 和 flutter clean 是 Flutter 开发中两个不同的命令,它们的作用和使用场景有所不同。 flutter pub cache clean:这个命令用于清理 Flutter 的包缓存。在使用 Flutter 进行开发时,会下载和缓存一些第三方依赖包&#…

Linux压缩算法-zstd

文章目录 概述:ZSTD压缩算法介绍:ZSTD压缩算法下载:ZSTD压缩算法编译:1、ubuntu(gcc编译):1.1、直接编译:1.2、编译库文件: 2、arm(交叉编译库文件&#xff0…

【MYSQL】MYSQL 的学习教程(十)之 InnoDB 锁

数据库为什么需要加锁呢? 如果有多个并发请求存取数据,在数据就可能会产生多个事务同时操作同一行数据。如果并发操作不加控制,不加锁的话,就可能写入了不正确的数据,或者导致读取了不正确的数据,破坏了数…

【开源】基于JAVA的智能教学资源库系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 课程档案模块2.3 课程资源模块2.4 课程作业模块2.5 课程评价模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 课程档案表3.2.2 课程资源表3.2.3 课程作业表3.2.4 课程评价表 四、系统展示五、核心代…

3D换肤在服装行业的应用

在线工具推荐: 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 通过采用高质量的 3D 模型,企业可以提供更加身临其境的体…