UCOSIII笔记(十四)时间戳

🔥作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生,研究方向无线联邦学习

🎬擅长领域:驱动开发,嵌入式软件开发,BSP开发

❄️作者主页:一个平凡而乐于分享的小比特的个人主页

✨收录专栏:UCOS-III,本专栏为UCOS-III学习记录

欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖

UCOSIII笔记(十四)时间戳

第一部分:什么是时间戳?为什么需要它?

1.1 生活中的比喻

想象一下,你和朋友在赛跑。你需要知道的不仅仅是谁赢了 (就像CPU知道哪个中断发生了),更重要的是他跑了多快 ,或者他比你快了多少秒

在操作系统中,情况类似:

  • 中断发生了 -> 我们知道"有人冲线了"。
  • 中断响应了多快? -> 我们不知道"他跑了多少秒"。

这个 "多少秒" ,在操作系统中,就是 "时间戳" 。它是一个高精度的"电子秒表",用来记录某个事件发生的精确时刻。

1.2 在 µC/OS-III 中的定义

时间戳 是 µC/OS-III 的一个功能,用于测量和记录代码执行过程中关键事件发生的精确时间点。它就像一个嵌入在系统内核里的高精度计时器。

为什么需要它?

主要用于性能分析和调试

  • 测量中断延迟:从中断发生到中断服务程序开始执行,花了多长时间?
  • 测量任务切换时间:从一个任务切换到另一个任务,需要多久?
  • 测量信号量、互斥锁的获取时间:等待一个资源等了多久?
  • 测量一段关键代码的执行时间:执行这个算法到底用了多少个时钟周期?

第二部分:时间戳是如何实现的?

µC/OS-III 时间戳的实现可以分为硬件依赖软件服务两部分。

2.1 硬件基础:那个"高精度秒表"

要实现时间戳,首先需要一个稳定、高速、且独立于CPU主频的计时器 。这通常是一个32位或64位的自由运行计数器

  • 它是什么? 一个硬件计数器,上电后就从0开始,每个时钟周期自动加1,永不停止,也不会被软件重置或写入
  • 它在哪里?
    • DWT周期计数器 :在 ARM Cortex-M 等内核中,有一个叫做 DWT 的调试组件,其中的 CYCCNT 寄存器就是一个非常理想的32位自由运行计数器。
    • 专用定时器/计数器:在其他架构中,可能会使用一个专用的硬件定时器来实现。

这个计数器就是我们的"电子秒表"!

2.2 软件服务:µC/OS-III 如何读取"秒表"

µC/OS-III 通过一组简单的 API 函数来读取这个硬件计数器的值,并将其与内核事件关联起来。

核心函数如下:

函数名 功能描述 生活比喻
OS_TS_GET() 获取当前时间戳。直接读取硬件计数器的当前值。 看一眼秒表,记下当前时刻(比如 12分35秒123)。
OS_TS_TINIT() 初始化时间戳模块。通常用于设置时间戳计数器的初始偏移量。 在比赛开始前,把秒表归零。
OSIntEnter() / OSIntExit() 中断进入/退出函数 。在这些函数内部,µC/OS-III 自动地记录下时间戳。 运动员冲线时,自动按下计时按钮。

第三部分:核心场景剖析------测量中断延迟

这是时间戳最经典的应用场景。我们通过它来理解整个工作流程。

目标:测量从"按键被按下(外部中断发生)"到"中断服务程序第一条指令开始执行"所经过的时间。

假设

  • 我们的硬件计数器 DWT_CYCCNT 频率是 100MHz(每10纳秒加1)。
  • 按键连接到一个GPIO,按下会产生外部中断。

测量流程与图示

  1. 中断发生!
    • 按键按下,CPU检测到中断信号。
  2. CPU 响应中断(硬件自动操作)
    • CPU 完成当前指令。
    • 将上下文(寄存器等)压栈。
    • 跳转到中断向量表指定的地址。
  3. 进入 µC/OS-III 的中断入口:OSIntEnter()
    • 在这个函数里,µC/OS-III 立即 调用 OS_TS_GET() 获取当前计数器的值,并存储在一个全局变量中(例如 OSIntEnterTS)。
    • 记下时刻 T1T1 = DWT_CYCCNT (假设此时值为 1,000,000)
  4. 执行用户的中断服务程序
    • 现在才开始执行你为按键写的 Key_ISR() 函数。
  5. 退出中断:OSIntExit()
    • 中断处理完毕,在 OSIntExit() 中,内核可能会再次获取时间戳,用于其他内部计算。

计算中断延迟

在你的 Key_ISR() 函数里,你可以立刻再次读取 DWT_CYCCNT,得到 T2(假设为 1,000,500)。

中断延迟时间 = (T2 - T1) * 计数器周期

= (1,000,500 - 1,000,000) * 10 ns

= 500 * 10 ns = 5000 ns = 5 µs


第四部分:关键特性对比与总结

为了让理解更深刻,我们用一个表格来对比 时间戳 和 µC/OS-III 中另一个常见的计时功能------系统时钟节拍

特性 时间戳 系统时钟节拍
目的 高精度测量、性能分析 任务延时、时间片轮转、超时管理
精度 非常高(时钟周期级别,纳秒级) 很低(毫秒级,如1ms, 10ms一个节拍)
硬件 自由运行计数器(如 DWT CYCCNT) 周期性定时器(如 SysTick)
是否中断 无中断,直接读取寄存器 有中断,每个节拍产生一次中断
数据用途 记录时间点 进行时间长度的计数
比喻 高速摄影机、电子秒表 挂钟、节拍器
场景 "测量刘翔跨栏用了多少秒" "提醒你每隔45分钟下课休息"

总结

  • µC/OS-III 时间戳 是一个基于硬件高性能计数器的调试和性能分析工具。
  • 它的实现依赖底层硬件 提供一个自由运行的计数器,µC/OS-III 通过 OS_TS_GET() 等宏或函数来读取它。
  • 内核在关键位置(如中断入口/出口、任务切换点)自动记录时间戳,为开发者提供了测量代码执行时间的"原始数据"。
  • 通过计算两个时间戳的差值,开发者可以精确量化中断延迟、任务切换时间等关键性能指标,是进行系统优化和问题定位的利器
相关推荐
YJlio2 小时前
ShareEnum 学习笔记(9.5):内网共享体检——开放共享、匿名访问与权限风险
大数据·笔记·学习
泽虞2 小时前
《STM32单片机开发》p7
笔记·stm32·单片机·嵌入式硬件
FakeOccupational3 小时前
电路笔记(信号):网线能传多少米?网线信号传输距离
开发语言·笔记·php
Yawesh_best12 小时前
告别系统壁垒!WSL+cpolar 让跨平台开发效率翻倍
运维·服务器·数据库·笔记·web安全
Ccjf酷儿14 小时前
操作系统 蒋炎岩 3.硬件视角的操作系统
笔记
习习.y15 小时前
python笔记梳理以及一些题目整理
开发语言·笔记·python
在逃热干面15 小时前
(笔记)自定义 systemd 服务
笔记
DKPT17 小时前
ZGC和G1收集器相比哪个更好?
java·jvm·笔记·学习·spring
QT 小鲜肉18 小时前
【孙子兵法之上篇】001. 孙子兵法·计篇
笔记·读书·孙子兵法