FreeRTOS软件定时器的原理以及使用实例

news2024/11/24 1:47:11

FreeRTOS软件定时器的使用

  • 一.软件定时器介绍
  • 二.软件定时器工作原理
  • 三.创建软件定时器
  • 四.总结

一.软件定时器介绍

我们知道,如果是裸机系统的话,定时器都是由硬件中断完成的。还有一个中断服务函数。而FreeRTOS是一个操作系统,它提供了软件定时器。它也是由系统心跳完成计数的。并不会单独产生硬件中断,同时也不用去写中断服务函数。不过的是我们只需要写一个回调函数即可。(创建软件定时器时,传递函数地址即可)如创建任务一样。

二.软件定时器工作原理

当我们创建出软件定时器时,它会把这个定时器挂载在定时器链表中。如图:
在这里插入图片描述
那么freeRTOS是如何知道定时器是否超时了呢?这里就设计的十分巧妙了!!认真看,这也是关键的地方。
其实我们系统也有一个时间,由全局变量xTimeNow进行计数的。系统时钟节拍跳一下就加1 ,系统时钟节拍在FreeRTOSConfig.h配置,下面是1ms跳一次。

#define configTICK_RATE_HZ	(( TickType_t )1000)					  

如果需要的可以去看博主的这篇文章FreeRTOSConfig.h文件讲解
如果当前加入一个定时器1。假设当前系统时间xTimeNow=20,定时器1定时长度为30。那么定时器链表如图所示:
在这里插入图片描述
那么过了10个系统时间我再创建一个定时器2,且定时器2定时长度为40。定时器链表又是什么样的呢?
在这里插入图片描述

假设我们此时系统时间已经到了50,那么就已经到了定时器1触发的时间了,那么操作系统又进行怎么样的操作呢。这是FreeRTOS会调用定时器1的回调函数,同时如果定时器1是周期定时器,就会重新挂载到定时器链表中,挂载时间是:当前时间+定时器定时时长,在这种情况下,就是50+30。如图:
在这里插入图片描述
当软件定时器2到了触发时间,同理,调用软件定时器2的回调函数,再重新挂载软件定时器2到链表中。
在这里插入图片描述
如此一来,就实现了软件定时器。

三.创建软件定时器

到了这一步就非常简单了,只需要调用FreeRTOS操作系统的API函数接口即可。

static TimerHandle_t tiemr1_Handle=NULL;
static void tiemr1_Callback();
timer1_Handle=((const char *)"timer1"
               (TickType_t)1000  //1000个系统时间
                (UBaseType_t)pdTRUE  //周期模式
                (void *)1 //分配定时器ID
                (TimerCallbackFunction_t)timer1_Callback)
                );
 if(timer1_Handle!=NULL)
 {
   xTimerStart(timer1_Handle,0);//开启定时器1
 }
 static void timer1_Callback()
 {
 /*
  
  */

 }

四.总结

FreeROTS软件定时器直接使用的话比硬件定时器方便很多,但是我们应该知其然而知其所以然。不管学习什么的话,我们尽量去了解它的底层以及原理,这样使用的时候出了问题比较容易去排查。最后,谢谢大家支持,点点关注!!!

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

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

相关文章

MacBook上godep安装和使用

MacBook上godep安装和使用 #会在bin目录生成godep可执行文件 go get github.com/tools/godep#把godep可执行文件放到go的bin目录 cp bin/godep /Users/liang/software/go1.10.3/bin/godep helpgodep version#编译成二进制文件,执行二进制文件启动项目 如&#xff1…

【C++】使用Windows操作系统的API在控制台输出绿色的文本

2023年8月21日&#xff0c;周一下午 #include <Windows.h> #include <iostream>int main() {HANDLE hConsole GetStdHandle(STD_OUTPUT_HANDLE);// 设置文本颜色为绿色SetConsoleTextAttribute(hConsole, FOREGROUND_GREEN); std::cout<<"This text i…

树莓派4B raspiberry设置vnc远程登录

树莓派开启远程登录&#xff0c;本来通过raspi-config就可以设置的&#xff0c;但是这里安装的镜像可能不是官方镜像&#xff0c;导致raspi-config设置不生效。早先的版本可能通过raspi-config选择 Interfacing Options ,选择 Enable VNC就可以安装realvnc-vnc-server&#xff…

企业移动电子邮件管理(MEM)加强数据安全保护

什么是移动电子邮件管理 电子邮件是组织内部官方通信的主要方法&#xff0c;为了保持移动工作人员的连接和工作效率&#xff0c;必须在移动设备上访问其公司邮箱。通过移动电子邮件管理&#xff0c;IT 管理员可以促进在员工的智能手机、平板电脑和笔记本电脑上安全访问企业电子…

主机SSH连接VirtualBox NAT网络模式

遇到的问题 虚拟机使用桥接模式配置网络&#xff0c;主机可以ssh连接&#xff0c;但是虚拟机无法访问网络 使用NAT模式配置网络&#xff0c;虚拟机可以访问网络&#xff0c;但是主机无法通过ssh连接 解决方法 配置虚拟机端口转发 1 首先查看虚拟机ip 2 关闭虚拟机 配置端口…

python3.7 安装pywin32报错,完美解决方法

本机环境 python&#xff1a;3.7 遇到2种报错 第一种 ImportError: DLL load failed: The specified module could not be found.第二种&#xff1a; import win32gui ModuleNotFoundError: No module named ‘win32gui‘解决方法 我安装pywin32时候&#xff0c;是直接pi…

Docker 安装 Redis集群

1. 面试题 1.1 1~2亿条数据需要缓存&#xff0c;请问如何设计这个存储案例 单机单台不可能实现&#xff0c;肯定是用分布式存储&#xff0c;用redis如何落地&#xff1f; 1.2 上述问题工程案例场景设计类题目&#xff0c;解决方案 1.2.1 哈希取余分区 2亿条记录就是2亿个k,v&…

Spring复习:(56)PropertySourcePlaceholderConfigurer的工作原理

PropertySourcePlaceholderConfigurer的用途&#xff1a;通过配置文件&#xff08;比如.properties文件&#xff09;给bean设置属性&#xff0c;替代属性占位符 示例&#xff1a; 属性配置文件 spring.datasource.urljdbc:mysql://xxx.xxx.xxx.xxx/test spring.datasource.us…

C++信息学奥赛1122:计算鞍点

解题思路&#xff1a;这段代码的解题思路如下&#xff1a; 首先定义一个大小为5x5的二维数组arr来存储用户输入的矩阵元素。 使用两层嵌套循环&#xff0c;依次输入矩阵的每个元素。 接下来使用另外一个循环&#xff0c;遍历每一行。在每一行中&#xff0c;通过比较找到该行的…

编码器测速,获取实际速度

本例程中使用的电机为带霍尔编码器的减速电机&#xff0c;电机由三部分组成&#xff1a;减速器&#xff0c;电机以及霍尔编码器。 霍尔编码器工作原理&#xff1a;霍尔编码器通过电磁转换&#xff0c;将机械的位移转化为脉冲信号&#xff0c;并且输出A、B两相的方波信号&#x…

uniapp,使用canvas制作一个签名版

先看效果图 我把这个做成了页面&#xff0c;没有做成组件&#xff0c;因为之前我是配合uview-plus的popup弹出层使用的&#xff0c;这种组件好像是没有生命周期的&#xff0c;第一次打开弹出层可以正常写字&#xff0c;但是关闭之后再打开就不会显示绘制的线条了&#xff0c;还…

Docker(二) Docker容器

在docker中的容器都是由镜像所创建的&#xff0c;一个镜像可以创建多个容器。 一、调试Docker 启动Docker systemctl start docker 查看Docker中有哪些镜像 docker images 下载镜像 docker pull hello-world 运行镜像 docker run hello-world 出现 Hello from Docker! 这…

【方法】分卷压缩文件的密码忘记了怎么办?

压缩分卷压缩文件&#xff0c;和压缩成单个压缩文件一样&#xff0c;都是可以设置密码&#xff0c;保护文件不能被随意打开。 解压带有密码的分卷压缩文件&#xff0c;只需要解压第一个分卷文件&#xff0c;并输入原本设置的密码就可以解压全部分卷。但要是密码忘记了&#xf…

家装小程序制作丨家装行业必备媒介

在当今互联网时代&#xff0c;小程序已经成为许多企业和个人的首选&#xff0c;用于推广和销售产品或服务。对于家装行业来说&#xff0c;自有一款专属的家装小程序能够带来诸多好处。本文将探讨家装小程序制作的优点&#xff0c;并简要介绍相关的流程。 优点 提升用户体验&am…

Windows系统下安装Nginx以及相关端口问题的解决方法详解

系列文章目录 安装Tomac服务器——安装步骤以及易出现问题的解决方法 文章目录 系列文章目录 一 背景 二 安装 2.1 下载Nginx 2.2 选择Nginx版本 2.3 解压Nginx 三 Nginx的使用 3.1 Nginx基本目录 3.2查看80端口是否被占用 3.3 Nginx启动方式 第一种&#xff1a;双…

win10家庭版远程桌面补丁_rdp wrapper

RDP Wrapper Library 就是可以帮你在 Windows 7、Windows 8、Windows 10 家庭版中打开远程桌面的工具。 1、把电脑上打开的安全软件与杀毒软件都关掉&#xff0c;因为这个远程桌面补丁会修改系统文件&#xff0c;所以安全软件可能会拦截。 2、下载RDP Wrapper Library补丁压缩…

RISC-V(1)——RISC-V是什么,有什么用

目录 1. RISC-V是什么 2. RISC-V指令集 3. RISC-V特权架构 4. RiscV的寄存器描述 5. 指令 5.1 算数运算—add/sub/addi/mul/div/rem 5.2 逻辑运算—and/andi/or/ori/xor/xori 5.3 位移运算—sll/slli/srl/srli/sra/srai 5.4 数据传输—lb/lh/lw/lbu/lhu/lwu/sb/sh/sw …

MPLS与SD-WAN哪个更适合企业组网?

MPLS专线和SD-WAN是最为人熟知的两种组网方式&#xff0c;而且二者一个是传统组网方式&#xff0c;一个是新兴产品&#xff0c;所以难免会被放在一起比较。有人会问&#xff0c;MPLS专线和SD-WAN哪个更适合企业组网&#xff1f;其实&#xff0c;MPLS专线和SD-WAN都是企业实现高…

言语理解-中心理解之递进关系及转折关系

例题 例题 例题 记叙&#xff0c;议论多还是 例题 不仅仅依赖程度词&#xff0c;联系下文 例题 例题 例题 例题

​建材商城小程序制作:建材采购更便捷!

建材商城小程序主要用于建材产品的展示、销售和交易。用户可以在小程序中浏览各类建材产品&#xff0c;包括地板、瓷砖、卫浴、灯具等&#xff0c;并获取详细的产品信息、规格参数、价格以及用户评价等。 建材商城小程序优点&#xff1a; 便利的购物体验&#xff1a;建材商城小…