freeRTOS总结(十五)软件定时

1,软件定时器的简介(了解)

定时器:
从指定的时刻开始,经过一个指定时间,然后触发一个超时事件,用户可自定义定时器的周期
硬件定时器:
芯片本身自带的定时器模块,硬件定时器的精度一般很高,每次在定时时间到达之后就会自动触发一个中断,用户在中断服务函数中处理信息。
软件定时器:
是指具有定时功能的软件,可设置定时周期,当指定时间到达后要调用回调函数(也称超时函数),用户在回调函数中处理信息

软件定时器优缺点
优点:
硬件定时器数量有限,而软件定时器理论上只需有足够内存,就可以创建多个;
使用简单、成本低
缺点:
软件定时器相对硬件定时器来说,精度没有那么高(因为它以系统时钟为基准,系统时钟中断优先级又是最低,容易被打断)。 对于需要高精度要求的场合,不建议使用软件定时器。

FreeRTOS软件定时器特点
可裁剪: 软件定时器是可裁剪可配置的功能, 如果要使能软件定时器,需将configUSE_TIMERS 配置项配置成 1
单次和周期: 软件定时器支持设置成:单次定时器或周期定时器
注意:软件定时器的超时回调函数是由软件定时器服务任务调用的,软件定时器的超时回调函数本身不是任务,因此不能在该回调函数中使用可能会导致任务阻塞的 API 函数。
软件定时器服务任务作用:
1、负责软件定时器超时的逻辑判断
2、调用超时软件定时器的超时回调函数
3、处理软件定时器命令队列
软件定时器的命令队列
FreeRTOS 提供了许多软件定时器相关的 API 函数,这些 API 函数大多都是往定时器的队列中写入消息(发送命令),这个队列叫做软件定时器命令队列,是提供给 FreeRTOS 中的软件定时器使用的,用户是不能直接访问的
在这里插入图片描述

软件定时器的相关配置
当FreeRTOS 的配置项 configUSE_TIMERS 设置为1,在启动任务调度器时,会自动创建软件定时器的服务/守护任务prvTimerTask( ) ;
软件定时器服务任务的优先级为 configTIMER_TASK_PRIORITY = 31;
定时器的命令队列长度为 configTIMER_QUEUE_LENGTH = 5 ;
注意:软件定时器的超时回调函数是在软件定时器服务任务中被调用的,服务任务不是专为某个定时器服务的,它还要处理其他定时器。
所以,定时器的回调函数不要影响其他“人”:
1、回调函数要尽快实行,不能进入阻塞状态,即不能调用那些会阻塞任务的 API 函数,如:vTaskDelay() ;
2、访问队列或者信号量的非零阻塞时间的 API 函数也不能调用。

2,软件定时器的状态(熟悉)

软件定时器共有两种状态:
休眠态: 软件定时器可以通过其句柄被引用,但因为没有运行,所以其定时超时回调函数不会被执行
运行态: 运行态的定时器,当指定时间到达之后,它的超时回调函数会被调用
注意:新创建的软件定时器处于休眠状态 ,也就是未运行的!
问题:如何让软件定时器从休眠态转变为运行态?
发送命令队列
FreeRTOS 提供了两种软件定时器:
单次定时器:单次定时器的一旦定时超时,只会执行一次其软件定时器超时回调函数,不会自动重新开启定时,不过可以被手动重新开启。
周期定时器:周期定时器的一旦启动以后就会在执行完回调函数以后自动的重新启动 ,从而周期地执行其软件定时器回调函数。

在这里插入图片描述
Timer1:周期定时器,定时超时时间为 2 个单位时间,开启后,一直以2个时间单位间隔重复执行;
Timer2:单次定时器,定时超时时间为 1 个单位时间,开启后,则在第一个超时后就不在执行了。

软件定时器的状态转换图(熟悉)
单次定时器状态转换图:
在这里插入图片描述
周期定时器状态转换图:
在这里插入图片描述

4,软件定时器结构体成员介绍(熟悉)

 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		/*  软件定时器的编号,调试用  */#endifuint8_t 						ucStatus;                     		/*  软件定时器的状态  */} xTIMER;

5, FreeRTOS软件定时器相关API函数(熟悉)

在这里插入图片描述

5.1,创建软件定时器API函数

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

在这里插入图片描述
在这里插入图片描述

5.2,开启软件定时器API函数

BaseType_t   xTimerStart( 	TimerHandle_t 	xTimer,				const TickType_t 	xTicksToWait  ); 

在这里插入图片描述
在这里插入图片描述

5.3,停止软件定时器API函数

BaseType_t   xTimerStop(  TimerHandle_t 	xTimer,				const TickType_t 	xTicksToWait); 

在这里插入图片描述
在这里插入图片描述

5.4,复位软件定时器API函数

BaseType_t  xTimerReset( TimerHandle_t 	xTimer,				const TickType_t 	xTicksToWait); 

该功能将使软件定时器的重新开启定时,复位后的软件定时器以复位时的时刻作为开启时刻重新定时
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.5,更改软件定时器超时时间API函数

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

在这里插入图片描述
在这里插入图片描述

6,FreeRTOS软件定时器实验(掌握)

1、实验目的:学习 FreeRTOS 的软件定时器相关API函数的使用 。
2、实验设计:将设计两个任务:start_task、task1
两个任务的功能如下:
start_task 用来创建task1任务,并创建两个定时器(单次和周期)
task1 :用于按键扫描,并对软件定时器进行开启、停止操作


#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 "event_groups.h"
/******************************************************************************************************/
/*FreeRTOS配置*//* START_TASK 任务 配置* 包括: 任务句柄 任务优先级 堆栈大小 创建任务*/
/* TASK1 任务 配置* 包括: 任务句柄 任务优先级 堆栈大小 创建任务*/#define START_TASK_PRIO         1
#define START_TASK_STACK_SIZE   128
TaskHandle_t    start_task_handler;
void start_task( void * pvParameters );#define TASK1_PRIO         2
#define TASK1_STACK_SIZE   128
TaskHandle_t  task1_handler;
void task1( void * pvParameters );void timer1_callback(TimerHandle_t pxTimer);
void timer2_callback(TimerHandle_t pxTimer);TimerHandle_t timer1_handle=0;
TimerHandle_t timer2_handle=0;
/*** @brief       FreeRTOS例程入口函数* @param       无* @retval      无*/void freertos_demo(void)
{ xTaskCreate((TaskFunction_t) start_task,(char *)	"start_task",(configSTACK_DEPTH_TYPE) START_TASK_STACK_SIZE,(void *) NULL,(UBaseType_t) START_TASK_PRIO,(TaskHandle_t *)&start_task_handler);//开启任务调度vTaskStartScheduler();}
void start_task( void * pvParameters )
{taskENTER_CRITICAL();               /* 进入临界区  任何任务和中断都不能打断当前程序运行*/timer1_handle= xTimerCreate("timer1",500,pdFALSE,(void *)1,timer1_callback);timer2_handle= xTimerCreate("timer2",2000,pdTRUE,(void *)2,timer2_callback);xTaskCreate((TaskFunction_t) task1,(char *)	"task1",(configSTACK_DEPTH_TYPE) TASK1_STACK_SIZE,(void *) NULL,(UBaseType_t) TASK1_PRIO,(TaskHandle_t *)&task1_handler	);vTaskDelete(NULL);//删除当前任务也就是开始任务taskEXIT_CRITICAL();}
/* 任务一,用于扫描按键,当KEY0按下,发送任务通知值 */
void task1( void * pvParameters )
{uint8_t key;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);}}
void timer1_callback(TimerHandle_t pxTimer)
{static uint32_t timer = 0;printf("timer1的运行次数:%d\r\n",++timer);}void timer2_callback(TimerHandle_t pxTimer)
{static uint32_t timer = 0;printf("timer2的运行次数:%d\r\n",++timer);}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用dbeaver导入Excel到mysql数据库

最近业务需要将Excel导入到mysql数据库中,之前一直用的heisql,但是heidisql的导入功能太弱了,后来用了dbeaver,功能很强大。 一、安装dbeaver 首先去官网下载dbeaver社区版,社区版免费:dbeaver.io/ dbea…

3.2-媒资管理之MinIo分布式文件系统+上传图片

媒资管理 3 分布式文件系统 3.1 什么是分布式文件系统 要理解分布式文件系统首先了解什么是文件系统。 查阅百度百科: 文件系统是负责管理和存储文件的系统软件,操作系统通过文件系统提供的接口去存取文件,用户通过操作系统访问磁盘上的文…

JavaScript基础第三天

JavaScript 基础第三天 今天我们学习for循环、while循环、终止循环和无限循环。 1. for 循环 1.1. 语法 // 1. 语法格式 // for(起始值; 结束条件; 累加器) { // // 要重复执行的代码 // }1.2. 示例代码 let sum 0; for (let i 0; i < 100; i) {sum i; } alert(&q…

jsp康养小镇管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP康养小镇管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&a…

[超分辨率重建]ESRGAN算法训练自己的数据集过程

一、下载数据集及项目包 1. 数据集 1.1 文件夹框架的介绍&#xff0c;如下图所示&#xff1a;主要有train和val&#xff0c;分别有高清&#xff08;HR&#xff09;和低清&#xff08;LR&#xff09;的图像。 1.2 原图先通过分割尺寸的脚本先将数据集图片处理成两个相同的图像…

JavaScript中call、apply、bind方法的应用与区别

在JavaScript中&#xff0c;call、apply和bind是函数的三个重要方法&#xff0c;它们虽然功能不同&#xff0c;但都可以用来改变函数的执行上下文或者传递参数。本文将分别介绍call、apply和bind方法的应用和区别&#xff0c;并附带示例代码。 一、call方法 call方法的作用是…

Spring GateWay

概述简介 能干什么 反向代理 鉴权 流量控制 熔断 日志监控 Spring Cloud Gateway 与Zuul的区别 在SpringCloud Finchley正式版之前&#xff0c;Spring Cloud推荐的网关是 Netflix提供的Zuul: 1、Zuul 1.x&#xff0c;是一个基于阻塞Ⅳ/O的APl Gateway 2、Zuul 1.x基于Servl…

如何保持mac苹果电脑系统在最佳状态?不卡顿

苹果电脑一直以其卓越的性能和用户友好的操作系统而备受欢迎。然而电脑上的文件、应用程序和缓存可能会逐渐积累&#xff0c;导致性能下降。为了确保你的苹果电脑保持最佳状态&#xff0c;高效清理是至关重要的一步。在本文中&#xff0c;我们将分享一些如何清理苹果电脑更高效…

npm 上传一个自己的应用(1) 搭建一个项目环境

上文 在npm官网中注册一个账号并登录 带着大家创建了一个npm账号 我们先登录官网 然后 我们在自己电脑中创建一个文件夹 这个文件夹叫什么没有太大所谓 我这里直接叫 grnpmtext 然后 我们在这个文件夹中初始化一个项目 终端输入 npm initpackage name 要我们输入项目的名称 …

Java项目使用jasypt加密和解密配置文件中关键信息

一、使用背景 项目中application.yml 配置文件中&#xff0c;如数据库、redis、加密算法的私钥等各种配置的username&#xff0c;password的值都是明文的&#xff0c;其实存在一定的安全隐患&#xff0c;如果被人拿到这些配置文件&#xff0c;将直接对系统安全构成极大威胁&…

imgaug数据增强神器:增强器一览

官网&#xff1a;imgaug — imgaug 0.4.0 documentationhttps://imgaug.readthedocs.io/en/latest/ github:GitHub - aleju/imgaug: Image augmentation for machine learning experiments. imgaug数据增强神器&#xff1a;增强器一览_iaa 图像增强改变颜色-CSDN博客文章浏览阅…

Python环境下基于最大离散重叠小波变换和支持向量回归的金融时间序列预测

金融时间序列具有非线性、高频性、随机性等特点&#xff0c;其波动情况不仅与当前股票市场、房地产市场、贸易市场等有强联动性&#xff0c;而且大幅度起伏对于其他市场有较大的影响和冲击。由于金融市场受多种因素影响且各影响因素间也存在一定复杂动态交互关系&#xff0c;导…

开源项目的三年,我的项目经历了哪些变化?

0.前言 自己一个项目写了三年&#xff0c;到底写了什么东西了&#xff0c;这个项目经历了哪些变化呢&#xff1f;其中的心路历程如何&#xff1f; 兄弟们&#xff0c;要是感觉我的项目有价值&#xff0c;去b站给俺点点关注呐。我更新的更快。点击下面的了解就可以跳转去b站。…

我的docker随笔43:问答平台answer部署

本文介绍开源问答社区平台Answer的容器化部署。 起因 笔者一直想搭建一个类似stack overflower这样的平台&#xff0c;自使用了Typora&#xff0c;就正式全面用MarkdownTyporagit来积累自己的个人知识库&#xff0c;但没有做到web化&#xff0c;现在也还在探索更好的方法。 无…

Spring + Tomcat项目中nacos配置中文乱码问题解决

实际工作的时候碰到了nacos中文乱码的问题&#xff0c;一顿排查最终还是调源码解决了。下面为具体的源码流程&#xff0c;有碰到的可以参考下。 对于nacos配置来说&#xff0c;初始主要源码就在NacosConfigService类中。里面有初始化获取配置content以及设置对应监听器的操作。…

配备Apple T2 安全芯片的 Mac 机型及T2芯片mac电脑U盘装系统教程

T2 芯片为 Mac 提供了一系列功能&#xff0c;例如加密储存和安全启动功能、增强的图像信号处理功能&#xff0c;以及适用于触控 ID 数据的安全保护功能。哪些电脑配备了 T2 安全芯片呢&#xff0c;T2芯片mac电脑又如何重装系统呢&#xff1f;跟随小编一起来看看吧&#xff01; …

集群及LVS简介、LVSNAT模式原理、LVSNAT模式配置、LVSDR模式原理、LVSDR模式配置、LVS错误排查

集群 将很多机器组织到一起&#xff0c;作为一个整体对外提供服务 集群在扩展性、性能方面都可以做到很灵活 集群分类&#xff1a; 负载均衡集群&#xff1a;Load Balance高可用集群&#xff1a;High Availability高性能计算&#xff1a;High Performance Computing LVS LVS…

6-3、T型加减速单片机程序【51单片机+L298N步进电机系列教程】

↑↑↑点击上方【目录】&#xff0c;查看本系列全部文章 摘要&#xff1a;根据前两节内容&#xff0c;已完成所有计算工作&#xff0c;本节内容介绍具体单片机程序流程及代码 一、程序流程图 根据前两节文章内容可知&#xff0c;T型加减速的关键内容是运动类型的判断以及定时…

CPP项目:Boost搜索引擎

1.项目背景 对于Boost库来说&#xff0c;它是没有搜索功能的&#xff0c;所以我们可以实现一个Boost搜索引擎来实现一个简单的搜索功能&#xff0c;可以更快速的实现Boost库的查找&#xff0c;在这里&#xff0c;我们实现的是站内搜索&#xff0c;而不是全网搜索。 2.对于搜索…

qt/c++实现表情选择框

&#x1f482; 个人主页:pp不会算法^ v ^ &#x1f91f; 版权: 本文由【pp不会算法v】原创、在CSDN首发、需要转载请联系博主 &#x1f4ac; 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦 实现功能 。编解码的设计 。映射关系设计 。匹配机制设计 演示效…