FreeRTOS笔记(九)定时器

2023-10-26

定时器Timer

软件定时器是基于系统时钟中断且由软件来模拟的定时器,当经过设定的Tick 时钟计数值后会触发用户定义的回调函数。软件定时器不占用单片机宝贵的硬件资源和CPU资源 。FreeRTOS提供了完善的软件定时器的支持,为了启用软件定时器,需要在头文件FreeRTOSConfig.h中设置configUSE_TIMERS的值为1.

软件定时器需要定时或者延时控制的函数称为回调函数。 函数的原型如下:

void ATimerCallback( TimerHandle_t xTimer );

函数的返回值是空类型,xTimer的参数是软件定时器的句柄。回调函数的注意事项是代码应该尽可能地简短紧凑,并且避免调用FreeRTOS的API函数防止进入阻塞状态。

软件定时器的类型

软件定时器在FreeRTOS中分为两个类型

  • 一次性定时器(One-shot timer)
  • 自动重载定时器(Auto-reload timer)

一次性定时器启动后只会执行一次回调函数;自动重载定时器会周期性地执行回调函数。

软件定时器的状态

有以下两种

  • 静止装态(Dormant)
  • 运行状态(Running)

处于静止装态的定时器不会执行回调函数,可以通过调用定时器的具柄启用;处于运行状态的定时器会在设定的时间间隔(相对于定时器进入运行状态后)到达后调用回调函数。一次性定时器会在执行回调函数后进入静止状态,而自动重载定时器会在执行回调函数后重新进入运行状态。通过调用软件定时器相关的系统API函数可以在两种状态之间进行切换,其中两种定时器的状态转换图如下:

在这里插入图片描述

在这里插入图片描述

软件定时器的实质

软件定时器是由一个系统内核调度器自动生成的时间服务任务来管理。这个时间服务任务的优先级和栈大小由头文件FreeRTOSConfig.hconfigTIMER_TASK_PRIORITYconfigTIMER_TASK_STACK_DEPTH属性相应设定。定时器的回调函数调用FreeRTOS的API函数的话会导致时间服务任务管理进入阻塞状态,这种情况是要避免的。

一些FreeRTOS的API函数会使回调函数进入阻塞状态转而执行其他任务导致定时器的实时性不确定,容易产生意外错误或者超时

针对软件定时器的命令如启动定时器,停止定时器和重置定时器等会通过命令队列发送到时间服务任务。队列长度由头文件FreeRTOSConfig.hconfigTIMER_QUEUE_LENGTH 值设定。

守护任务

FreeRTOS 中,不在 Tick 中断中执行定时器函数,而是在 RTOS Damemon Task 里执行。

当 FreeRTOS 的配置项 configUSE_TIMERS 被设置为 1 时 ,在启动调度器时,会自动创建 RTOS Damemon Task。

守护任务的调度

当守护任务是当前优先级最高的就绪态任务时,它就可以运行。 它的工作有两类:

  • 处理命令:从命令队列里取出命令、处理
  • 执行定时器的回调函数
定时器的回调函数的原型如下:
void ATimerCallback( TimerHandle_t xTimer );  

定时器的回调函数是在守护任务中被调用的,守护任务不是专为某个定时器服务的,它还要处理其他定时器。

  • 回调函数要尽快实行,不能进入阻塞状态
  • 不要调用会导致阻塞的 API 函数,比如 vTaskDelay()
  • 可以调用 xQueueReceive()之类的函数,但是超时时间要设为 0:即刻返回,不可阻塞
定时器相关API函数
创建定时器
TimerHandle_t xTimerCreate( const char * const pcTimerName,
                            TickType_t xTimerPeriodInTicks,
                            UBaseType_t uxAutoReload,
                            void * pvTimerID,
                            TimerCallbackFunction_t pxCallbackFunction )

xTimerCreate()函数用于创建定时器

函数参数含义如下

  • pcTimerName 定时器的名称,用于调试用
  • xTimerPeriodInTicks 定时器的周期,dMS_TO_TICKS() 可把时间转成节拍数
  • uxAutoReload 设置为pdTRUE为自动重载定时器,设置为pdFALSE为一次性定时器
  • pvTimerID 定时器的ID,可以用于各种目的
  • pxCallbackFunction 定时器执行的回调函数
  • 返回值 返回值为NULL表示创建失败,非NULL表示创建成功
删除定时器
/* 删除定时器
* xTimer: 要删除哪个定时器
* xTicksToWait: 超时时间
* 返回值: pdFAIL 表示"删除命令"在 xTicksToWait 个 Tick 内无法写入队列
* pdPASS 表示成功
*/
BaseType_t xTimerDelete( TimerHandle_t xTimer, TickType_t xTicksToWait );
启动定时器
BaseType_t xTimerStart( TimerHandle_t xTimer, TickType_t xTicksToWait )

xTimerStart()函数用于启动定时器

函数参数含义如下

  • xTimer 要执行定时器的具柄
  • xTicksToWait 如果命令队列为满时函数进入阻塞状态等待命令队列有空的时间
  • 返回值 返回值为pdPASS表示启动定时器成功;返回值为pdFALSE表示失败
设置定时器pvTimerID属性
void vTimerSetTimerID( const TimerHandle_t xTimer, void *pvNewID )

定时器 ID 号,一般情况下每个定时器都有一个回调函数,当定时器定时周期到了以后就会执行这个回调函数。但是 FreeRTOS 也支持多个定时器共用同一个回调函数,在回调函数中根据定时器的 ID 号来处理不同的定时器。

函数参数含义如下

  • xTimer 要执行定时器的具柄
  • pvNewID 设定的pvTimerID的值
获取定时器的pvTimerID 属性
void *pvTimerGetTimerID( TimerHandle_t xTimer );

pvTimerGetTimerID()函数用于获取定时器的pvTimerID 属性

函数参数含义如下

  • xTimer 要执行定时器的具柄
  • 返回值 pvTimerID的值
改变定时器的运行周期
BaseType_t xTimerChangePeriod( TimerHandle_t xTimer,
                            TickType_t xNewTimerPeriodInTicks,
                            TickType_t xTicksToWait );

xTimerChangePeriod()函数用于改变定时器的运行周期

函数参数含义如下

  • xTimer 要执行定时器的具柄
  • xNewTimerPeriodInTicks 新的定时器的周期,dMS_TO_TICKS() 可把时间转成节拍数
  • xTicksToWait 如果命令队列为满时函数进入阻塞状态等待命令队列有空的时间
  • 返回值 返回值为pdPASS表示成功;返回值为pdFALSE表示失败
重置定时器
BaseType_t xTimerReset( TimerHandle_t xTimer, TickType_t xTicksToWait ); 

xTimerReset()函数用于重置定时器,定时器会重新运行并以此计算新的时间间隔

函数参数含义如下

  • xTimer 要执行定时器的具柄
  • xTicksToWait 如果命令队列为满时函数进入阻塞状态等待命令队列有空的时间
  • 返回值 返回值为pdPASS表示成功;返回值为pdFALSE表示失败
使用定时器需要配置
/* 1. 工程中 */
添加 timer.c
/* 2. 配置文件 FreeRTOSConfig.h 中 */
##define configUSE_TIMERS 1 /* 使能定时器 */
##define configTIMER_TASK_PRIORITY 31 /* 守护任务的优先级, 尽可能高一些 */
##define configTIMER_QUEUE_LENGTH 5 /* 命令队列长度 */
##define configTIMER_TASK_STACK_DEPTH 32 /* 守护任务的栈大小 */
/* 3. 源码中 */
##include "timers.h"  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FreeRTOS笔记(九)定时器 的相关文章

  • OSI七层协议模型及其协议

    文章目录 一 OSI七层模型是什么 其协议有哪些 二 TCP IP四层协议 TCP IP五层协议 OSI七层协议是什么 一 OSI七层模型是什么 其协议有哪些 二 TCP IP四层协议 TCP IP五层协议 OSI七层协议是什么 一 1 O
  • php如何处理高并发请求

    PHP 处理高并发请求的方法 使用异步框架 通过使用异步处理方式 可以有效地降低 PHP 处理请求的响应时间 避免因为 IO 操作而导致的等待阻塞 常用的异步框架有ReactPHP和Swoole等 使用缓存 使用缓存可以减少每个请求都需要访
  • Open3D——RGBD图转化为点云(pcd)并显示

    1 用Open3D分别读取RGB图片和深度图片 彩色图 深度图 2 把Open3D中的RGBD图片转化pcd格式并储存 3 显示点云 直接看代码 Open3D www open3d org The MIT License MIT See l
  • 五款单按键开关机电路图

    转载 https blog csdn net shileiwu0505 article details 114401137 一 单按键开关机电路图 本例电路可实现通过按一次按键S1实现开机 再按一次S1实现关机的功能 整个电路的工作过程 电
  • 详解 TS 中的子类型兼容性

    简介 在写 TypeScript 代码时经常遇到类型检查不通过的问题 这些问题根据编译器给出的错误提示以及修改建议多数可以快速修复 本文讲解的内容是编译器进行类型检查时的兼容性相关检查规则 这些规则在 TypeScript 语言背后默默发挥

随机推荐

  • 刷脸支付用户可以摆脱对手机介质的依赖

    支付宝与微信的刷脸支付设备落地体量约在10万台左右 同时云闪付也在广州 杭州等七个城市陆续上线了 刷脸付 从安装数量看 刷脸设备的总体落地效果理想 现在商家对使用扫码支付服务具有很强的依赖性 且担心刷脸支付因为技术与道德问题而遭遇不必要的麻
  • 【uni-app】响应式单位rpx

    单位 rpx是响应式px rpx是一种根据屏幕宽度自适应的动态单位 以750宽的屏幕为基准 750rpx正好是屏幕的宽度 屏幕变宽 rpx实际显示效果会等比放大 但在App端和h5端 屏幕宽度达到960px时 默认将按照375px的屏幕宽度
  • linux增加nfs的inode,使用NFS时出现nfs_inode_cache占用内存过高问题的解决

    使用NFS时出现nfs inode cache占用内存过高问题的解决 来源 IT165收集 发布日期 2014 04 14 20 52 06 一 现象 运行了使用NFS文件系统的应用程序后 内存缓慢泄漏 最后导致整个服务器的内存全部耗尽 系
  • 向量微积分基础

    本文首发在我的个人博客 https jlice top p 7kemt 欢迎大家前去参观 么么哒 机器学习里经常需要用到向量微积分 向量微积分其实并不难 但大学数学一般不提 导致在看机器学习的一些推导时常常感觉疑惑 机器学习里经常用到标量和
  • python3 华为推送系统接入

    只是后台对接华为推送服务接口对接 前端集成还是请参考官方文档 根据AppID和AppSecret 获取请求token 根据token发送http请求 获取token 请注意token的有效时间 不避免频繁获取 def get access
  • 基于深度学习的小学语文“输出驱动”教学研究课题方案

    目录 一 课题研究的背景与意义 二 课题研究理论依据 三 国内外研究情况
  • CheckStyle使用手册

    介绍 CheckStyle是SourceForge下的一个项目 提供了一个帮助JAVA开发人员遵守某些编码规范的工具 它能够自动化代码规范检查过程 从 而使得开发人员从这项重要 但是枯燥的任务中解脱出来 CheckStyle默认提供一下主要
  • 用VC 6.0实现串行通信的三种方法

    摘要 本文介绍了在Windows平台下串行通信的实现机制 讨论了根据不同的条件用Visual C 设计串行通信程序的三种方法 并结合实际 实现对温度数据的接收监控 在实验室和工业应用中 串口是常用的计算机与外部串行设备之间的数据传输通道 由
  • 数据挖掘常用的基本技术,主要有哪些?

    1 统计学 统计学虽然是一门 古老的 学科 但它依然是最基本的数据挖掘技术 特别是多元统计分析 如判别分析 主成分分析 因子分析 相关分析 多元回归分析等 2 聚类分析和模式识别 聚类分析主要是根据事物的特征对其进行聚类或分类 即所谓物以类
  • 【转】多层级的makefile编写——递归调用makefile

    转自 多层级的makefile编写 递归调用makefile wangyuling1234567890的专栏 博客频道 CSDN NET http blog csdn net wangyuling1234567890 article det
  • 测试框架pytest教程(7)实现 xunit 风格的setup

    pytest支持setup和teardown 对于使用unittest和nose框架的用户来说对这些很熟悉 但是在pytest可以使用功能更强大的fixture来实现固定装置 模块级别 如果单个模块中有多个测试函数和测试类 您可以选择实现以
  • 计算机网络相关知识点

    计算机网络知识点 1 流量单位换算 2 概念和单位换算 3 计算机网络概述 4 例题 本文参考资料一 GitHub上的博客CS Notes 本文参考资料二 百度文库计算机网络知识点文档 1 流量单位换算 计算机中表示容量的单位有B KB M
  • MySQL5.7 下载安装

    一 下载 尽量使用压缩包解压缩方式安装 压缩包的解压后配置下环境变量就能使用 如果使用安装程序 msi安装程序 安装 卸载起来会比较麻烦 下载地址链接 各版本下载链接 二 安装 1 解压缩 下载的zip压缩包解压缩 我的mysql解压缩安装
  • AttributeError: ‘str‘ object has no attribute ‘parse‘

    今天 使用python提取版本号 pip3 install packaging from packaging import version A 3 5 2 version parse A 发现报错 AttributeError str ob
  • golang开发:类库篇(三)命令行工具cli的使用

    为什么要使用命令行 觉得这个问题不应该列出来 又觉得如果初次进行WEB开发的话 可能会觉得所有的东西都可以使用API去做 会觉得命令行没有必要 其实 一个生产的项目命令行是绕不过去的 比如运营需要导出报表 统计下付费用户 服务不稳定修改下订
  • 推荐引擎系统架构

    本文从互联网收集并整理了推荐系统的架构 其中包括一些大公司的推荐系统框架 数据流存储 计算 模型应用 可以参考这些资料 取长补短 最后根据自己的业务需求 技术选型来设计相应的框架 后续持续更新并收集 界面UI那一块包含3块东西 1 通过一定
  • vue3高德地图点击标记显示自定义提示框/地图平移过渡(panBy/panTo)

    上一篇文章有讲到点击标记显示窗口信息 但是在实际的项目需求中我们可能需要在某一个固定的地方显示自定义的内容 这里就需要我们自己动手了 4条消息 vue3高德地图多个点标记 窗口信息 点标记自定义图片不显示问题 奋斗不息 编码不止 的博客 C
  • 【MySQL】八,角色管理

    创建角色 引入角色的目的是方便管理拥有相同权限的用户 恰当的权限设定 可以确保数据的安全性 语法 CREATE ROLE role name host name role name host name 创建一个经理的角色 create ro
  • 基于Uniapp+SpringBoot+Vue的电影交流平台小程序设计与实现(源码+lw+部署文档+讲解等)

    前言 博主介绍 全网粉丝10W CSDN特邀作者 博客专家 CSDN新星计划导师 全栈领域优质创作者 博客之星 掘金 华为云 阿里云 InfoQ等平台优质作者 专注于Java 小程序技术领域和毕业项目实战 精彩专栏 推荐订阅 2023 20
  • FreeRTOS笔记(九)定时器

    定时器Timer 软件定时器是基于系统时钟中断且由软件来模拟的定时器 当经过设定的Tick 时钟计数值后会触发用户定义的回调函数 软件定时器不占用单片机宝贵的硬件资源和CPU资源 FreeRTOS提供了完善的软件定时器的支持 为了启用软件定