FreeRTOS_定时器

news2024/9/22 13:25:25

定时器概述

定时器运行过程

定时器就像一个闹钟,它有超时时间、函数、是否为周期性这三个部分。

  • 超时时间:什么时候到时间,就像闹钟响起
  • 函数:闹钟响起,要干什么
  • 是否为周期性:这个闹钟只响一次(单次触发)还是每天都响(周期性触发) 

定时器的简化运行过程如下图:

  • (t1)使用定时器,需要先创建一个定时器,创建时会规定以上的三个部分,但这时定时器并不会开始计时。
  • (t2)之后需要开启定时器,并基于该时刻进行计时。
  • (t2->t3过程)FreeRTOS有一个tick中断,每次进入中断,都会在中断中判断是否有定时器超时,如果超时就进行定时器的触发。
  • (t3)当定时器触发之后,会唤醒一个任务(守护任务)来去执行创建定时器时传入的函数。至此一次定时完成,如果设置为了周期性触发,之后就会重复上述过程,如果设置为单次触发,之后将不会再触发。

定时器的状态转换

定时器只有两种状态:Dormant(休眠态)、Running(运行态),下面是定时器的状态转换过程

  • 当创建定时器时,定时器进入的是休眠态,这时定时器不进行计时。
  • 当开启定时器、复位定时器、重置定时器周期时,定时器从休眠态转换到了运行态,这时定时器开始计时。
  • 当计时完成之后,如果是单次触发,定时器就会进入休眠态,不再计时;如果是周期性触发,定时器保持运行态,继续计时、触发。
  • 除此之外,在定时器运行态时,也可以调用关闭定时器函数,来让定时器从运行态转为休眠态

定时器相关函数的实质

在上述的状态转换过程中,调用了很多的定时器相关的函数。这些函数实质是将一些命令发送给定时器命令队列,之后守护任务不再阻塞并读取定时器命令队列,根据这些命令执行相应的操作。具体的交互模型如下:

相关配置

在使用定时器相关函数之前,需要打开红开关,具体操作如下:

相关函数

创建定时器

函数声明如下:

TimerHandle_t xTimerCreate( const char * const pcTimerName, 
                            const TickType_t xTimerPeriodInTicks,
                            const BaseType_t xAutoReload,
                            void * const pvTimerID,
                            TimerCallbackFunction_t pxCallbackFunction )

返回值:定时器句柄

pcTimerName:名字

xTimerPeriodInTicks:周期

xAutoReload:单次触发(pdFALSE)、周期性触发(pdTRUE)

pvTimerID:可写NULL

pxCallbackFunction:回调函数 

启动定时器

/* 这是一个宏,开启定时器 */
xTimerStart( xTimer, xTicksToWait )

/* 宏定义 */
#define xTimerStart( xTimer, xTicksToWait )               \
        xTimerGenericCommand( ( xTimer ),                 \
                              tmrCOMMAND_START,           \
                              ( xTaskGetTickCount() ),    \ 
                              NULL,                       \
                              ( xTicksToWait ) )          \

/* 实际调用函数 */
BaseType_t xTimerGenericCommand( TimerHandle_t xTimer,
                                 const BaseType_t xCommandID,
                                 const TickType_t xOptionalValue,
                                 BaseType_t * const pxHigherPriorityTaskWoken,
                                 const TickType_t xTicksToWait )

xTimer:定时器句柄

xTicksToWait:超时,有超时是因为函数实质是发送指令给队列

验证实验

实验内容为:开启定时器,每0.1s翻转一次变量值,用逻辑分析仪来查看变量状态。

具体代码实现如下:

/* 定时器回调函数 */
/* 这里面不用在while(1)中跑 */
char i;
void TimFun( TimerHandle_t xTimer ){
    i = !i;
}

int main( void )
{
	TimerHandle_t xTimeHandle_Test;/* 定时器句柄 */
	
	prvSetupHardware();
	SerialPortInit();
	printf("UART TEST\r\n");
	
	/* 创建定时器,周期为100*1ms = 0.1s */
	xTimeHandle_Test = xTimerCreate("time",100,pdTRUE,NULL,TimFun);
	/* 开启定时器 */
	xTimerStart(xTimeHandle_Test,0);

	xTaskCreate(TaskAFunction,"TaskA",100,(void*)NULL,2,NULL);/* taskA空跑while(1) */
	
	vTaskStartScheduler();
	
	//xTimerStart
	return 0;
}

运行结果如下:

可以看到,变量i每隔0.1s进行了一次翻转,由于taskA空跑while(1),说明守护任务与TaskA是相互独立的。

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

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

相关文章

杭州高校大学智能制造实验室数字孪生可视化系统平台建设项目验收

杭州高校大学智能制造数字孪生技术作为智能制造的重要支撑,通过构建虚拟世界的镜像,实现对物理世界的实时监控、预测和优化。杭州高校大学智能制造实验室数字孪生可视化系统平台建设项目,旨在通过引入先进的数字孪生技术,构建一个…

刚刚,Claude国内可直连!

刚刚,Claude国内可直连! 大家好!我是科技博主Maynor。今天我们要分享一个激动人心的消息:知名AI助手Claude现在可以在国内直接访问了! 这对于科技爱好者、学生、研究人员和各行各业的专业人士来说都是一个重大利好。…

进嵌入式公司当学徒没工资去不去啊?

在开始前分享一些嵌入式资料需要的同学评论888即可拿走 是我根据网友给的问题精心整理的 嵌入式是做技术岗位。技术不到位,没有人会要你。技术都没有,还要你的,一定是骗子。记住这句话就行了。 世上哪有那么好的事情。能免费让你学到真正有…

线性代数|机器学习-P24加速梯度下降(动量法)

文章目录 1. 概述2. 引入3. 动量法梯度下降 1. 概述 我们之前学的最速梯度下降[线搜索方法] 公式如下: x k 1 x k − s k ∇ f ( x k ) \begin{equation} x_{k1}x_k-s_k\nabla f(x_k) \end{equation} xk1​xk​−sk​∇f(xk​)​​ 但对于这种方法来说&#xff…

debian固定ip

debian固定ip 前言 安装好的Debian系统后,为了确保每次登陆的ip不变,需要固定 方法 命令如下 ip addr | grep inet因为有有线网和无线网 2 种连接方式,因此需要区别。 其中 enp 的是有线,wlp 的是无线 查看网关 IP 命令如下 …

蓝牙BLE广播

这里只讨论蓝牙BLE广播 这部分可以看蓝牙标准Core Specification V5.3的卷3 Host part C。当然广播参数那一块和“控制器”层有关,只需要了解广播参数的含义和设置方法就行,控制器的细节不太容易理解。 主要目标 广播参数(广播间隔、TX 功…

MySQL学习记录 —— 이십일 MySQL服务器配置与管理(1)

文章目录 1、配置和默认值2、系统变量和选项1、介绍2、常用选项3、使用系统变量 3、常用服务器配置4、查看状态变量5、MySQL数据目录 mysql的服务端就是mysqld,d就是daemon,守护进程的意思。 配置文件中[mysqld]部分时服务器支持的启动选项。服务器的部…

flv文件转换成mp4?这四种转换方法肯定可以帮到你!

flv文件转换成mp4?FLV格式曾一度以其独特的地位,为视频传输领域注入了新的活力,然而,随着时间的流逝和技术的进步,这种格式也出现了很多问题,其最大的困扰在于兼容性的局限,尽管在某些特定场合下…

客户管理必备:快速学会群发微信信息新技能!

当我们用微信向客户传递祝福、福利等重要信息时,随着微信好友人数不断增加,在微信里挑选好友发送信息,既费时又费力,还容易因个人疏忽导致重要客户遗漏。 为了有效地解决上述问题,企业可以借助微信管理系统中群发管理功…

卸载wps office的几种方法收录

​ 第一种方法: 1.打开【任务管理器】,找到相关程序,点击【结束任务】。任务管理器可以通过左下角搜索找到。 2.点击【开始】-【设置】-【应用】-下拉找到WPS应用,右键卸载,不保留软件配置 …

不会用电子商务知识库?五项基本方法让你业务增长100%

电子商务公司正努力增加利润并减少支出。该行业正在不断发展,预计到 2040 年,95% 的所有购买行为都将通过电子商务进行。话虽如此,竞争依然激烈——95% 的客户表示,客户服务是决定是否与公司开展业务的关键因素。在购买过程中更快…

tomcat搭建

目录 1 Tomcat简介 2 Tomcat安装 2.1 安装JDK 2.2 安装Tomcat 3 Tomcat目录结构 3.1 tomcat主目录介绍 3.2 Tomcat配置文件目录介绍 3.3 Tomcat web管理功能 1 Tomcat简介 Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta 项目中的一个…

1985年-2020年中国历年私人汽车保有量统计报告

数据来源于国家统计局,为1985年到2020年中国每年私人汽车拥有量(包括客车、货车和其他汽车)。2020年,中国私人汽车拥有量为2.43亿辆。 数据统计单位为:万辆 数据说明: 私人汽车包括私人载客汽车和私人载…

如何预防最新的baxia变种勒索病毒感染您的计算机?

引言 在当今数字化时代,网络安全威胁层出不穷,其中勒索病毒已成为企业和个人面临的重大挑战之一。近期,.baxia勒索病毒以其高隐蔽性和破坏性引起了广泛关注。本文将详细介绍.baxia勒索病毒的特点、传播方式,并给出相应的应对策略…

超时导致SparkContext构造失败的问题探究

文章目录 1.前言2. 基于事故现场对问题进行分析2.1 日志分析2.2 单独测试Topology代码试图重现问题 3. 源码解析3.1 Client模式和Cluster模式下客户端的提交和启动过程客户端提交时在两种模式下的处理逻辑ApplicationMaster启动时在两种模式下的处理逻辑 3.2 两种模式下的下层角…

谷粒商城P85发布商品时规格参数不显示问题

P85讲,发布商品,点击下一步之后,发现规格参数不显示 打开控制台发现报错forEach...错误 查了问题原因,发现返回的分组中个别组的关联属性(attrs)可能为null 所以这个时候,需要确保后端返回的attrs不能为null 方式1…

【可视化大屏系列】Echarts之饼图绘制

本文为个人近期学习总结,若有错误之处,欢迎指出! Echarts之饼图绘制 前言1.需求2.实现效果3.大概思路4.代码实现子组件写法父组件写法5.附加(1)圆环饼图的绘制(2)南丁格尔玫瑰饼图A.半径展示数据的大小B.面积展示数据的大小前言 在前文页面布局、DataV 的使用、Echarts…

低代码:企业数字化转型的核心工具

在全球数字化浪潮风起云涌的当下,企业面临着前所未有的市场挑战与内部需求变化,急需以更快速、更灵活的方式响应。在这一关键时期,JNPF快速开发平台以其卓越的性能和广泛的功能覆盖,逐渐成为企业数字化转型的核心工具。 JNPF深度…

使用Godot4组件制作竖版太空射击游戏_2D卷轴飞机射击-最高分和数据记录(十一)

文章目录 得分界面修改数据显示数据记录资源 使用Godot4组件制作竖版太空射击游戏_2D卷轴飞机射击(一) 使用Godot4组件制作竖版太空射击游戏_2D卷轴飞机射击-激光组件(二) 使用Godot4组件制作竖版太空射击游戏_2D卷轴飞机射击-飞船…

贪心算法案例

1.买卖股票的最佳时机 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔…