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

Linux内核中的高精度定时器:hrtimer机制详解

Linux内核中的高精度定时器hrtimer机制详解作为一名深耕操作系统和嵌入式开发的工程师我对Linux内核中的高精度定时器hrtimer机制有着深入的理解。hrtimer提供了微秒甚至纳秒级的定时精度是实时应用的关键基础设施。传统定时器的局限传统的基于jiffies的定时器存在以下局限精度受限受HZ值限制通常只有1-10ms精度粒度粗糙无法满足实时应用的需求累积误差长时间运行会产生较大误差hrtimer的核心特性hrtimer提供了以下特性高精度支持微秒甚至纳秒级精度多种时钟源支持多种时钟基准红黑树管理高效地管理大量定时器软中断处理在软中断上下文中执行hrtimer的核心API1. 初始化和设置// 定义hrtimer struct hrtimer my_timer; // 初始化 hrtimer_init(my_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); my_timer.function my_timer_callback; // 时钟类型 // CLOCK_REALTIME: 系统实时时钟受NTP调整影响 // CLOCK_MONOTONIC: 单调时钟不受NTP影响 // CLOCK_BOOTTIME: 包含挂起时间的单调时钟 // 模式 // HRTIMER_MODE_ABS: 绝对时间 // HRTIMER_MODE_REL: 相对时间 // HRTIMER_MODE_PINNED: 绑定到特定CPU2. 启动和取消// 启动定时器相对时间 hrtimer_start(my_timer, ms_to_ktime(100), HRTIMER_MODE_REL); // 启动定时器绝对时间 hrtimer_start(my_timer, ktime_set(5, 0), HRTIMER_MODE_ABS); // 取消定时器 hrtimer_cancel(my_timer); // 尝试取消如果正在执行则等待 int ret hrtimer_try_to_cancel(my_timer); if (ret 1) // 成功取消 else if (ret 0) // 定时器正在执行 // 重启定时器 hrtimer_restart(my_timer);3. 回调函数enum hrtimer_restart my_timer_callback(struct hrtimer *timer) { // 执行定时任务 do_timer_work(); // 如果需要周期性执行重新设置定时器 hrtimer_forward_now(timer, ms_to_ktime(100)); return HRTIMER_RESTART; // 重启定时器 // return HRTIMER_NORESTART; // 不重启 }hrtimer的实现原理1. 数据结构struct hrtimer { struct timerqueue_node node; ktime_t _softexpires; enum hrtimer_restart (*function)(struct hrtimer *); struct hrtimer_clock_base *base; u8 state; u8 is_rel; u8 is_soft; u8 is_hard; }; struct hrtimer_clock_base { struct timerqueue_head head; ktime_t resolution; ktime_t (*get_time)(void); ktime_t softirq_time; ktime_t offset; };2. 红黑树管理hrtimer使用红黑树管理定时器队列高效查找O(log n)时间复杂度快速插入O(log n)时间复杂度顺序遍历按到期时间排序3. 时钟事件设备hrtimer依赖时钟事件设备clockeventsstruct clock_event_device { const char *name; u64 mult; u32 shift; int rating; int irq; void (*set_next_event)(unsigned long evt, struct clock_event_device *); void (*set_state_shutdown)(struct clock_event_device *); void (*set_state_periodic)(struct clock_event_device *); void (*set_state_oneshot)(struct clock_event_device *); void (*tick_resume)(struct clock_event_device *); };使用场景1. 实时任务调度struct hrtimer rt_timer; void setup_rt_timer(void) { hrtimer_init(rt_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); rt_timer.function rt_task_callback; // 设置1ms周期 hrtimer_start(rt_timer, ms_to_ktime(1), HRTIMER_MODE_REL); } enum hrtimer_restart rt_task_callback(struct hrtimer *timer) { // 执行实时任务 execute_rt_task(); // 重新设置下一个周期 hrtimer_forward_now(timer, ms_to_ktime(1)); return HRTIMER_RESTART; }2. 多媒体同步struct hrtimer video_timer; ktime_t frame_interval; void init_video_sync(int fps) { frame_interval ktime_set(0, NSEC_PER_SEC / fps); hrtimer_init(video_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); video_timer.function video_frame_callback; } enum hrtimer_restart video_frame_callback(struct hrtimer *timer) { // 显示下一帧 display_next_frame(); hrtimer_forward_now(timer, frame_interval); return HRTIMER_RESTART; }3. 精确延时void precise_delay_us(unsigned int us) { ktime_t start, end; start ktime_get(); end ktime_add_us(start, us); while (ktime_before(ktime_get(), end)) cpu_relax(); }性能优化建议1. 避免频繁启停// 错误频繁创建和销毁 void do_work(void) { struct hrtimer timer; hrtimer_init(timer, ...); hrtimer_start(timer, ...); hrtimer_cancel(timer); } // 正确复用定时器 static struct hrtimer timer; void init(void) { hrtimer_init(timer, ...); } void do_work(void) { hrtimer_start(timer, ...); }2. 使用合适的时钟源// 对于不需要绝对时间的场景使用MONOTONIC hrtimer_init(timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); // 对于需要跨挂起保持的场景使用BOOTTIME hrtimer_init(timer, CLOCK_BOOTTIME, HRTIMER_MODE_REL);3. 批量处理// 将多个短定时器合并为一个长定时器 static struct hrtimer batch_timer; static LIST_HEAD(pending_work); enum hrtimer_restart batch_callback(struct hrtimer *timer) { struct work *work; // 批量处理所有待处理的工作 list_for_each_entry(work, pending_work, list) { process_work(work); } // 根据下一个工作的时间重新设置定时器 ktime_t next_time get_next_work_time(); hrtimer_set_expires(timer, next_time); return HRTIMER_RESTART; }与传统定时器的对比特性hrtimer传统timer精度微秒/纳秒毫秒时钟源多种选择基于jiffies实现红黑树链表开销较高较低适用场景实时应用一般延时调试和监控# 查看hrtimer统计 cat /proc/timer_list # 查看时钟事件设备 cat /proc/timer_list | grep Clock Event Device # 查看当前定时器 cat /proc/timer_list | grep hrtimer总结hrtimer是Linux内核中实现高精度定时的关键机制它为实时应用、多媒体同步等场景提供了必要的支持。作为嵌入式开发者理解hrtimer的工作原理和使用方法对于开发实时系统至关重要。

相关文章:

Linux内核中的高精度定时器:hrtimer机制详解

Linux内核中的高精度定时器:hrtimer机制详解 作为一名深耕操作系统和嵌入式开发的工程师,我对Linux内核中的高精度定时器(hrtimer)机制有着深入的理解。hrtimer提供了微秒甚至纳秒级的定时精度,是实时应用的关键基础设…...

Linux内核中的锁机制对比:选择合适的同步原语

Linux内核中的锁机制对比:选择合适的同步原语 作为一名深耕操作系统和嵌入式开发的工程师,我对Linux内核中的各种锁机制有着深入的理解。不同的锁适用于不同的场景,选择合适的锁对于系统性能至关重要。 内核锁的类型 1. 互斥锁(Mu…...

ECC 深度解析:怎么让 AI 代理变身你的金牌码农

每天免费领 1亿 Token,白嫖DeepSeek、GLM、MiniMax、Kimi等大模型! 故事要从一场黑客松说起 2026 年初,在 Anthropic 和 Cerebral Valley 联手搞的那场黑客松上,一个名叫 Everything Claude Code(简称 ECC&#xff0…...

Claude Code源码分析之提示词工程

每天免费领 1亿 Token,白嫖DeepSeek、GLM、MiniMax、Kimi等大模型! 在开发大模型应用的时候,管理系统提示词(System Prompt)往往是个让人头大的工程难题。要是只用简单的字符串拼接,随着活儿越接越多&#…...

Claude Code 进阶攻略:搞定内置 /loop,用大白话玩转 Cron,一行搞定自动化任务

每天免费领 1亿 Token,白嫖DeepSeek、GLM、MiniMax、Kimi等大模型! 本文写给:天天跟 Claude Code 打交道的程序员们,教你把那些烦人的监控活儿从“肉眼盯着”变成“系统自动报”。 等代码构建的时候,你通常在干嘛&…...

iOS/Android 集成游戏盾审核被拒?权限与合规配置修复

iOS/Android 集成游戏盾审核被拒?权限与合规配置修复做手游安全的开发者基本都碰到过:集成游戏盾 SDK 后,App Store 或 Google Play / 国内安卓渠道突然审核被拒。多数不是功能 bug,而是权限声明、隐私合规、SDK 行为踩了平台红线…...

游戏盾不生效、攻击防不住?策略校验与节点切换教程

做游戏运维和安全的兄弟,基本都碰到过这种糟心事:明明接了游戏盾,服务器还是被打瘫、攻击流量拦不住、正常玩家频繁掉线。很多人第一反应是 “产品垃圾”,但实际 80% 的情况是策略配置错、节点没选对、SDK 接入有问题。这篇就从实…...

分数阶效应下饱和非线性介质中艾里高斯光束传输仿真代码功能说明

Matlab光场调控的仿真代码(全套复现论文) 之前本科搞大创发了篇文章,纯搞光场调控的仿真,后来读研不做这个方向了,寻思卖了 Tips:本科生毕设,研究生搞理论的,领域为非线性光学的、光…...

基于两相交错并联技术的Buck-Boost变换器仿真研究:采用双向DCDC及多环控制策略实现高...

两相交错并联buck/boost变换器仿真 采用双向DCDC,管子均为双向管 模型内包含开环,电压单环,电压电流双闭环三种控制方式 两个电感的电流均流控制效果好可见下图电流细节 matlab/simulink/两相交错并联buck/boost变换器的仿真总能让工程师又爱…...

双buck电路并联(VDCM控制+下垂控制) 变换器并联控制方案中,下垂控制是一种经典的控制策略

双buck电路并联(VDCM控制下垂控制) 变换器并联控制方案中,下垂控制是一种经典的控制策略,但下垂控制因缺少传统电机的阻尼和旋转惯量以及励磁暂态特性,因此在负载功率变化时,输出电压更容易受到影响 随着交…...

SEO 关键字和内容创作有什么关系

SEO 关键字和内容创作有什么关系 在数字营销和网络推广领域,搜索引擎优化(SEO)是提升网站流量的核心策略之一。而在SEO中,关键词的作用至关重要。SEO关键字和内容创作有什么关系呢?这不仅是一个技术问题,更…...

Nine PRO 邮箱 APP专业高级版 邮箱合集整理 一个就够了

软件简介: Nine 是一款面向 Android 的专业级电子邮件客户端,主打 Exchange 生态深度适配、本地数据存储与全链路安全,集邮件、日历、联系人、任务与笔记于一体,是商务办公与多账户管理的高效工具。 核心定位: 专为 …...

跨平台电子书阅读器 | Readest最新版 安卓版+PC版全平台

软件简介: Readest 是一款现代化、功能丰富的电子书阅读器,专为狂热读者设计,提供无缝的跨平台访问、强大的工具和直观的界面,以提升你的阅读体验。 功能特点: 多格式支持 – 支持 EPUB、MOBI、KF8(AZW3…...

彻底搞懂支持向量机(SVM):从“找条线分开红蓝球”到“核函数大法”

一张图、一个故事、几行代码,带你拿下机器学习中最优雅的分类算法你有没有玩过这样的游戏:在一张纸上,红点和蓝点混在一起,让你画一条直线把它们分开,而且要尽可能让这条直线离两边的点都远一点?如果你画过…...

中大型团队必备:6款高口碑研发资源管理平台汇总

本文将深入对比6款多维度研发资源管理系统:PingCode、Worktile、致远互联协同云、明道云、织信 Informat、TAPD 在研发成本日益攀升的今天,“人才利用率”已成为企业研发提效的核心指标。很多研发团队面临资源分配不透明、人才忙闲不均、多项目并行时资源…...

别再手动改Excel了!用VBA的For Each循环,5分钟搞定1000行数据批量处理

解放双手:用VBA的For Each循环实现Excel数据批量处理革命 每天面对成百上千行的Excel数据,你是否还在重复着复制、粘贴、修改格式的机械操作?财务人员需要为所有金额添加货币符号,人力资源专员要统一调整员工编号格式,…...

保姆级教程:在Jetson Orin上从零搭建DJI OSDK + ROS2 Humble开发环境(避坑指南)

保姆级教程:在Jetson Orin上从零搭建DJI OSDK ROS2 Humble开发环境(避坑指南) 当无人机遇上边缘计算,Jetson Orin与ROS2的组合正在重新定义自主飞行系统的开发范式。作为大疆生态中最硬核的开发方式,OSDK允许开发者直…...

Linux进程信号详解(二):信号产生

当前阶段:一、通过终端按键产生信号1.1 基本操作CtrlC → SIGINTCtrl\ → SIGQUIT 可以发送终止信号Ctrl Z -> SIGSTP 可以发送停止信号,将当前前台进程挂起到后台设置所有信号都可以自定义捕捉 : 1.2 理解OS如何得知键盘有数据1.3 初步理…...

镜像是什么?怎么用?解决下载慢的终极指南

作为计算机小白,最头疼的事莫过于下载软件——明明点击了下载,速度却慢得像蜗牛,动辄几KB/s,下一个几百MB的软件要等大半天,甚至中途断开重新来;偶尔听大佬说“用国内镜像啊”,却一脸懵&#xf…...

vscode下载+插件

作为一款轻量又强大的代码编辑器,VSCode 是程序员入门的必备工具,但很多新手第一步就卡在了下载慢、不知怎么下的问题上。这篇指南从官方下载、国内加速下载,到简单的安装注意事项进行讲述。 一、下载 VSCode 的官方下载渠道唯一且安全&…...

Go语言的Kubernetes编排实践

Go语言的Kubernetes编排实践 1. Kubernetes简介 Kubernetes(简称K8s)是一个开源的容器编排平台,用于自动化容器的部署、扩展和管理。它提供了强大的容器编排能力,使应用程序能够在分布式环境中高效运行。 1.1 Kubernetes的核心概念…...

Go语言的Docker容器化部署

Go语言的Docker容器化部署 1. Docker简介 Docker是一种容器化技术,它允许将应用程序及其依赖项打包到一个轻量级、可移植的容器中,然后在任何支持Docker的环境中运行。Docker的出现大大简化了应用的部署和管理过程,特别是在微服务架构中。 Do…...

Go语言的分布式事务处理

Go语言的分布式事务处理 1. 分布式事务简介 在分布式系统中,事务处理变得更加复杂。传统的单机事务可以通过数据库的ACID特性来保证一致性,但在分布式环境中,由于网络延迟、节点故障等因素,确保多个服务之间的数据一致性成为一个挑…...

电磁波衰减在气象雷达探测中的关键影响与优化策略

1. 电磁波衰减如何影响气象雷达的"视力" 想象一下你戴着沾满雨滴的眼镜看世界——视线模糊、细节丢失、距离判断失误。气象雷达遭遇电磁波衰减时,面临的正是类似的困境。当雷达发射的电磁波穿越雨雪云层时,能量就像被层层"抽成"&…...

瑞芯微RK3588硬件设计资料概览

瑞芯微RK3588硬件设计资料 瑞芯微RK3588硬件设计资料资料包括:原理图和PCB以及叠层设计说明,硬件设计指导书等原理图和pcb用cadence打开该原理图和pcb基于网络硬盘录像机项目设计可作为RK3588学习者作为参考电路使用,或者学习高速电路者学习使…...

如何彻底关闭Elasticsearch 7.x的安全警告提示(内网开发必备)

彻底关闭Elasticsearch 7.x安全警告的实战指南 每次启动Elasticsearch时,控制台不断刷新的安全警告是否让你感到烦躁?特别是在内网开发环境中,这些红色警告既不影响功能又无法忽略。本文将带你深入理解警告产生的机制,并提供三种不…...

银河麒麟kylin.desktop-generic编译程序执行权限问题深度解析与实战解决方案

1. 银河麒麟权限问题的现象与本质 最近在银河麒麟kylin.desktop-generic环境下开发时,遇到了一个让人头疼的问题:明明用gcc编译生成的可执行文件已经显示有x权限,运行时却提示"权限不够"。这种看似矛盾的报错,其实是银河…...

PADS 铜箔区域规则与技巧

铜箔一定要非直角 直角会向外辐射 然后能走直线不走斜线方显布局的落落大方铜箔布好后可以选择任选去选择铜箔的边沿去拉它的形状 还可以通过打断去让他多几个拐点直接分割一个...

终极宝可梦随机化指南:Universal Pokemon Randomizer ZX 完全使用教程

终极宝可梦随机化指南:Universal Pokemon Randomizer ZX 完全使用教程 【免费下载链接】universal-pokemon-randomizer-zx Public repository of source code for the Universal Pokemon Randomizer ZX 项目地址: https://gitcode.com/gh_mirrors/un/universal-po…...

教育科技赋能自主学习:JiYuTrainer的平衡之道与效率提升方案

教育科技赋能自主学习:JiYuTrainer的平衡之道与效率提升方案 【免费下载链接】JiYuTrainer 极域电子教室防控制软件, StudenMain.exe 破解 项目地址: https://gitcode.com/gh_mirrors/ji/JiYuTrainer 教学管控与学习自由的平衡难题 在数字化教育普及的今天&…...