RT-Thread学习笔记(13):软件定时器

2023-05-16

目录

  • 硬件定时器和软件定时器
  • 软件定时器的运作机制
  • 定时器超时函数

硬件定时器和软件定时器

硬件定时器是芯片本身提供的定时功能。一般是由外部晶振提供给芯片输入时钟,芯片向软件模块提供一组配置寄存器,接受控制输入,到达设定时间值后芯片中断控制器产生时钟中断。硬件定时器的精度一般很高,可以达到纳秒级别,并且是中断触发方式

软件定时器,软件定时器是由操作系统提供的一类系统接口,它构建在硬件定时器基础之上,使系统能够提供不受硬件定时器资源限制的定时器服务,它实现的功能与硬件定时器也是类似的。

使用硬件定时器时,每次在定时时间到达之后就会自动触发一个中断,用户在中断中处理信息;而使用软件定时器时,需要我们在创建软件定时器时指定时间到达后要调用的函数(也称超时函数/回调函数,为了统一,下文均用超时函数描述),在超时函数中处理信息。

软件定时器在被创建之后,当经过设定的时钟计数值后会触发用户定义的超时函数。定时精度与系统时钟的周期有关。一般系统利用SysTick作为软件定时器的基础时钟,超时函数类似硬件的中断服务函数,所以,超时函数也要快进快出,而且超时函数中不能有任何阻塞线程运行的情况,比如rt_thread_delay()以及其它能阻塞线程运行的函数,两次触发超时函数的时间间隔Tick叫定时器的定时周期。

RT-Thread提供的软件定时器支持单次模式周期模式,单次模式和周期模式的定时时间到之后都会调用定时器的超时函数,用户可以在超时函数中加入要执行的工程代码。
单次模式:当用户创建了定时器并启动了定时器后,定时时间到了,只执行一次超时函数之后就将该定时器删除,不再重新执行。
周期模式:这个定时器会按照设置的定时时间循环执行超时函数,直到用户将定时器删除。
在这里插入图片描述
注意:在RT-Thread中创建定时器API接口可以选择软件定时器与硬件定时器,但是硬件定时器超时函数的上下文环境中断,而软件定时器超时函数的上下文是线程。下文所说的定时器均为软件定时器工作模式,RT-Thread中在rtdef.h中定义了相关的宏定义来选择定时器的工作模式:

  • RT_TIMER_FLAG_HARD_TIMER 为硬件定时器。
  • RT_TIMER_FLAG_SOFT_TIMER为软件定时器。

软件定时器的运作机制

软件定时器是系统资源,在创建定时器的时候会分配一块内存空间。当用户创建并启动一个软件定时器时, RT-Thread会根据当前系统rt_tick时间及用户设置的定时确定该定时器唤醒时间timeout,并将该定时器控制块挂入软件定时器列表rt_soft_timer_list。

在RT-Thread定时器模块中维护着两个重要的全局变量:

  • rt_tick,它是一个32位无符号的变量,用于记录当前系统经过的tick时间,当硬件定时器中断来临时,它将自动增加1。
  • 软件定时器列表rt_soft_timer_list。系统新创建并激活的定时器都会以超时时间升序的方式插入到rt_soft_timer_list列表中。系统在定时器线程中扫描rt_soft_timer_list中的第一个定时器,看是否已超时,若已经超时了则调用软件定时器超时函数。 否则出软件定时器线程,因为定时时间是升序插入软件定时器列表的,列表中第一个定时器的定时时间都还没到的话,那后面的定时器定时时间自然没到。

在这里插入图片描述
在这里插入图片描述
那么系统如何处理软件定时器列表?系统在不断运行,而rt_tick随着SysTick的触发一直在增长(每一次硬件定时器中断来临,rt_tick变量会加1),在软件定时器线程中扫描rt_soft_timer_list,比较当前系统时间rt_tick是否大于或等于timeout,若是则表示超时,定时器线程调用对应定时器的超时函数,否则退出软件定时器线程 。

使用软件定时器时候要注意以下几点:

  • 软件定时器的超时函数中应快进快出,绝对不允许使用任何可能引软件定时器起线程挂起或者阻塞的API接口,在超时函数中也绝对不允许出现死循环。
  • 软件定时器使用了系统的一个队列和一个线程资源,软件定时器线程的优先级默认为RT_TIMER_THREAD_PRIO。
  • 创建单次软件定时器,该定时器超时执行完超时函数后,系统会自动删除该软件定时器,并回收资源。
  • 定时器线程的堆栈大小默认为RT_TIMER_THREAD_STACK_SIZE,512个字节。

定时器超时函数

在RT-Thread实时操作系统中,定时器超时函数存在着两种情况:

  • 超时函数在(系统时钟)中断上下文环境中执行(硬件定时器);
  • 超时函数在线程的上下文环境中执行(软件定时器)。

如果超时函数是在中断上下文环境中执行,显然对于超时函数的要求与中断服务例程的要求相同:执行时间应该尽量短执行时不应导致当前上下文挂起、等待。例如在中断上下文中执行的超时函数它不应该试图去申请动态内存、释放动态内存等,也不允许调用rt_thread_delay()等导致上下文挂起的API接口。
在这里插入图片描述
软件定时器的超时函数在线程上下文中执行,则不会有这个限制,但是通常也要求超时函数执行时间应该足够短,不允许在超时函数中有阻塞的情况出现更不允许有死循环,也不应该影响到其他定时器执行超时函数本定时器的下一次超时回调。软件定时器的超时函数在线程中执行,下面一起来看看软件定时器超时函数是怎么样实现的。

在RT-Thread启动的时候会创建几个必要的线程:main_thread_entry线程、rt_thread_idle_entry线程、rt_thread_timer_entry线程。rt_thread_timer_entry是定时器线程,用于扫描软件定时器列表中是否有超时的定时器,然后执行其对应的超时函数
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
本节笔记参考于:野火-《RT-Thread内核实现与应用开发实战》

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RT-Thread学习笔记(13):软件定时器 的相关文章

随机推荐

  • prometheus编译安装

    prometheus是搜集应用程序所使用的CPU 内存 以及磁盘使用大小的神器 xff0c 它可以根据用户所配置的性能阀值给出相应的处理 xff0c 比如 邮件告警等 xff0c 在这里就不啰嗦了 xff0c 由于本人也是刚刚学习 所以能说
  • 不同硬件传感器数据之间的时间同步问题

    主要分为硬同步和软同步 硬同步就是用一个硬件触发器 xff0c 直接通过物理信号 xff0c 触发相机和LIDAR记录一个data frame 软同步提供一个相同的时间源 xff08 一般都是主控电脑utc时间 xff09 给相机和LIDA
  • 多传感器融合定位开源工程与论文

    目录 1 LIC Fusion xff1a 基于激光雷达 惯性导航和相机结合的里程计 2 使用点线特征配合激光雷达辅助的单目视觉里程计 3 间歇的GPS辅助VIO xff1a 在线初始化和标定 4 强大的高精度视觉惯性激光SLAM系统 5
  • [BLE]CC2640之定时器(Clock)事件

    一 定时器 xff08 Clock xff09 所谓定时器本质上递减计数器 xff0c 当计数器减到零时可以触发某种动作的执行 这种动作可以通过回调函数来实现 xff0c 当定时器计时完成后 xff0c 自定义的回调函数会立即被调用 回调函
  • [BLE]低功耗蓝牙介绍

    一 BLE的协议栈框架 BLE协议栈包括两个部分 xff0c 主机 Host 和控制器 Controller 二者通过HCI Host Controller Interface 标准接口相互通信 常用的单芯片单模BLE芯片有TI的CC254
  • [BLE]低功耗蓝牙之GAP、GATT

    一 开篇 本篇主要介绍一下关于BLE开发过程中必须了解的两个协议 xff1a GAP xff08 通用访问协议 xff09 GATT xff08 通用属性协议 xff09 两个协议都隶属于Host层 xff0c 直接关系到应用层开发 xff
  • [memory]虚拟地址空间分布

    一 开篇 踏入嵌入式软件行业也接近2年了 xff0c 从研一开学起懵懵懂懂的开始学习C语言 xff0c 由于本科时对这方面了解的少之又少 xff0c 所以学起来比较困难 xff0c 但是有一群无私奉献的小伙伴 xff0c 慢慢的 xff0c
  • Pixhawk之UAV控制理论、ardupilot源码框架介绍

    一 开篇 您有无人机么 xff1f 没有 那赶紧去某宝买一套 昨天 开会开到接近下午一点钟 xff0c 收获相当大 xff0c 原本不太清楚的ardupilot框架现在也大致熟悉了 xff0c 接下来主要就是结合源码了解其控制过程了 xff
  • RT-Thread学习笔记(11):互斥量

    目录 互斥量的优先级继承机制互斥量和二值信号量的区别 互斥量的运作机制互斥量控制块 互斥量的优先级继承机制 在RT Thread操作系统中为了降低优先级翻转问题利用了优先级继承算法 优先级继承算法是指 xff0c 暂时提高某个占有某种资源的
  • [BLE]CC2640之ADC功能实现和供电电压的采集

    一 开篇 Write programs that do one thing and do it well 发现很多人关于使用CC2640 CC2650的过程中比较难以应对的问题就是实现ADC xff0c 为了方便大家 xff0c 所以有了本
  • [Index]博文索引

    为了方便查看需要的博文 xff0c 在此给出所有博文的索引链接地址 UAV Software Version xff1a ArduCopter xff08 Ver 3 3 xff09 Hardware Version xff1a pixha
  • Pixhawk之姿态解算篇(1)_入门篇(DCM Nomalize)

    一 开篇 慢慢的 慢慢的 慢慢的就快要到飞控的主要部分了 xff0c 飞控飞控就是所谓的飞行控制呗 xff0c 一个是姿态解算一个是姿态控制 xff0c 解算是解算 xff0c 控制是控制 xff0c 各自负责各自的任务 xff0c 我也不
  • Pixhawk之姿态解算篇(4)_补充篇

    一 开篇 大家期待已久的第四篇来了 xff0c 但是本篇可能比较水啊 见谅 首先 xff0c 上一周没有什么收获 xff0c 虽然看了不少的论文 xff0c 但是却没有什么质的飞越 看的论文都是关于姿态解算的 xff0c 用的算法大部分也都
  • Pixhawk之学习杂谈

    一 开篇 距离上一篇博文已经很久了 xff0c 最近主要就是参加了几家公司的电话面试 xff0c 思考了一些问题 xff0c 本身就是半路杀进无人机领域的门外汉 对整个飞行控制部分理解的也是皮毛的皮毛 xff0c 经过几家面试之后 xff0
  • Pixhawk之姿态控制篇(2)_控制策略

    一 开篇 写在前面 xff1a 先占坑 现在关于该部分内部还在完善 xff0c 后续不上 三 实验平台 Software Version xff1a PX4Firmware Hardware Version xff1a pixhawk ID
  • Pixhawk之姿态解算篇(5)_ECF/EKF/GD介绍

    一 开篇 很久没更新blog了 xff0c 最近研究的东西比较杂乱 xff0c 也整理了很多东西 xff0c 没有来的及更新 xff0c 最近发现很多小伙伴都开始写blog了 xff0c 在不更新就要 被落后了 兄弟们 xff0c 等等我啊
  • Pixhawk之姿态解算篇(6)_Gradient Descent

    一 开篇 在多旋翼进行姿态估计的过程中 xff0c 最简单的就是直接使用gyro测量角速度进行积分求取欧拉角 xff08 RPY xff09 xff0c 但是由于gyro自身存在的bias和drift xff0c 导致直接测量过程随着时间的
  • C/C++程序编译步骤以及如何生成可执行文件

    一 开篇 许久不碰关于这方面的知识了 xff0c 前几天同学开课提及到该部分 xff0c 正好作为回顾吧 C C 43 43 语言很多人都比较熟悉 xff0c 这基本上是每位大学生必学的一门编程语言 xff0c 通常还都是作为程序设计入门语
  • NVIDIA Jetson Xavier NX 命令手册

    INDEX 1 风扇控制 1 风扇控制 因为JETSON系列都是读取 target pwm 文件进行风扇控制 xff0c 修改此文件数值即可控制 xff08 风扇转速在0 250之间选择 xff09 span class token fun
  • RT-Thread学习笔记(13):软件定时器

    目录 硬件定时器和软件定时器软件定时器的运作机制定时器超时函数 硬件定时器和软件定时器 硬件定时器是芯片本身提供的定时功能 一般是由外部晶振提供给芯片输入时钟 xff0c 芯片向软件模块提供一组配置寄存器 xff0c 接受控制输入 xff0