JJJ:Linux - 高精度定时器 hrtimer

文章目录

    • 如何使用高精度定时器
      • 初始化定时器
      • 启动定时器
      • 定时器到期
        • 需要反复执行的定时操作
        • 只需要执行一次的定时操作
      • 如何触发超时处理函数
      • hrtimer_forward_now
      • 示例代码
      • 注意事项
        • 定时器精度
        • 上下文
        • 电源管理
        • 性能
    • 高精度定时器的中断函数是如何被触发的

添加自己要添加的文字

如何使用高精度定时器

借鉴了这位大佬的文章

初始化定时器

要使用高精度定时器,首先需要初始化一个 hrtimer 结构体,然后设置相关参数。

#include <linux/hrtimer.h>
#include <linux/ktime.h>struct hrtimer my_timer;
ktime_t kt;kt = ktime_set(0, 5000000); // 设置定时器的时间,5mshrtimer_init(&my_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
my_timer.function = &my_timer_callback; // 设置定时器触发时调用的回调函数

启动定时器

初始化好定时器后,可以使用 hrtimer_start 函数启动定时器。

hrtimer_start(&my_timer, kt, HRTIMER_MODE_REL);

定时器到期

定时器到期后,会调用之前设置的回调函数。在回调函数中,你可以执行需要的操作。

需要反复执行的定时操作
enum hrtimer_restart my_timer_callback(struct hrtimer *timer)
{printk(KERN_INFO "Timer callback function executed.
");// 在这里执行需要的操作// 如果需要重复执行定时任务,可以重新启动定时器hrtimer_forward_now(timer, kt);// 另外返回这个值return HRTIMER_RESTART;
}
只需要执行一次的定时操作

如果你希望高精度定时器只执行一次而不是重复执行,可以在回调函数中返回 HRTIMER_NORESTART 而不是 HRTIMER_RESTART。

enum hrtimer_restart my_timer_callback(struct hrtimer *timer)
{printk(KERN_INFO "Timer callback function executed.");// 在这里执行需要的操作return HRTIMER_NORESTART; // 不重新启动定时器
}

这里没找到返回HRTIMER_RESTART和HRTIMER_NORESTAR是在何处进行判断的

如何触发超时处理函数

__tasklet_hrtimer_trampoline
tasklet_hrtimer_init

alarmtimer_fired

hrtimer_forward_now

ktime_t hrtimer_forward_now(struct hrtimer *timer, ktime_t interval);

用于在高精度定时器的回调函数中,向前推进定时器的到期时间。这通常用于需要周期性触发的定时器。
timer: 指向 hrtimer 结构体的指针。
interval: 定时器向前推进的时间间隔。
返回新的到期时间。

示例代码

#include <linux/module.h>
#include <linux/hrtimer.h>
#include <linux/ktime.h>static struct hrtimer my_timer;
static ktime_t interval;enum hrtimer_restart my_timer_callback(struct hrtimer *timer)
{printk(KERN_INFO "Timer callback function executed.
");// 在这里执行需要的操作// 向前推进定时器到期时间hrtimer_forward_now(timer, interval);return HRTIMER_RESTART; // 重新启动定时器
}static int __init my_module_init(void)
{printk(KERN_INFO "Initializing module with high resolution timer.
");interval = ktime_set(0, 5000000); // 设置定时器的时间间隔,5mshrtimer_init(&my_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);my_timer.function = &my_timer_callback;hrtimer_start(&my_timer, interval, HRTIMER_MODE_REL);return 0;
}static void __exit my_module_exit(void)
{printk(KERN_INFO "Exiting module and cancelling timer.
");hrtimer_cancel(&my_timer); // 取消定时任务
}module_init(my_module_init);
module_exit(my_module_exit);MODULE_LICENSE("GPL");
MODULE_AUTHOR("Author Name");
MODULE_DESCRIPTION("High Resolution Timer Example");

注意事项

定时器精度

高精度定时器提供纳秒级的精度,但具体精度仍然依赖于硬件和内核配置。

上下文

定时器回调函数在软中断上下文中执行,因此不应该在回调函数中执行可能会阻塞的操作。

如果定时器回调函数中涉及共享数据,确保使用合适的锁机制以避免竞争条件。

电源管理

在低功耗模式下,高精度定时器可能会受到影响。在设计时需要考虑电源管理对定时器的影响。

性能

高精度定时器会增加系统开销,频繁使用可能会影响系统性能。需要在使用时权衡精度和性能的需求。

高精度定时器的中断函数是如何被触发的

raise_softirq_irqoff(HRTIMER_SOFTIRQ);
hrtimer_run_queues(触发hrtimers的软硬中断)
run_local_timers
update_process_times
tick_periodic
tick_handle_periodic
来自clock硬件中断触发

clock_dev硬件中断-》tick_handle_periodic-》tick_periodic-》update_process_times-》run_local_timers

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python Flask教程

一、前言 Flask是一个用Python编写的轻量级的Web应用框架。 Flask基于WSGI&#xff08;Web Server Gateway Interface&#xff09;和 Jinja2 模板引擎&#xff0c;旨在帮助开发者快速、简便地创建 Web 应用。 Flask 被称为"微框架"&#xff0c;因为它使用简单的核…

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.10 文本数据炼金术:从CSV到结构化数组

1.10 《文本数据炼金术&#xff1a;从CSV到结构化数组》 目录 #mermaid-svg-TNkACjzvaSXnULaB {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-TNkACjzvaSXnULaB .error-icon{fill:#552222;}#mermaid-svg-TNkACjzva…

Linux进程概念:【环境变量】【程序地址空间】

目录 一.环境变量 1.1基本概念 1.2命令行参数 1.3一个例子&#xff0c;一个环境变量 1.4环境变量的组织方式 1.5查看环境变量的方法 ​编辑 1.6从存储的角度理解环境变量 1.7环境变量最开始是从系统的配置文件里来的 1.8认识更多的环境变量 HOME HISTSIZE HOSTNANE…

医疗集群系统中基于超融合数据库架构的应用与前景探析

一、引言 1.1 研究背景与意义 随着医疗信息化的飞速发展,医疗数据呈爆炸式增长。从日常诊疗记录、患者病历,到各类医疗影像、检查检验数据等,海量信息不断涌现。据统计,医疗数据的年增长率高达 30% 以上 ,2025 年,全球医疗数据量将达到 2314 艾字节(EB)。如此庞大的数…

【leetcode100】从前序与中序遍历序列构造二叉树

1、题目描述 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 示例 1: 输入: preorder [3,9,20,15,7], inorder [9,3,15,20,7] 输出: [3,9,20,nul…

【CSS入门学习】Flex布局设置div水平、垂直分布与居中

水平平均分布 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style>…

【ARM】解决MDK在打开工程的时候提示CMSIS的版本不对问题

1、 文档目标 解决MDK在打开使用Compiler 6的工程的时候&#xff0c;提示CMSIS 的API版本过低的报错。 2、 问题场景 客户在Pack包中打开一个示例工程&#xff0c;打算熟悉一下对应芯片的功能和软件的功能&#xff0c;但是&#xff0c;打开软件后&#xff0c;在构建信息输出框…

PyCharm接入DeepSeek实现AI编程

目录 效果演示 创建API key 在PyCharm中下载CodeGPT插件 配置Continue DeepSeek 是一家专注于人工智能技术研发的公司&#xff0c;致力于开发高性能、低成本的 AI 模型。DeepSeek-V3 是 DeepSeek 公司推出的最新一代 AI 模型。其前身是 DeepSeek-V2.5&#xff0c;经过持续的…

【PyTorch][chapter 29][李宏毅深度学习]Fine-tuning LLM

参考&#xff1a; https://www.youtube.com/watch?veC6Hd1hFvos 目录&#xff1a; 什么是 Fine-tune 为什么需要Fine-tuning 如何进行Fine-tune Fine-tuning- Supervised Fine-tuning 流程 Fine-tuning参数训练的常用方案 LORA 简介 示例代码 一 什么是 Fine-tune …

动手学图神经网络(3):利用图神经网络进行节点分类 从理论到实践

利用图神经网络进行节点分类&#xff1a;从理论到实践 前言 在之前的学习中&#xff0c;大家对图神经网络有了初步的了解。本次教程将深入探讨如何运用图神经网络&#xff08;GNNs&#xff09;来解决节点分类问题。在节点分类任务里&#xff0c;大家往往仅掌握少量节点的真实…

云原生:构建现代化应用的基石

一、什么是云原生&#xff1f; 云原生是一种构建和运行应用程序的方法&#xff0c;旨在充分利用云计算的分布式系统优势&#xff0c;例如弹性伸缩、微服务架构、容器化技术等。云原生应用程序从设计之初就考虑到了云环境的特点&#xff0c;能够更好地适应云平台的动态变化&…

springboot3 集成 knife4j(接口文档)

提示&#xff1a;文章是集成 knife4j&#xff0c;而非 swagger2 或者 swagger3&#xff0c;效果如图 文章目录 前言一、添加依赖二、如何集成1.配置文件2.注解部分1.Tag2.Operation3.Parameter4.Schema 3.使用 总结 前言 提示&#xff1a;&#xff1a;大家在开发阶段&#xff…

基于单片机的智能小区门禁系统设计(论文+源码)

1总体架构 智能小区门禁系统以STM32单片机和WiFi技术为核心&#xff0c;STM32单片机作为主控单元&#xff0c;通过WiFi模块实现与手机APP的连接&#xff0c;构建整个门禁系统。系统硬件包括RFID模块、指纹识别模块、显示屏、按键以及继电器。通过RFID绑定IC卡、APP面部识别、指…

后盾人JS--闭包明明白白

延伸函数环境生命周期 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> <…

The just sharing principle: advice for advice givers

原文 A while ago I wrote about how Only you know what’s best for your application. That’s because only you fully understand the context within which you are making technical decisions. Any advice need to filtered through that context in order to determi…

Charles 4.6.7 浏览器网络调试指南:HTTPS抓包(三)

概述 在现代互联网应用中&#xff0c;网络请求和响应是服务交互的核心。对于开发者和测试人员来说&#xff0c;能够准确捕获并分析这些请求&#xff0c;是保证系统稳定性和性能的关键。Charles作为一个强大的网络调试工具&#xff0c;不仅可以捕获普通的HTTP请求&#xff0c;还…

安装Office自定义项,安装期间出错

个人博客地址&#xff1a;安装Office自定义项&#xff0c;安装期间出错 | 一张假钞的真实世界 卸载PowerDesigner后&#xff0c;打开“WPS文字”时出现下图错误&#xff1a; 解决方法&#xff1a; 按“WinR”快捷键&#xff0c;打开【运行】框&#xff0c;在对话框中输入“re…

图漾相机搭配VisionPro使用简易教程

1.下载并安装VisionPro软件 请自行下载VisonPro软件。 VisionPro 9.0 /9.5/9.6版本经测试&#xff0c;可正常打开图漾相机&#xff0c;建议使用图漾测试过的版本。 2.下载PercipioCameraForVisionPro软件包 使用浏览器下载&#xff1a;https://gitee.com/percipioxyz/camport…

信息系统管理工程师第6-8章精讲视频及配套千题通关双双发布,附第14章思维导图

这一周发文少&#xff0c;不是我在偷懒&#xff0c;而是在和信管的视频及千题通关“”浴血奋战 &#xff0c;特别是第8章卡了我很久&#xff0c;因为内容实在太多&#xff0c;精讲视频估计都差不多4个小时了&#xff0c;还好终于在春节前拿下&#xff0c;提供给小分队的同学&am…

RNN实现阿尔茨海默症的诊断识别

本文为为&#x1f517;365天深度学习训练营内部文章 原作者&#xff1a;K同学啊 一 导入数据 import torch.nn as nn import torch.nn.functional as F import torchvision,torch from sklearn.preprocessing import StandardScaler from torch.utils.data import TensorDatase…