当前位置: 首页 > news >正文

FreeRTOS软件定时器 | FreeRTOS十三

目录

说明:

一、定时器简介

1.1、定时器

1.2、软件定时器

1.3、硬件定时器

1.4、FreeRTOS软件定时器

1.5、软件定时器服务任务作用

1.6、软件定时器的命令队列

1.7、软件定时器相关配置

1.8、单次定时器和周期定时器

1.9、软件定时器结构体

二、软件定时器相关API函数

2.1、创建软件定时器函数

2.2、开启软件定时器函数

2.3、停止软件定时器函数

2.4、复位软件定时器函数

2.5、更改软件定时器超时时间函数

2.6、删除软件定时器函数


说明:

关于内容:

        1)以下内容多为概念了解与步骤分析

        2)暂无个人示例代码,使用的是FreeRTOS的官方示例代码

        3)若想移植代码测试的,请移步其它地方寻找,下文内容暂无个人示例代码供测试

关于其它:

        1)操作系统:win 10

        2)平台:keil 5 mdk

        3)语言:c语言

        4)板子:STM32系列移植FreeRTOS

一、定时器简介

1.1、定时器

        从指定是时刻开始,经过一个指定时间,然后触发一个超时事件,用户可以自定义定时器的周期。

1.2、软件定时器

        是指具有定时功能的软件,可设置定时周期,当指定时间到达后要调用回调函数(也称为超时函数),用户在回调函数中处理信息

优点:

        1)硬件定时器数量有限,而软件定时器理论上只需要有足够内存,就可以创建多个;

        2)使用简单,成本低。

缺点:

        1)软件定时器相对硬件定时器来说,精度没那么高(因为它以系统时钟为基准,系统时钟中断优先级又是最低,容易被打断)。对于需要高精度要求的场合,不建议使用软件定时器。

1.3、硬件定时器

        芯片本身自带的定时器模块,硬件定时器的精度很高(比软件定时器高),每次在定时时间到达之后就会自动触发一个中断,用户在中断服务函数中处理信息

1.4、FreeRTOS软件定时器

特点:

        1)可裁剪,软件定时器是可裁剪可配置的功能,如果要使能软件定时器,需要将宏定义:configUSE_TIMERT配置项设置为1(不使用设置为0);

        2)单次和周期,软件定时器支持设置成:单次定时器或周期定时器。

注意点:

        1)软件定时器的超时回调函数是由软件定时器服务任务调用的,软件定时器的超时回调函数本身不是任务,因此不能在改回调函数中使用可能会导致任务阻塞的API函数;

        2)软件定时器服务任务:在调用函数vTaskStartScheduler()开启任务调度器的时候,会创建一个管理软件定时器的任务,这个任务称为-->软件定时器服务任务。

1.5、软件定时器服务任务作用

        1)负责软件定时器超时的逻辑判断;

        2)调用超时软件定时器的超时回调函数;

        3)处理软件定时器命令队列。

1.6、软件定时器的命令队列

        FreeRTOS提供了许多软件定时器相关的API函数,这些API函数大多都是往定时器的队列中写入消息(本质上是发送命令),这个队列叫做软件定时器命令队列,是提供给FreeRTOS中的软件定时器使用的,用户不能直接访问。

例如:定义了一个任务,开启定时器(API函数往软件定时器命令队列写入消息,发送命令)-->软件定时器命令队列-->软件定时器任务读取软件定时器命令队列消息(接收命令)。

1.7、软件定时器相关配置

        1)如果要使能软件定时器,需要将宏定义:configUSE_TIMERT配置项设置为1(不使用设置为0),在启动任务调度器时,会自动创建软件定时器的服务/守护任务prvTimerTask();

        2)软件定时器服务任务的优先级为configTIMER_TASK_PRIORITY=31(最大任务优先级);

        3)定时器的命令队列长度为configTIMER_QUEUE_LENGTH=5。

注意点:

        1)软件定时器的超时回调函数是在软件定时器服务任务中被调用的,服务任务不是专为某个定时器服务的,它还要处理其他定时器,所以定时器的回调函数-->不要影响其他定时器任务,即不能调用那些会阻塞任务的API函数,如:vTaskDelay();

        2)访问队列或信号量的非零阻塞时间的API函数也不能调用。

软件定时器的状态:

        1)休眠态:软件定时器可以通过其句柄被引用,但因为没有运行,所以其定时超时回调函数不会被执行;

        2)运行态:运行态的定时器,当指定时间到达之后,它的超时回调函数会被调用。

注意:新创建的软件定时器处于休眠态,也就是未运行

那么如何让软件定时器从休眠态转变为运行态?

        发送命令队列!

1.8、单次定时器和周期定时器

        1)单次定时器:单次定时器一旦定时超时,之后执行一次其软件定时器超时回调函数,不会自动重新开启定时,不过可以被手动重新开启;

        2)周期定时器:周期定时器的一旦启动以后就会在执行完回调函数以后自动的重新启动,从而周期地执行其软件定时器回调函数。

1.9、软件定时器结构体

结构体成员:

    typedef struct tmrTimerControl                
    {
        const char * pcTimerName;                  
        ListItem_t xTimerListItem;                 
        TickType_t xTimerPeriodInTicks;           
        void * pvTimerID;                          
        TimerCallbackFunction_t pxCallbackFunction;
        #if ( configUSE_TRACE_FACILITY == 1 )
            UBaseType_t uxTimerNumber;             
        #endif
        uint8_t ucStatus;                         
    } xTIMER;

含义:

名称,pcTimerName,含义:软件定时器名字

名称,xTimerListItem,含义:然后定时器列表项

名称,xTimerPeriodInTicks,含义:软件定时器周期

名称,pvTimerID,含义:软件定时器ID-->区分不同定时器

名称,pxCallbackFunction,含义:软件定时器回调函数

名称,uxTimerNumber,含义:软件定时器编号,调试用

名称,ucStatus,含义:软件定时器的状态

二、软件定时器相关API函数

2.1、创建软件定时器函数

动态创建函数实现:

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

参数含义:

名称,pcTimerName,含义:软件定时器名

名称,xTimerPeriodInTicks,含义:定时超时时间,单位是:系统时钟节拍

名称,uxAutoReload,含义:定时器模式,pdTRUE:周期定时器,pdFALSE:单次定时器

名称,pvTimerID,含义:软件定时器ID,用于多个软件定时器公用一个回调函数时区分

名称,pxCallbackFunction ,含义:软件定时器超时回调函数

返回值含义:

返回,NULL,含义:软件定时器创建失败

返回,其他值,含义:软件定时器创建成功,返回句柄

2.2、开启软件定时器函数

代码实现:

BaseType_t xTimerStart( TimerHandle_t xTimer, TickType_t xTicksToWait );

参数含义:

名称,xTimer,含义:待开启的软件定时器的句柄

名称,xTicksToWait ,含义:发送命令到软件定时器命令队列的最大等待时间

返回值含义:

返回,pdPASS,含义:软件定时器开启成功

返回,pdFAIL,含义:软件定时器开启失败

2.3、停止软件定时器函数

代码实现:

BaseType_t xTimerStop( TimerHandle_t xTimer, TickType_t xTicksToWait );

参数含义:

名称,xTimer,含义:待停止的软件定时器的句柄

名称,xTicksToWait ,含义:发送命令到软件定时器命令队列的最大等待时间

返回值含义:

返回,pdPASS,含义:软件定时器停止成功

返回,pdFAIL,含义:软件定时器停止失败

2.4、复位软件定时器函数

代码实现:

BaseType_t xTimerReset( TimerHandle_t xTimer, TickType_t xTicksToWait );

参数含义:

名称,xTimer,含义:待复位的软件定时器句柄

名称,xTicksToWait ,含义:发送命令到软件定时器命令队列的最大等待时间

返回值含义:

返回,pdPASS,含义:软件定时器复位成功

返回,pdFAIL,含义:软件定时器复位失败

说明:

        该功能将使软件定时器的重新开启定时,复位后软件定时器重新从0个时间单位开始计数。

2.5、更改软件定时器超时时间函数

代码实现:

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

参数含义:

名称,xTimer,含义:待更新的软件定时器句柄

名称,xNewPeriod,含义:新的定时超时时间,单位:系统时钟节拍

名称,xTicksToWait ,含义:发送命令到软件定时器命令队列的最大等待时间

返回值含义:

返回,pdPASS,含义:软件定时器定时超时时间修改成功

返回,pdFAIL,含义:软件定时器定时超时时间修改失败

2.6、删除软件定时器函数

代码实现:

BaseType_t xTimerDelete( TimerHandle_t xTimer, TickType_t xTicksToWait );

参数含义:

名称,xTimer,含义:待删除的软件定时器句柄

名称,xTicksToWait ,含义:发送命令到软件定时器命令队列的最大等待时间

相关文章:

FreeRTOS软件定时器 | FreeRTOS十三

目录 说明: 一、定时器简介 1.1、定时器 1.2、软件定时器 1.3、硬件定时器 1.4、FreeRTOS软件定时器 1.5、软件定时器服务任务作用 1.6、软件定时器的命令队列 1.7、软件定时器相关配置 1.8、单次定时器和周期定时器 1.9、软件定时器结构体 二、软件定时…...

电脑文件被误删?360文件恢复工具,免费的文件恢复软件

电脑里面保存着各种文件,因为误操作我们把还需要用的文件给删除了。很多人都想要使用不收费的文件恢复软件来进行恢复操作,但是又不清楚有哪些文件可以帮到我们。接下来就给大家介绍,一款真正免费的数据 恢复app,一起来看看&#…...

pg_cron优化案例--terminate pg_cron launcher可自动拉起

场景 在PostgreSQL中我们可以使用pg_cron来实现数据库定时任务 我有一个select 1的定时任务,每分钟触发一次 testdb# select * from cron.job ;jobid | schedule | command | nodename | nodeport | database | username | active | jobname -------…...

Python 之 NumPy 随机函数和常用函数

文章目录一、随机函数1. numpy.random.rand(d0,d1,…,dn)2. numpy.random.randn(d0,d1,…,dn)3. numpy.random.normal()4. numpy.random.randint()5. numpy.random.sample6. 随机种子np.random.seed()7. 正态分布 numpy.random.normal二、数组的其他函数1. numpy.resize()2. nu…...

【目标检测】K-means和K-means++计算anchors结果比较(附完整代码,全网最详细的手把手教程)

写在前面: 首先感谢兄弟们的订阅,让我有创作的动力,在创作过程我会尽最大努力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。 一、介绍 YOLO系列目标检测算法中基于anchor的模型还是比较多的,例如YOLOv3、YOLOv4、YOLOv5等,我们可以随机初始化a…...

Java高手速成 | 图说重定向与转发

我们先回顾一下Servlet的工作原理,Servlet的工作原理跟小猪同学食堂就餐的过程很类似。小猪同学点了烤鸡腿(要奥尔良风味的),食堂窗口的服务员记下了菜单,想了想后厨的所有厨师,然后将菜单和餐盘交给专门制…...

Git:不小心在主分支master上进行修改,怎么才能将修改的数据保存到正确的分支中

1.如果还没有push commit 代码第一步:将所修改的代码提交到暂存区git stash第二步:切换到正确的分支git checkout 分支名第三步:从暂存区中取出保存到正确的分支中git stash pop第四步:重新提交git push origin 分支名2.如果已经p…...

都2023年了,如果不会Stream流、函数式编程?你确定能看懂公司代码?

👳我亲爱的各位大佬们好😘😘😘 ♨️本篇文章记录的为 Stream流、函数式编程 相关内容,适合在学Java的小白,帮助新手快速上手,也适合复习中,面试中的大佬🙉🙉🙉。 ♨️如果…...

亚马逊云科技汽车行业解决方案

当今,随着万物智联、云计算等领域的高速发展,创新智能网联汽车和车路协同技术正在成为车企加速发展的关键途径,推动着汽车产品从出行代步工具向着“超级智能移动终端”快速转变。 挑战无处不在,如何抢先预判? 随着近…...

为什么学了模数电还是看不懂较复杂的电路图

看懂电路并不难。 (1) 首先要摆正心态,不要看到错综复杂的电路图就一脸懵逼,不知所错。你要明白,再复杂的电路也是由一个个的基本电路拼装出来的。 (2) 基础知识当然是少不了的,常用的基本电路结构搞搞清楚。 (3) 分析电路之前先要…...

帮公司面试了一个30岁培训班出来的程序员,没啥工作经验...

首先,我说一句:培训出来的,优秀学员大有人在,我不希望因为带着培训的标签而无法达到用人单位和候选人的双向匹配,是非常遗憾的事情。 最近,在网上看到这样一个留言,引发了程序员这个圈子不少的…...

勒索软件、网络钓鱼、零信任和网络安全的新常态

当疫情来袭时,网络罪犯看到了他们的机会。随着公司办公、政府机构、学校和大学从以往的工作模式转向远程线上办公模式,甚至许多医疗保健设施都转向线上,这种快速的过渡性质导致了不可避免的网络安全漏洞。消费者宽带和个人设备破坏了企业安全…...

python3 字符串拼接与抽取

我们经常会有对字符串进行拼接和抽取的需求,下面有几个例子可以作为参考。 需求1:取出ip地址的网络地址与网络掩码进行拼接,分别使用shell脚本和python3实现 # echo "192.168.0.1"|awk -F. {print $1"."$2"."…...

Linux就该这么学:存储结构与管理硬盘

Linux系统中常见的目录名称以及相应内容 目录名称应放置文件的内容/boot开机所需文件—内核、开机菜单以及所需配置文件等/dev以文件形式存放任何设备与接口/etc配置文件/home用户主目录/bin存放单用户模式下还可以操作的命令/lib开机时用到的函数库,以及/bin与/sbin下面的命令…...

JSP四大作用域,九大内置对象

面试题:JSP和Servlet的区别?JSP的本质就是servleJSP更加侧重于视图的展示,servlet更注重逻辑的处理。面试题:include指令和jsp:include标签的区别?从效果上来说,没区别。include指令是把两个页面合成一个js…...

机器学习笔记之生成模型综述(五)重参数化技巧(随机反向传播)

机器学习笔记之生成模型综述——重参数化技巧[随机反向传播]引言回顾神经网络的执行过程变分推断——重参数化技巧重参数化技巧(随机反向传播)介绍示例描述——联合概率分布示例描述——条件概率分布总结引言 本节将系统介绍重参数化技巧。 回顾 神经网络的执行过程 上一节…...

1、创建第一个Android项目

1.1、创建Android工程项目:双击打开Android Studio。在菜单栏File中new-->new project3、在界面中选择Empty Activity,然后选择next4、在下面界面中修改工程名称,工程保存路径选择java语言,然后点击finishAndroid studio自动为…...

【python百炼成魔】手把手带你学会python数据类型

文章目录前言一. python的基本数据类型1.1 如何查看数据类型1.2 数值数据类型1.2.1 整数类型1.2.2 浮点数类型1.2.3 bool 布尔数值类型1.2.4 字符串类型二. 数据类型强制转换2.1 强制转换为字符串类型2.2 强制转换为int类型2.3 强制转换函数之float() 函数三. 拓展几个运算函数…...

数据储存以及大小端判断

目录 数据存储 1,二进制存储方式(补码,反码,源码) 2,指针类型 3,大端,小段判断 1,二进制存储方式(补码,反码,源码) 我…...

GRASP设计原则

GRASP设计原则介绍9种基本原则创建者 Creator问题解决方法何时不使用?好处信息专家 Information Expert问题解决方法信息怎么做优点低耦合 Low Coupling耦合问题解决方法原则何时不使用?控制器 Controller问题解决方法外观控制器会话控制器优点臃肿控制器的解决方法高内聚 Hi…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)

前言&#xff1a; 最近在做行为检测相关的模型&#xff0c;用的是时空图卷积网络&#xff08;STGCN&#xff09;&#xff0c;但原有kinetic-400数据集数据质量较低&#xff0c;需要进行细粒度的标注&#xff0c;同时粗略搜了下已有开源工具基本都集中于图像分割这块&#xff0c…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...

学习一下用鸿蒙​​DevEco Studio HarmonyOS5实现百度地图

在鸿蒙&#xff08;HarmonyOS5&#xff09;中集成百度地图&#xff0c;可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API&#xff0c;可以构建跨设备的定位、导航和地图展示功能。 ​​1. 鸿蒙环境准备​​ ​​开发工具​​&#xff1a;下载安装 ​​De…...

保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!

目录 补间动画 1.创建资源文件夹 2.设置文件夹类型 3.创建.xml文件 4.样式设计 5.动画设置 6.动画的实现 内容拓展 7.在原基础上继续添加.xml文件 8.xml代码编写 (1)rotate_anim (2)scale_anim (3)translate_anim 9.MainActivity.java代码汇总 10.效果展示 逐帧…...