FreeRTOS——软件定时器知识总结及其实战

1.软件定时器概念

是指具有定时功能的软件,可设置定时周期,当指定时间到达后要调用回调函数(也称超时函数),用户在回调函数中处理信息。

2 软件定时器使用特点

1)如果要使能软件定时器,需将configUSE_TIMERS 配置项配置成 1
2)软件定时器支持设置成:单次定时器或周期定时器
3)软件定时器的超时回调函数是由软件定时器服务任务调用的,软件定时器的超时回调函数本身不是任务,因此不能在该回调函数中使用可能会导致任务阻塞的 API 函数。

3 软件定时器服务任务

在调用函数 vTaskStartScheduler()开启任务调度器的时候,会创建一个用于管理软件定时器的任务,这个任务就叫做软件定时器服务任务。
其作用:
1、负责软件定时器超时的逻辑判断
2、调用超时软件定时器的超时回调函数
3、处理软件定时器命令队列
在这里插入图片描述

4软件定时器相关配置

1)当FreeRTOS 的配置项 configUSE_TIMERS 设置为1,在启动任务调度器时,会自动创建软件定时器的服务/守护任务prvTimerTask( ) ;
2)软件定时器服务任务的优先级为 configTIMER_TASK_PRIORITY = 31;
3)定时器的命令队列长度为 configTIMER_QUEUE_LENGTH = 5 ;

注意事项:软件定时器的超时回调函数是在软件定时器服务任务中被调用的,服务任务不是专为某个定时器服务的,它还要处理其他定时器。因此调用的回调函数不能被阻塞,要求如下:
1、回调函数要尽快实行,不能进入阻塞状态,即不能调用那些会阻塞任务的 API 函数,如:vTaskDelay()
2、访问队列或者信号量的非零阻塞时间的 API 函数也不能调用。

5软件定时器的状态

休眠态:当指定时间到达之后,但因为没有运行,所以其定时超时回调函数不会被执行。
运行态:运行态的定时器,当指定时间到达之后,它的超时回调函数会被调用。

注意:
刚创建的软件定时器处于休眠态

6 软件定时器的状态转换

在这里插入图片描述

7 软件定时器结构体

typedef    struct
    {
        const char * 					pcTimerName		 /* 软件定时器名字 */
        ListItem_t 					xTimerListItem		 /* 软件定时器列表项 */
        TickType_t 					xTimerPeriodInTicks;        	/* 软件定时器的周期 */     
        void * 						pvTimerID			 /* 软件定时器的ID */
        TimerCallbackFunction_t	 		pxCallbackFunction; 	/* 软件定时器的回调函数 */
        #if ( configUSE_TRACE_FACILITY == 1 )
         UBaseType_t 					uxTimerNumber		/*  软件定时器的编号,调试用  */
        #endif
        uint8_t 						ucStatus;                     		/*  软件定时器的状态  */
    } xTIMER;

8软件定时器API函数

在这里插入图片描述
1)创建软件定时器

TimerHandle_t   xTimerCreate(    const char * const   pcTimerName,				
                                 const TickType_t 	  xTimerPeriodInTicks,				
                                 const UBaseType_t 	    uxAutoReload,					
                                 void * const 			    pvTimerID,				
                                TimerCallbackFunction_t     pxCallbackFunction  ); 

形参:
pcTimerName :软件定时器名
xTimerPeriodInTicks:定时超时时间,单位:系统时钟节拍
uxAutoReload:定时器模式, pdTRUE:周期定时器, pdFALSE:单次定时器
pvTimerID:软件定时器 ID,用于多个软件定时器公用一个超时回调函数
pxCallbackFunction:软件定时器超时回调函数
返回值:
NULL 创建失败
其他 返回句柄,创建成功

2)开启软件定时器

BaseType_t   xTimerStart( 	TimerHandle_t 	xTimer,			
                            const TickType_t 	xTicksToWait  ); 

形参:
xTimer: 等待软件定时器句柄
xTicksToWait:发送命令到软件定时器命令队列的最大等待时间
返回值:
pdPASS 成功
pdFAIL 失败

3)停止软件定时器API函数

BaseType_t   xTimerStop(  TimerHandle_t 	xTimer,			
                          const TickType_t 	xTicksToWait);

形参:
xTimer: 软件定时器句柄
xTicksToWait:发送命令到软件定时器命令队列的最大等待时间
返回值:
pdPASS 成功
pdFAIL 失败

4)复位软件定时器

BaseType_t  xTimerReset( TimerHandle_t 	xTimer,				
                         const TickType_t 	xTicksToWait);

形参:
xTimer: 软件定时器句柄
xTicksToWait:发送命令到软件定时器命令队列的最大等待时间
返回值:
pdPASS 成功
pdFAIL 失败
注意:该功能将使软件定时器的重新开启定时,复位后的软件定时器以复位时的时刻作为开启时刻重新定时

5)更改软件定时器超时时间

BaseType_t  xTimerChangePeriod( TimerHandle_t 		xTimer,	
                                const TickType_t 	xNewPeriod, 
                                const TickType_t 	xTicksToWait); 				                                                                                              	          

形参:
xTimer: 软件定时器句柄
xNewPeriod: 新的定时超时时间,单位:系统时钟节拍
xTicksToWait:发送命令到软件定时器命令队列的最大等待时间
返回值:
pdPASS 成功
pdFAIL 失败

8软件定时器实战

在这里插入图片描述
代码:

#include "freertos_demo.h"
#include "./BSP/LCD/lcd.h"
#include "./BSP/KEY/key.h"
/*FreeRTOS*********************************************************************************************/
#include "FreeRTOS.h"
#include "task.h"
#include "timers.h"

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

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

/* TASK1 任务 配置
 * 包括: 任务句柄 任务优先级 堆栈大小 创建任务
 */
#define TASK1_PRIO      2                   /* 任务优先级 */
#define TASK1_STK_SIZE  128                 /* 任务堆栈大小 */
TaskHandle_t            Task1Task_Handler;  /* 任务句柄 */
void task1(void *pvParameters);             /* 任务函数 */

//定义定时器回调函数、与定时器句柄
TimerHandle_t timer1_handle = 0;        //单次定时器
TimerHandle_t timer2_handle = 0;        //周期定时器

void timer1_callback(TimerHandle_t pxTimer);
void timer2_callback(TimerHandle_t pxTimer);

/**
 * @brief       FreeRTOS例程入口函数
 * @param       无
 * @retval      无
 */
void freertos_demo(void)
{    
    xTaskCreate((TaskFunction_t )start_task,            /* 任务函数 */
                (const char*    )"start_task",          /* 任务名称 */
                (uint16_t       )START_STK_SIZE,        /* 任务堆栈大小 */
                (void*          )NULL,                  /* 传入给任务函数的参数 */
                (UBaseType_t    )START_TASK_PRIO,       /* 任务优先级 */
                (TaskHandle_t*  )&StartTask_Handler);   /* 任务句柄 */
    vTaskStartScheduler();
}

/**
 * @brief       start_task
 * @param       pvParameters : 传入参数(未用到)
 * @retval      无
 */
void start_task( void * pvParameters )
{
    taskENTER_CRITICAL();               /* 进入临界区 */
    
    // 定时器1创建为单次定时器 
    timer1_handle = xTimerCreate("timer1", 500, pdFALSE, (void *)1, timer1_callback);
                                    
    // 定时器2创建为周期定时器 
    timer2_handle = xTimerCreate( "timer2", 2000,pdTRUE, (void*)2, timer2_callback);
                                    
    xTaskCreate((TaskFunction_t         )   task1,
                (char *                 )   "task1",
                (configSTACK_DEPTH_TYPE )   TASK1_STK_SIZE,
                (void *                 )   NULL,
                (UBaseType_t            )   TASK1_PRIO,
                (TaskHandle_t *         )   &Task1Task_Handler );
                                             
    vTaskDelete(NULL);
    taskEXIT_CRITICAL();                /* 退出临界区 */
}

/**
 * @brief       task1
 * @param       pvParameters : 传入参数(未用到)
 * @retval      无
 */
//任务一、按键扫描并控制软件定时器
void task1(void *pvParameters)
{
    uint8_t key = 0;
    while(1)
    {
        key = key_scan(0);
        if(key == KEY0_PRES)
        {

            xTimerStart(timer1_handle,portMAX_DELAY);
            xTimerStart(timer2_handle,portMAX_DELAY);
        }
        else if(key == KEY1_PRES)
        {
            xTimerStop(timer1_handle,portMAX_DELAY);
            xTimerStop(timer2_handle,portMAX_DELAY);
        }
        vTaskDelay(10);
    }
}

/**
 * @brief       Timer1超时回调函数
 * @param       xTimer : 传入参数(未用到)
 * @retval      无
 */
//timer1的超时回调函数
void timer1_callback(TimerHandle_t pxTimer)
{
    static uint32_t timer = 0;
    printf("timer1的运行次数:%d\r\n",++timer);
}

/**
 * @brief       Timer2超时回调函数
 * @param       xTimer : 传入参数(未用到)
 * @retval      无
 */
void timer2_callback(TimerHandle_t pxTimer)
{
     static uint32_t timer = 0;
     printf("timer2的运行次数:%d\r\n",++timer);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/293865.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【XR806开发板使用】开发环境搭建、Hello工程以及开发事项

XR806开发板试用 很有幸能获得本次技术社区和全志组织的XR806开发板试用活动。之前开发的嵌入式应用都是在Windows平台上进行的,对于Linux下的开发并不熟悉,在社区里看到群友使用官方提供的docker环境进行开发,顺着群友的指导,找…

ROS学习笔记(11)进一步深入了解ROS第五步

0.前提 我在学习宾夕的ROS公开课的时候发现,外国的对计算机的教育和国内的是完全不一样的,当你接触了外国的课程后回头看自己学的会发现好像自己啥也没学。我这里可以放出来给大家看一下。 1.Python and C 2.Python PDB Tutorial:Python Deb…

产业认可 | 开源网安荣获 CCIA“2023 年度优秀会员单位”

​1月4日,“2023年度中国网络安全产业联盟成员大会暨理事会”在京召开,开源网安作为成员单位受邀出席本次大会。 在会上,联盟发布了关于2023年度表彰先进的决定,作为中国软件安全领域的创领者,开源网安在技术、实践和创…

计算机毕业设计-----ssm情缘图书馆管理系统

功能介绍 基于SSM的情缘图书馆管理系统。SSM框架,适合java初学者。 主要功能包括: 图书编目管理:图书编目、编目维护; 图书信息管理:图书录入、图书信息; 图书借阅管理:借阅图书、借阅信息…

OpenAI ChatGPT-4开发笔记2024-03:Chat之Function Calling/Function/Tool/Tool_Choice

Updates on Function Calling were a major highlight at OpenAI DevDay. In another world,原来的function call都不再正常工作了,必须全部重写。 function和function call全部由tool和tool_choice取代。2023年11月之前关于function call的代码都准备翘翘。 干嘛…

新耀莱要约收购接近尾声,此前共有4713万股接纳要约

新耀莱要约收购事件近期即将结束,引起了资本市场的广泛关注和讨论。作为曾经在汽车经销领域风光无限的企业,新耀莱如今面临衰退的结局,确实令人唏嘘。从财务数据的恶化到核心业务的萎靡,新耀莱的经营表现已无法令人乐观。而随着公司要约收购临近尾声,不少投资者都在担忧,新耀莱…

HTML5+CSS3小实例:文字涂抹动画

实例:文字涂抹动画 技术栈:HTML+CSS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><me…

后端开发——JDBC的学习(三)

本篇继续对JDBC进行总结&#xff1a; ①通过Service层与Dao层实现转账的练习&#xff1b; ②重点&#xff1a;由于每次使用连接就手动创建连接&#xff0c;用完后就销毁&#xff0c;这样会导致资源浪费&#xff0c;因此引入连接池&#xff0c;练习连接池的使用&#xff1b; …

太阳能组件紫外预处理试验箱

太阳能组件紫外预处理试验箱波长范围&#xff1a;280-400nm用于太阳能光伏组件的温湿度及相类似紫外预处理环境的试验&#xff0c;主要用于太阳能组件材料评估诸如聚合物和保护层等材料抗紫外辐照能力&#xff0c;在预处理试验过程中能够快速、真实地再现阳光、雨、露等环境及对…

Etcd安装以及操作

Etcd介绍 etcd 是一个高度一致的分布式键值 (key-value) 存储&#xff0c;它提供了一种可靠的方式来存储需要由分布式系统或机器集群访问的数据。它可以优雅地处理网络分区期间的领导者选举&#xff0c;即使在 领导者节点中也可以容忍机器故障。 etcd 是用 Go 语言编写的&a…

Spring MVC响应结合RESTful风格开发,打造具有强大功能和良好体验的Web应用!

响应与Rest风格 1.11.1.1 环境准备步骤1:设置返回页面步骤2:启动程序测试 1.1.2 返回文本数据步骤1:设置返回文本内容步骤2:启动程序测试 1.1.3 响应JSON数据响应POJO对象响应POJO集合对象 知识点1&#xff1a;ResponseBody 2&#xff0c;Rest风格2.1 REST简介2.2 RESTful入门案…

Linux上搭建YApi

YApi是http接口管理和测试的重要工具&#xff0c;其作用相当于原来用的postman&#xff0c;但是比postman有更多的功能&#xff0c;本篇文章主要介绍如何在linux环境中快速的安装&#xff08;利用yum命令安装&#xff09;和部署YApi 一、nodejs 安装 1.1 下载nodejs包 yum i…

iPaaS与ETL:了解它们的主要区别

平均每个组织使用 130 多个应用程序&#xff0c;这一数字同比增长 30%。 随着公司试图充分利用其不断增长的应用程序生态系统&#xff0c;他们已经转向可以集成它们和/或其数据的工具。两个常用选项包括集成平台即服务 &#xff08;iPaaS&#xff09; 和提取、传输、加载 &…

pytorch08:学习率调整策略

目录 一、为什么要调整学习率&#xff1f;1.1 class _LRScheduler 二、pytorch的六种学习率调整策略2.1 StepLR2.2 MultiStepLR2.3 ExponentialLR2.4 CosineAnnealingLR2.5 ReduceLRonPlateau2.6 LambdaLR 三、学习率调整小结四、学习率初始化 一、为什么要调整学习率&#xff…

宝宝洗衣机哪个牌子质量好?好用的小型洗衣机推荐

当婴儿的到来&#xff0c;确实会给家庭带来许多变化&#xff0c;就好比如对于宝宝相关衣物的清洗需求。对于新生儿及婴幼儿的衣服&#xff0c;一般都要给予特殊的照顾与清洗&#xff0c;以保证不含细菌及过敏原。尤其是刚刚出生的婴儿&#xff0c;这时候宝宝们的皮肤很是幼嫩。…

JAVA基础学习笔记-day12-泛型

JAVA基础学习笔记-day12-泛型 1. 泛型概述1.1 泛型的引入 2. 使用泛型举例2.1 集合中使用泛型2.2 相关使用说明 3. 自定义泛型结构3.1 泛型的基础说明3.2 自定义泛型类或泛型接口3.2.1 说明3.2.2 注意 3.3 自定义泛型方法3.3.1 说明 4. 泛型在继承上的体现5. 通配符的使用5.1 通…

MySQL面试题汇总

常规&#xff1a; 1、数据库三大范式 1NF : 表中字段的数据不可再拆分。(原子性)2NF : 在满足第一范式的情况下&#xff0c;遵循唯一性&#xff0c;消除部分依赖。即&#xff0c;表中任意一个主键或任意一组联合主键&#xff0c;可以确定除该主键外的所有的非主键值。(一个表…

(适趣AI)Vue笔试题

&#x1f4d1;前言 本文主要是【Vue】——&#xff08;适趣AI&#xff09;Vue笔试题的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 …

Android studio报错误提示 Some Kotlin libraries attached to this project 问题解决方案

前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下"通俗易懂&#xff0c;风趣幽默"&#xff0c;感觉非常有意思,忍不住分享一下给大家。 &#x1f449;点击跳转到教程 Android新建项目后&#xff0c;报以下错误 错误提示内容为&#xff1a; 这个项目附带的一…

pygame学习(二)——绘制线条、圆、矩形等图案

导语 pygame是一个跨平台Python库(pygame news)&#xff0c;专门用来开发游戏。pygame主要为开发、设计2D电子游戏而生&#xff0c;提供图像模块&#xff08;image&#xff09;、声音模块&#xff08;mixer&#xff09;、输入/输出&#xff08;鼠标、键盘、显示屏&#xff09;模…