FREERTOS软件定时器

news2024/11/24 18:38:24

FreeRTOS 也提供了定时器功能,不过是软件定时器,软件定时器的精度肯定没有硬件定时器那么高,但是对于普通的精度要求不高的周期性处理的任务来说够了。当MCU的硬件定时器不够的时候就可以考虑使用 FreeRTOS 的软件定时器。

软件定时器允许设置一段时间,当设置的时间到达之后就执行指定的功能函数,被定时器调用的这个功能函数叫做定时器的回调函数。回调函数的两次执行间隔叫做定时器的定时周期,简而言之,当定时器的定时周期到了以后就会执行回调函数。

编写回调函数的注意事项

软件定时器的回调函数是在定时器服务任务中执行的,所以一定不能在回调函数中调用任何会阻塞任务的 API 函数!比如,定时器回调函数中千万不能调用 vTaskDelay()vTaskDelayUnti(),还有一些访问队列或者信号量的非零阻塞时间的 API 函数也不能调用。

定时器服务任务与队列

定时器是一个可选的、不属于 FreeRTOS 内核的功能,它是由定时器服务(Daemon)任务来提供的。FreeRTOS 提供了很多定时器有关的 API 函数,这些 API 函数大多都使用FreeRTOS的队列发送命令给定时器服务任务。这个队列叫做定时器命令队列。定时器命令队列是提供给FreeRTOS 的软件定时器使用的,用户不能直接访问!下图描述了这个过程:

上图左侧部分属于用户应用程序的一部分,并且会在某个用户创建的用户任务中调用。图中右侧部分是定时器服务任务的任务函数,定时器命令队列将用户应用任务和定时器服务任务连接在一起。在这个例子中,应用程序调用了函数 xTimerReset(),结果就是复位命令会被发送到定时器命令队列中,定时器服务任务会处理这个命令。应用程序是通过函数xTimerReset()间接的向定时器命令队列发送了复位命令,并不是直接调用类似 xQueueSend()这样的队列操作函数发送的。

软件定时器配置

上一小节我们知道了软件定时器有一个定时器服务任务和定时器命令队列,这两个东西肯定是要配置的,配置方法和我们前面讲解的 FreeRTOSCofig.h 一样,而且相关的配置也是放到文件 FreeRTOSConfig.h 中的,涉及到的配置如下:

1、configUSE_TIMERS

如果要使用软件定时器的话宏 configUSE_TIMERS 一定要设置为 1,当设置为 1 的话定时 器服务任务就会在启动 FreeRTOS 调度器的时候自动创建。

2、configTIMER_TASK_PRIORITY

设置软件定时器服务任务的任务优先级,可以为 0~( configMAX_PRIORITIES-1)。优先级一定要根据实际的应用要求来设置。如果定时器服务任务的优先级设置的高的话,定时器命令队列中的命令和定时器回调函数就会及时的得到处理。

3、configTIMER_QUEUE_LENGTH

此宏用来设置定时器命令队列的队列长度。

4、configTIMER_TASK_STACK_DEPTH

此宏用来设置定时器服务任务的任务堆栈大小,单位为字,不是字节!,对于 STM32 来说一个字是 4 字节。由于定时器服务任务中会执行定时器的回调函数,因此任务堆栈的大小一定要根据定时器的回调函数来设置。 

单次定时器和周期定时器

软件定时器分两种:单次定时器和周期定时器,单次定时器的话定时器回调函数就执行一 次,比如定时 1s,当定时时间到了以后就会执行一次回调函数,然后定时器就会停止运行。对于单次定时器我们可以再次手动重新启动(调用相应的 API 函数即可),但是单次定时器不能自动重启。相反的,周期定时器一旦启动以后就会在执行完回调函数以后自动的重新启动,这样回调函数就会周期性的执行。

创建软件定时器

使用软件定时器之前要先创建软件定时器,软件定时器创建函数如下表所示:

函数 xTiemrCreate()

此函数用于创建一个软件定时器,所需要的内存通过动态内存管理方法分配。新创建的软件定时器处于休眠状态,也就是未运行的。函数 xTimerStart() xTimerReset() xTimerStartFromISR()xTimerResetFromISR()xTimerChangePeriod()和xTimerChangePeriodFromISR()可以使新创建的定时器进入活动状态。

此函数的原型如下:

上面的描述中,portTICK_PERIOD_MS表示每个时钟节拍所表示的毫秒数;

开启软件定时器

如果软件定时器停止运行的话可以使用 FreeRTOS 提供的两个开启函数来重新启动软件定时器,这两个函数下表所示:

启动软件定时器,函数 xTimerStartFromISR()是这个函数的中断版本,可以用在中断服务函数中。如果软件定时器没有运行的话调用函数 xTimerStart()就会计算定时器到期时间,如果软件定时器正在运行的话调用函数 xTimerStart()的结果和 xTimerReset()一样。此函数是个宏,真正执行的是函数 xTimerGenericCommand

函数原型如下:

停止软件定时器

既然有开启软件定时器的 API 函数,那么肯定也有停止软件定时器的函数,FreeRTOS 也 提供了两个用于停止软件定时器的 API 函数,如下表所示:

函数 xTimerStop()

此函数用于停止一个软件定时器,此函数用于任务中,不能用在中断服务函数中!此函数是一个宏,真正调用的是函数 xTimerGenericCommand(),函数原型如下:

复位软件定时器

有时候我们可能会在定时器正在运行的时候需要复位软件定时器,复位软件定时器的话会重新计算定时周期到达的时间点,这个新的时间点是相对于复位定时器的那个时刻计算的,并 不是第一次启动软件定时器的那个时间点。

FreeRTOS 提供了两个 API 函数来完成软件定时器的复位,如下表所示:

函数 xTimerReset()

复位一个软件定时器,此函数只能用在任务中,不能用于中断服务函数!此函数是一个宏, 真正执行的是函数 xTimerGenericCommand(),函数原型如下: 

函数 xTimerResetFromISR()

此函数是 xTimerReset()的中断版本,此函数用于中断服务函数中!此函数是一个宏,真正执行的是函数 xTimerGenericCommand(),函数原型如下:

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

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

相关文章

HCIP【静态路由综合实验练习】

目录 实验要求: 实验过程: 一:首先设计实验 二:IP地址的划分(基于192.168.1.0/24) 在ensp中对路由器的相关命令进行配置: 三:配IP地址 (1)首先给所有设…

conda创建环境网络报错解决办法

文章目录 一、报错示例&#xff1a;二、解决办法&#xff1a;2.1 查看配置 conda config --show-sources2.2 修改文件 /home/XXXX/.condarc 一、报错示例&#xff1a; UnavailableInvalidChannel: HTTP 404 NOT FOUND for channel nvidia <http://mirrors.tuna.tsinghua.ed…

uniapp 开发微信小程序 出现启用组件按需注入问题如何解决

问题描述 在使用uniapp 开发微信小程序&#xff0c;进行上架发布时 代码质量栏 出现启用组件按需注入问题。 虽然现实代码上传成功&#xff0c;但是作为一个吹毛求疵的老猿人&#xff0c;肯定是无法容忍的。那么如何解决呢&#xff1f; 问题解决方案 在uniapp端&#xff0c…

[HackMyVM] Quick

kali:192.168.56.104 主机发现 arp-scan -l # arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:d2:e0:49, IPv4: 192.168.56.104 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.56.1 0a:00:27:00:00:05 (Un…

QT增加线程函数步骤流程

在使用线程的时候&#xff0c;不仅要关注线程开启的时机&#xff0c;同时还要关注线程安全退出&#xff0c;这样才能保证程序的健壮性&#xff0c;如果线程开启的较多&#xff0c;且开启关闭比较频繁&#xff0c;建议使用线程池来处理。开启线程有三种方式&#xff1a;第一种C的…

房屋租赁系统|基于JSP技术+ Mysql+Java+ B/S结构的房屋租赁系统设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java&#xff0c;ssm&#xff0c;springboot的平台设计与实现项目系统开发资源&#xff08;可…

Milvus 社区在线寻找「北辰使者」!!!

Milvus 社区的朋友们&#xff0c;大家好&#xff0c;欢迎来到 Milvus 北极星计划发布现场&#xff01; 熟悉我们的朋友都知道&#xff0c;Milvus 起源于一种学名叫“赤鸢”的鸟类&#xff0c;鸟类飞行的方向判断依靠星星、太阳、磁场&#xff0c;而北极星在人类历史上长期被视为…

24考研数学史上最难!25该怎么学?

25考研的千万不要被以前的真题卷给蒙蔽了双眼&#xff0c;现在考研的和以前真的不一样了 做过24年考研数学试卷的&#xff0c;应该都有一个感受&#xff0c;平时训练的好像都没用上。这是为啥啊。 其实是因为&#xff0c;现在的考研数学更加注重基础的考察&#xff0c;并且计…

sqllab第二十八关通关笔记(附带28a)

知识点&#xff1a; union select 整体过滤 union all select 替换where id(输入)空格 过滤了&#xff0c;使用%09代替 经过不断的测试&#xff0c;发现原始语句为 where id(输入) 构造payload:id1)and%091(1 成功回显出了相关的信息 好&#xff0c;尝试进行错误注入 构造…

git 安装、创建仓库、常用命令、克隆下载、上传项目、删除分支 -- 一篇文章总结

一、git安装 1、git安装地址&#xff1a;https://git-scm.com/downloads 2、选择操作系统 3、安装自己系统对应的操作位数 4、等待下载完&#xff0c;一路next安装就可以了 5、安装完成后&#xff0c;在任意文件夹点击右键&#xff0c;看到下图说明安装成功 二、创建仓库 1…

集成电路:基本概念、工作原理与分类

随着科技的飞速发展&#xff0c;集成电路已经成为现代电子信息产业的基础。那么&#xff0c;什么是集成电路呢&#xff1f;本文将为您介绍集成电路的基本概念、工作原理以及分类等基础知识。 一、集成电路的基本概念 集成电路&#xff08;Integrated Circuit&#xff0c;简称I…

Mysql数据库基本操作与简单管理

目录 一、MySQL数据库基本操作 1、SQL的分类 2、SQL语言的书写规范 3、数据库对象的命名 4、SQL的语句分类 5、查看帮助信息 6、查看&#xff0c;修改字符集 二、管理MySQL数据库 1、查看数据库的结构 1.1查看数据库 1.2查看数据库中的表 1.2.1方法一&#xff1a; …

excel 破解 保护工作簿及保护工作表

excel 破解 保护工作簿及保护工作表 对于这种 保护工作簿及保护工作表 不知道密码时&#xff0c;可以使用以下方法破解 保护工作簿破解 打开受保存的excel 右键点击sheet名称 —> 查看代码 复制以下代码&#xff0c;粘贴到代码区域 Sub 工作簿密码破解() ActiveWorkbook.…

题目 2086: 最长公共子序列

题目描述: 给定两个字符串&#xff0c;寻找这两个字串之间的最长公共子序列。 解题思路: 以二维数组的方式遍历两个字符串&#xff0c;行和列要加一&#xff0c;方便计算&#xff0c; 当遍历的两个字符相同时&#xff0c;就代表他两个字符串中都有这个字符&#xff0c; 就让…

先进的人工智能促进更好的业务沟通

提升商务沟通效率&#xff1a;了解SaneBox智能电子邮件管理工具 在现代商业环境中&#xff0c;有效的沟通至关重要。 先进的人工智能技术&#xff0c;特别是在电子邮件管理方面&#xff0c;正在改变企业处理沟通的方式&#xff0c;提高效率和个性化。 下面&#xff0c;我们深入…

算法学习(持续更新中)

学习视频&#xff1a;一周刷爆LeetCode&#xff0c;算法大神左神&#xff08;左程云&#xff09;耗时100天打造算法与数据结构基础到高级全家桶教程&#xff0c;直击BTAJ等一线大厂必问算法面试题真题详解&#xff08;马士兵&#xff09;_哔哩哔哩_bilibili 时间复杂度 一个操…

2024年云仓酒庄佛山发布会:赋能

原标题&#xff1a;2024年云仓酒庄佛山发布会圆满落幕&#xff0c;朱囿臻总赋能引领行业新篇章 近日&#xff0c;备受瞩目的云仓酒庄佛山发布会圆满落幕。此次发布会汇聚了业内精英、经销商代表以及媒体人士&#xff0c;共同见证了云仓酒庄在佛山市场的启航。在此&#xff0c;…

实现防抖函数并支持第一次立刻执行(vue3 + ts环境演示)

1、先看一效果&#xff1a; 2、实现思路&#xff1a; 使用定时器setTimeout和闭包实现常规防抖功能&#xff1b;增加immediate字段控制第一次是否执行一次函数&#xff08;true or false&#xff09;&#xff1b;增加一个flag标识&#xff0c;在第一次执行时&#xff0c;将标…

YZ系列工具之YZ08:窗体加载图片后进行放大查看

我给VBA下的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套一部VBA手册&#xff0c;教程分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的…

【安全类书籍-2】Web渗透测试:使用Kali Linux

目录 内容简介 作用 下载地址 内容简介 书籍的主要内容是指导读者如何运用Kali Linux这一专业的渗透测试平台对Web应用程序进行全面的安全测试。作者们从攻击者的视角出发,详细阐述了渗透测试的基本概念和技术,以及如何配置Kali Linux以适应渗透测试需求。书中不仅教授读者…