RT-Thread 时钟 timer delay 相关

news2024/10/5 20:23:54

前言

  • 此处,介绍对delay 时钟 timer 这几部分之间的关联和相关的知识点;
  • 本来只是想介绍一下 delay的,但是发现说到delay 不先 提到 先验知识 晶振\时钟\时钟节拍\定时器 好像没法解释透彻,所以就变成了 晶振\时钟\时钟节拍\定时器\delay 的很简单的概括一遍;
  • 并附带上能直接运行的示例代码;

一个可以跳过的Tip -> 为了大家方便跳过,我设置成了图片,赶时间可以不点开

在这里插入图片描述


晶振 \ 时钟 \ 时钟节拍 \ 定时器 \ delay

定义

  • 晶振(Crystal Oscillator):
    晶振是硬件级别的时钟源,为微控制器(MCU)提供基准频率。它是系统所有时间相关功能的根基。晶振的频率决定了MCU的主时钟频率,通常称为HCLK(主时钟)。这个频率是非常重要的,因为它直接影响到微控制器的执行速度和整个系统的性能。
  • 时钟(Clock):
    在 RT-Thread 中,时钟通常指的是系统时钟,它是由晶振通过分频、倍频等方式产生的。系统时钟为操作系统和应用程序提供时间基准。系统时钟可以分为不同的类别,如核心时钟、外设时钟等,它们由晶振经过不同的处理得到。
  • 时钟节拍(Tick):
    时钟节拍是操作系统的基本时间单位,RT-Thread 通过硬件定时器来产生固定频率的时钟节拍。每一个时钟节拍代表操作系统中一个最小的时间片段。操作系统利用这些时钟节拍来进行任务调度、延时处理等操作。时钟节拍的频率(通常称为Tick Rate)决定了系统调度的精度和响应速度。例如,一个Tick Rate为1000Hz的系统每个时钟节拍代表1ms。
  • 定时器(Timer):
    定时器是基于时钟节拍工作的,用于执行定时任务。在 RT-Thread 中,定时器可以是一次性的或周期性的。定时器使用时钟节拍来计算时间,当达到指定的时钟节拍数时,定时器超时并执行相应的回调函数。
  • delay:
    delay 函数(在 RT-Thread 中通常为 rt_thread_delay())用于暂停当前线程执行指定的时间段。这个延时是以时钟节拍为单位的。当线程调用 rt_thread_delay() 时,它会被挂起,直到指定的时钟节拍数过去。在这段时间内,调度器会将CPU控制权转移给其他就绪状态的线程。

前面的解释可能太长了,我们再精简一点


  • 晶振(Crystal Oscillator):
    晶振提供了硬件级别的时钟源,它确定了微控制器(MCU)的主时钟频率(HCLK),这直接影响微控制器的执行速度和整个系统的性能。晶振是所有时间管理和计时功能的基础。
  • 时钟(Clock):
    系统时钟是由晶振产生的,可以通过分频、倍频等方式调整,为操作系统和应用程序提供时间基准。时钟可以有不同的类型(如核心时钟、外设时钟),它们支持系统各个部分的运作和时间管理。
  • 时钟节拍(Tick):
    时钟节拍是由系统时钟驱动的,表示操作系统的基本时间单位,用于任务调度和时间管理。时钟节拍的频率(Tick Rate)决定了系统的调度精度和响应速度,每个时钟节拍代表了系统中的一个固定时间片。
  • 定时器(Timer):
    定时器利用时钟节拍来计划和执行定时任务。它可以设置为一次性或周期性,用于在特定的时间点或经过特定时间段后执行任务。定时器的工作是基于时钟节拍的,它们使得在精确的时间执行任务成为可能。
  • delay:
    rt_thread_delay() 函数用于使当前线程暂停执行特定的时钟节拍数,从而提供延时功能。如果调用官方api,在此期间,CPU的控制权会转移给其他就绪状态的线程,实现有效的多任务处理。

一句话概括


  • 晶振为系统提供基本的时间频率,系统时钟根据晶振调整形成不同的时间基准
  • 时钟节拍根据系统时钟生成,为操作系统提供一个均匀的时间度量
  • 定时器和延时功能(delay)则是基于这些时钟节拍来安排和管理时间和任务的执行。
  • 观察 \ 运行 \ 修改 下方代码,获得更深入了解

示例代码

  • 通过这个示例,可以展示 RT-Thread 如何处理线程延时和定时器回调,以及如何利用系统的时钟节拍来进行时间管理和任务调度。
  • 在这个示例中,我们首先创建了一个线程 my_thread,它在一个循环中每隔一秒打印一次计数器 count 的值,并通过 rt_thread_delay() 函数实现延时。RT_TICK_PER_SECOND 定义了一秒内的时钟节拍数,因此 rt_thread_delay(RT_TICK_PER_SECOND) 将使线程延时一秒。
  • 接下来,我们创建了一个周期性定时器 my_timer,它每秒触发一次,并在每次触发时打印出 “Timer tick”。定时器使用 RT_TICK_PER_SECOND 作为超时时间,设置为周期性定时器 RT_TIMER_FLAG_PERIODIC,这意味着它会每隔一秒自动重启并触发回调函数 timer_callback。
#include <rtthread.h>

#define THREAD_PRIORITY 25
#define THREAD_STACK_SIZE 512
#define THREAD_TIMESLICE 5

/* 定义线程控制块 */
static struct rt_thread my_thread;
/* 定义线程栈 */
ALIGN(RT_ALIGN_SIZE)
static rt_uint8_t my_thread_stack[THREAD_STACK_SIZE];

/* 线程入口函数 */
static void my_thread_entry(void *parameter)
{
    rt_uint32_t count = 0;

    /* 线程主循环 */
    while (1)
    {
        /* 打印信息并延时一秒 */
        rt_kprintf("Thread count: %d\n", count++);
        rt_thread_delay(RT_TICK_PER_SECOND); // 延时1秒,RT_TICK_PER_SECOND是系统时钟节拍数,代表一秒
    }
}

/* 定时器回调函数 */
static void timer_callback(void *parameter)
{
    rt_kprintf("Timer tick\n");
}

/* 应用程序入口 */
int main(void)
{
    rt_timer_t my_timer;
    rt_err_t result;

    /* 初始化线程 */
    result = rt_thread_init(&my_thread,
                            "mythread",
                            my_thread_entry,
                            RT_NULL,
                            &my_thread_stack[0],
                            sizeof(my_thread_stack),
                            THREAD_PRIORITY,
                            THREAD_TIMESLICE);
    if (result == RT_EOK)
    {
        rt_thread_startup(&my_thread);
    }

    /* 创建定时器 */
    my_timer = rt_timer_create("mytimer",          // 定时器名称
                               timer_callback,     // 定时器到期时回调的函数
                               RT_NULL,            // 调用回调函数时传递的参数
                               RT_TICK_PER_SECOND, // 定时时间,这里设置为1秒
                               RT_TIMER_FLAG_PERIODIC); // 定时器模式,周期性执行

    /* 启动定时器 */
    if (my_timer != RT_NULL)
    {
        rt_timer_start(my_timer);
    }

    return 0;
}


  • 写到这里了,其实对 delay 定时器 基本的了解已经搭建起来了,其实对于开发而言,差不多够用了
  • 感兴趣的话,可以继续往下翻,我们看一下更深入的准确的定义

在这里插入图片描述


定义

  • delay 和 sleep 是两种差不多的操作在不同平台上的叫法
  • 一般不需要太过关注如何区分,在这里我们看作是一样的
  • delay 我们这里提到两种实现方式,一种是通过估计计算耗时来实现延时;另一种是 Timer定时器实现;通过估计计算耗时的方式我们没什么好说的,我们关注的是 相对智能的\高效的 基于 时钟(timer)实现的
  • 在介绍之前,我们需要一起提到 晶振\时钟\时钟节拍\定时器\delay 之间的关系
  • 在 RT-Thread 实时操作系统中,delay 函数(如 rt_thread_delay())用于挂起当前线程一定的时间。在这段时间内,CPU 将不会执行当前线程,而是转而执行其他的就绪状态线程。如果没有其他线程处于就绪状态,则可能执行空闲线程(idle thread),该线程通常用于执行低优先级的后台任务,如内存清理和系统监视。

  • RT-Thread 的 rt_thread_delay() 函数是专门设计用于多任务环境的,不同于 MicroPython 的 time.sleep(),RT-Thread 的延时操作是为多线程设计的,确实会将 CPU 时间让给其他的线程。这是因为 RT-Thread 是一个完整的实时操作系统,支持多线程和任务调度,所以它可以在一个线程暂停执行时调度其他线程运行。

  • 在 RT-Thread 中,当你调用 rt_thread_delay() 时,你实际上是将当前线程放入睡眠状态直到指定的延时时间过去。这个功能使得 CPU 资源可以被有效地分配给其他需要执行的线程,从而提高系统的总体效率和响应性。

  • 总结来说,RT-Thread 中的 delay 类操作(如 rt_thread_delay())确实会导致当前线程挂起,并允许其他线程使用 CPU。这与 MicroPython 中的 time.sleep() 在操作系统层面上有相似的效果,尽管底层的实现机制和支持的功能可能不同,因为 RT-Thread 是一个多线程的实时操作系统,而 MicroPython 通常运行在单线程环境中。

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

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

相关文章

STM32物联网(封装AT指令进行TCP连接及数据的接收和发送)

文章目录 前言一、AT指令函数封装1.向ESP8266发送数据函数2.设置ESP8266工作模式3.连接WIFI函数4.查询IP地址5.连接TCP服务器6.发送数据到TCP服务器7.接收并解析来自TCP服务器的数据8.关闭TCP服务器 二、代码测试总结 前言 本篇文章将继续带大家学习STM32物联网&#xff0c;那…

二百二十四、Kettle——曲线实现从Hive插入更新到ClickHouse(分区字段是month或year)

一、目的 对于以month、year为分区字段的数据&#xff0c;不是像day字段分区那样每天增量插入更新即可&#xff0c;而是要以部分字段查询、部分字段更新&#xff0c;但是ClickHouse数据库并不适合更新操作&#xff0c;直接使用Kettle的插入更新控件会导致问题&#xff0c;必须…

前后端联调可能出现的问题

调不到后端数据 前后端传参方式不一样 --- formdata 主要接收文件 或者有文件和数据 --- json 纯数据

Linux命令 - 如何查询当前已使用的内存占比

结果先行 free -h | awk NR2{printf "%.2f%%", $3*100/$2 }解释一下 这个命令组合了 free -h 和 awk 命令来输出已用内存的百分比。我们一步一步来解析这个命令&#xff1a; Step 1 free -hfree 是一个用来显示 Linux 系统内存使用情况的命令。-h 参数是 “human…

《TCP/IP详解 卷一》第2章 Internet地址结构

目录 2.1 引言 2.2 表示IP地址 2.3 基本的IP地址结构 单播地址 全球单播地址&#xff1a; 组播地址 任播地址 2.4 CIDR和聚合 2.5 特殊用途地址 2.6 分配机构 2.7 单播地址分配 2.8 与IP地址相关的攻击 2.9 总结 2.1 引言 2.2 表示IP地址 IPv4地址&#xff1a;3…

2024-2-22 作业

作业要求&#xff1a; 复习前面知识点(指针、结构体、函数)整理思维导图顺序表(按位置插入、按位置删除和去重、重新写)理解链表的代码&#xff0c;尝试写一下链表的尾插和输出 1.复习前面知识点(指针、结构体、函数) 2.整理思维导图 3.顺序表(按位置插入、按位置删除和去重、…

Seurat包学习:如何查看R包函数源代码

​我们很多时候都很好奇作者的r包是如何写出来的&#xff0c;手痒的时候就想学习一下源码&#xff0c;顺便改一改 问题来源 为什么要写今天这个推文呢&#xff1f; 起因是因为我想使用seurat自带函数画热图&#xff0c;奈何这个图不是那么好看 DoHeatmap(pbmc,features fea…

2024-02-21 作业

作业要求&#xff1a; 复习课上内容 //已完成结构体字节对齐&#xff0c;64位没做完的做完&#xff0c;32位重新都做一遍&#xff0c;课上指定2字节对齐的做一遍&#xff0c;自己验证 //已完成两种验证大小端对齐的代码写一遍复习指针内容 //已完成完善顺序表已写出的…

视频评论抓取软件|抖音数据抓取工具

最近我们推出了一款基于C#语言开发的工具。这款工具提供了丰富的功能&#xff0c;旨在帮助用户轻松获取抖音视频内容。让我们一起来详细介绍一下这款工具的主要功能模块&#xff1a; 1. 批量视频提取&#xff1a; 工具提供了便捷的批量视频提取功能&#xff0c;用户只需输入关…

cookie伪造 [BSidesCF 2019]Kookie1

打开题目 提示用admin用户登录 尝试弱口令发现&#xff0c;登录失败 显示用admin&passwordadmin!进行登录 有发现说cookie&#xff0c;就尝试用cookie登录&#xff1a; f12编辑添加cookie重发包: 或者bp抓包 Cookie:usernameadmin 用admin登录成功 得到flag: 参考文章&…

Vue3项目结构分析

node_modules: 是项目npm install下载的node依赖库。 public&#xff1a; favicon.ico: 网页图标logo图片。index.html: 入口html。是一个基础的html页面&#xff0c;其中进行网页最基础的设置&#xff0c;并且设置了id为app的div盒子。该页面即为Vue单页面应用的基础页面。后…

QSettings使用示例

解决的问题&#xff1a; 平常要存储一些临时数据&#xff0c;或者ini的系统参数数据&#xff0c;以下是源码解析 如何实现&#xff1a; 实现的UI如下 主要功能&#xff1a; 初始化&#xff1a; m_settings new QSettings("DParamSetting.ini", QSettings::IniFo…

京东数据分析|京东销售数据怎么查|京东销售数据查询软件分享!

京东销售数据分析对商家来说具有多方面的重要作用&#xff0c;主要体现在以下几个方面&#xff1a; 市场趋势分析&#xff1a; 分析京东平台上的商品销量、销售额和价格走势等数据&#xff0c;可以帮助商家了解当前市场的整体需求趋势&#xff0c;以及不同品类的季节性变化、…

PLC为什么要开发网口通讯功能

PLC设置网口通讯功能&#xff0c;是现场总线向工业以太网的迈进&#xff0c;更是为了在网口之上构建更为庞大、开放的大一统的生态系统。 有了以太网&#xff0c;特别是TCP/IP协议后&#xff0c;全员工控人的日常工作更为便利了。 主要体现在以下4点&#xff1a; 1.再也不需要…

01VScode开发stm32环境搭建

title: VScode开发stm32环境搭建 tags: STM32vscode 1.准备工作 1.下载并安装VSCODE 在百度上搜索vscode记住一定要是官方的 不然你自己就是在给自己下毒2345全来了 打红圈一定要有不然就是在垃圾网站上下的 VSCode下载链接 选一个适合你的      安装正常流程走就行不再…

团簇束流沉积技术:氢气传感器守护安全与环境的利器

在当今日益增长的能源需求背景下&#xff0c;氢气作为一种清洁、高效的能源载体&#xff0c;正逐渐受到广泛关注。然而&#xff0c;氢气的易燃易爆特性也带来了不小的安全隐患。因此&#xff0c;精确、快速地监测氢气泄漏成为了确保生产安全和环境监测的重中之重。基于团簇束流…

一些可以参考的文档集合16

之前的文章集合: 一些可以参考文章集合1_xuejianxinokok的博客-CSDN博客 一些可以参考文章集合2_xuejianxinokok的博客-CSDN博客 一些可以参考的文档集合3_xuejianxinokok的博客-CSDN博客 一些可以参考的文档集合4_xuejianxinokok的博客-CSDN博客 一些可以参考的文档集合5…

[C#]winform基于opencvsharp结合pairlie算法实现低光图像增强黑暗图片变亮变清晰

【低光图像增强介绍】 在图像处理领域&#xff0c;低光图像增强是一个具有挑战性的任务。由于光线不足&#xff0c;这些图像往往呈现出低对比度、高噪声和细节丢失等问题&#xff0c;严重影响了图像的视觉效果和后续分析的准确性。因此&#xff0c;开发有效的低光图像增强方法…

无刷电机的2种电流采样方式以及优缺点比较

低端电流采样&#xff1a; 在低端采样方式中&#xff0c;电流检测电阻&#xff08;分流电阻&#xff09;通常被放置在逆变器下桥臂MOSFET或IGBT的低端&#xff0c;即靠近电机绕组的地线侧。这种情况下&#xff0c;只有当对应相位的下管导通时&#xff0c;才能通过这个电阻来测量…

命令绕过 [安洵杯 2019]easy_web1

打开题目 打开题目在URL处看到cmd&#xff0c;本能的直接用系统命令ls 发现被过滤了。又注意到imgTXpVek5UTTFNbVUzTURabE5qYz0似乎是一串base64 拿去base64解码 再hex解码一次得到555.png 再将其hex加密 base64加密 反向推出index.php的payload:?imgTmprMlJUWTBOalUzT0RK…