定时器的理论和使用

文章目录

  • 一、定时器理论
    • 1.1定时器创建和使用
  • 二、定时器实践
    • 2.1周期触发定时器
    • 2.2按键消抖


一、定时器理论

定时器是一种允许在特定时间间隔后或在将来的某个时间点调用回调函数的机制。对于需要周期性任务延迟执行任务的嵌入式应用程序特别有用。

软件定时器: FreeRTOS 提供的用于实现定时操作的功能。与硬件定时器不同,软件定时器在 FreeRTOS 的任务调度机制之上运行。
定时器回调函数: 当定时器到期时,FreeRTOS 将调用用户定义的回调函数。

定时器类型分为以下两种:
一次性定时器(One-shot Timer):定时器在到期后自动停止,仅调用一次回调函数。
周期性定时器(Auto-reload Timer):定时器在到期后自动重新启动,周期性地调用回调函数。

1.1定时器创建和使用

回调函数pxCallbackFunction可以使用pvTimerID分辨是哪个定时器
返回值: 成功则返回TimerHandle_t, 否则返回NULL

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

在RTOS中,每隔一个固定的时间产生中断,中断函数里面可以去判断定时器时间有没有超时,超时后就唤醒守护任务去执行回调函数

其他任务要配置和使用定时器时,是通过定时器命令队列(timer command queue)和守护任务交互,所以守护任务优先级要尽可能高

在这里插入图片描述

所以在启动定时器要有一个xTicksToWait ,当队列满了要设置等待时间

BaseType_t xTimerStart( TimerHandle_t xTimer, TickType_t xTicksToWait );

定时器状态:冬眠(Dormant)和运行(Running)、

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

二、定时器实践

2.1周期触发定时器

创建定时器

static TimerHandle_t xMyTimerHandle;xMyTimerHandle = xTimerCreate("mytimer", 100, pdTRUE, NULL, MyTimerCallbackFunction);

回调函数

void MyTimerCallbackFunction( TimerHandle_t xTimer )
{static int cnt = 0;flagTimer = !flagTimer;printf("MyTimerCallbackFunction_t cnt = %d\r\n", cnt++);
}

启动定时器:把命令通过 定时器队列 发给守护任务,由守护任务来启动定时器


void Task1Function(void * param)
{volatile int i = 0;xTimerStart(xMyTimerHandle, 0);while (1){printf("Task1Function ...\r\n");}
}

结果:每隔100ms进入回调函数
在这里插入图片描述
在这里插入图片描述

2.2按键消抖

在嵌入式开发中,我们使用机械开关时经常碰到抖动问题:引脚电平在短时间内反复变化。针对这个问题,我们在中断函数中添加定时器,在产生中断后定时器延时20ms,假如由于抖动再次进入中断,继续延时20ms直到按键趋于稳定。

在这里插入图片描述

创建定时器, 设置一次触发,延时20ms

static TimerHandle_t xMyTimerHandle;xMyTimerHandle = xTimerCreate("mytimer", 2000, pdFALSE, NULL, MyTimerCallbackFunction);

在回调函数中记录定时器中断次数cnt

void MyTimerCallbackFunction( TimerHandle_t xTimer )
{static int cnt = 0;flagTimer = !flagTimer;printf("Get GPIO Key cnt = %d\r\n", cnt++);
}

按键中断函数中使用定时器消除抖动,通过复位函数xTimerReset往定时器队列写入数据,由守护任务根据队列命令来复位定时器。在这里多次产生中断会多次调用复位函数xTimerReset。时间到达后进入回调函数

void EXTI0_IRQHandler(void)
{static int cnt = 0;if(EXTI_GetITStatus(EXTI_Line0) != RESET){printf("EXTI0_IRQHandler cnt = %d\r\n", cnt++);/* 使用定时器消除抖动 */xTimerReset(xMyTimerHandle, 0); /* Tcur + 2000 */EXTI_ClearITPendingBit(EXTI_Line0);     //清除中断}     
}

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

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

相关文章

Java面试八股之float和double的区别

Java中float和double的区别 存储空间与精度: double:占据64位(8字节)存储空间,属于双精度浮点数。它可以提供较高的精度,通常能够精确表示大约15到17位十进制数字,适合用于需要较高精度计算或…

MySQL数据库核心面试题

数据库中的引擎 常用的引擎有InnoDB、MyIsam、Memory三种。 MyIsam:组织形式分为三种: frm文件存储表结构、MyData文件存储表中的数据、MyIndex文件存储表的索引数据。是分开存储的。 Memory:基于内存的,访问速度快&#xff0…

TCP协议建立连接的过程及其意义

目录 三次握手 四次挥手 三次握手的意义 在客户端与服务器传输数据之前,要在两台主机之间先建立连接,然后再传输业务数据。三次握手,就是建立连接的过程,是在传输业务之前,就要先进行。握手好了,才能进行…

【JS面试题】this

this取什么值,是在函数执行的时候确定的,不是在函数定义的时候确定的! this的6种使用场景: ① 在普通函数中使用:返回window对象 ② 使用call apply bind 调用:绑定的是哪个对象就返回哪个对象 ③ 在对象…

【C++】priority_queues(优先级队列)和反向迭代器适配器的实现

目录 一、 priority_queue1.priority_queue的介绍2.priority_queue的使用2.1、接口使用说明2.2、优先级队列的使用样例 3.priority_queue的底层实现3.1、库里面关于priority_queue的定义3.2、仿函数1.什么是仿函数?2.仿函数样例 3.3、实现优先级队列1. 1.0版本的实现…

过滤器Filter和拦截器Interceptor实现登录校验

一.过滤器 Filter过滤器可以把对资源的请求拦截下来,从而实现一些登录验证的功能 1.Filter的快速入门 1.定义Filter:定义一个类,实现Filter接口,并重写其所有方法。2.配置 public class dofilter implements Filter {Override //初始化只…

手撸XXL-JOB(三)——本地定时任务管理平台

引言 在XXL-JOB中,有一个xxl-job-admin项目,这个就相当于定时任务的调度平台,我们参考XXL-JOB,也添加这么一个调度平台,由于篇幅有限,我们先实现一个本地的定时任务调度平台,至于如何调用远程的…

(2024,MambaOut,Mamba 适合长序列,区分指标,不适合分类,适合检测和分割)视觉真的需要 Mamba 吗?

MambaOut: Do We Really Need Mamba for Vision? 公和众和号:EDPJ(进 Q 交流群:922230617 或加 VX:CV_EDPJ 进 V 交流群) 目录 0. 摘要 1. 简介 3. 概念讨论 3.1 Mamba 适合哪些任务? 3.2 视觉识别任…

接口测试基础

1、接口测试 接口:系统之间数据交互的通道。 硬件接口软件接口 接口测试:基于不同的输入参数,校验接口响应数据与预期数据是否一致。 接口地址 接口参数 2. 为什么要学接口测试? 提前介入测试、尽早发现问题 3、接口测试学什…

十二生肖Midjourney绘画大挑战:释放你的创意火花

随着AI艺术逐渐进入大众视野,使用Midjourney绘制十二生肖不仅能够激发我们的想象力,还能让我们与传统文化进行一场新式的对话。在这里,我们会逐一提供给你创意满满的绘画提示词,让你的作品别具一格。而且,我们还精选了…

2024年金属非金属矿山(露天矿山)安全管理人员证考试题库及金属非金属矿山(露天矿山)安全管理人员试题解析

题库来源:安全生产模拟考试一点通公众号小程序 2024年金属非金属矿山(露天矿山)安全管理人员证考试题库及金属非金属矿山(露天矿山)安全管理人员试题解析是安全生产模拟考试一点通结合(安监局)…

【C++】每日一题 17 电话号码的字母组合

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 可以使用回溯法来解决这个问题。首先定义一个映射关系将数字与字母对应起来…