Linux 内核中的 hrtimer 重复任务

2023-11-26

我的目标是使用以下命令在 Linux 内核中创建一个重复任务hrtimer结构。我希望它每 500 毫秒重复一次。

但是,我有点困惑如何hrtimer在 Linux 内核中工作(参见linux/hrtimer.h)。我知道时间已指定,回调应该返回HRTIMER_RESTART or HRTIMER_NORESTART。我在网上找到了一些资料,指出需要在回调中使用以下命令重置计时器hrtimer_forward方法。然而,我看到的消息来源对于添加时间是如何工作的有点不清楚。这是我到目前为止的代码:

static struct hrtimer timer;

static enum hrtimer_restart timer_callback(struct hrtimer *timer)
{
    printk(KERN_ERR "Callback\n");
    //I know something needs to go here to reset the timer
    return HRTIMER_RESTART;
}

static int init_timer(void)
{   
    ktime_t ktime;
    unsigned long delay_in_ms = 500L;
    printk(KERN_ERR "Timer being set up\n");

    ktime = ktime_set(0,delay_in_ms*1E6L);
    hrtimer_init(&timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);

    timer.function = &timer_callback;
    printk(KERN_ERR "Timer starting to fire\n");
    printk(KERN_ERR "in %ldms %ld\n", delay_in_ms, jiffies);

    hrtimer_start(&timer, ktime, HRTIMER_MODE_REL);
    return 0;
}

static void clean_load_balancing_timer(void)
{
    int cancelled = hrtimer_cancel(&timer);

    if (cancelled)
        printk(KERN_ERR "Timer still running\n");
    else
        printk(KERN_ERR "Timer cancelled\n");
}

有人可以准确解释如何在回调函数中重置计时器吗?谢谢!


如果您查看 kernel/sched.c 中第 170 行附近的函数 sched_rt_period_timer,您将看到一个示例用法。基本线路是

now = hrtimer_cb_get_time(timer);                               
overrun = hrtimer_forward(timer, now, rt_b->rt_period);

现在获取计时器的当前时间作为 ktime_t ,而 rt_b->rt_period 是另一个 ktime_t ,指定推进计时器的周期。 hrtimer的过期时间会按周期不断递增,直到大于当前时间。如果经过多次加法才能使过期时间大于当前时间,则返回值将大于 1(表示更多的溢出)。如果计时器到期根本没有提前,它可以为零。

参考:http://lwn.net/Articles/167897/

它使用的 API 来自不同版本的内核,因此一些参数已更改。基本思想还是一样的。

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

Linux 内核中的 hrtimer 重复任务 的相关文章

  • 如何编写需要内核源头文件的 BitBake 驱动程序配方?

    介绍 我有一个do install我为驱动程序编写的 BitBake 配方中的任务 我在其中执行自定义install脚本 任务失败 因为安装脚本无法在其中找到内核源头文件
  • C++:如何将存储在局部变量中的函数指针作为模板参数传递

    using namespace std float test1 float i return i i int test2 int i return i 9 struct Wrapper typedef void wrapper type i
  • 如何在 Linux 内核空间使用 ioctl()?

    可以打电话吗ioctl来自 Linux 内核模块 谁能提供一个如何使用它的例子吗 您可以尝试拨打电话sys ioctl 如果内核是用以下命令编译的 则它会被导出CONFIG COMPAT 或者 如果您有设备驱动程序struct file o
  • 如何在fastapi中调用另一个api?

    我能够从另一个 API 获取一个 API 的响应 但无法将其存储在某处 在返回响应之前存储在文件或其他内容中 response RedirectResponse url apiname 我想访问带有标题和正文的发布请求 我想存储此响应内容而
  • “do { ... } while (0)”在内核代码中到底做了什么? [复制]

    这个问题在这里已经有答案了 可能的重复 当我们定义宏时 do while 0 有什么用 https stackoverflow com questions 923822 whats the use of do while0 when we
  • Android:如何在触摸事件中手动实现长按?

    简短版本 我想要一种方法来在 onTouchEvent 上启动基于时间的计数器 并测试在响应之前是否已经过了一定的时间 作为手动 LongTouch 检测 解释 我有一个自定义 imageView 可以通过两根手指滑动滑入 滑出屏幕 我想向
  • 将元素传递给事件监听器回调函数

    在下面的代码中 document getElementById elem addEventListener blur function myScript 如何将 document getElementById elem 对象传递给 mySc
  • 如何实现urllib2.urlopen的超时控制

    如何在Python中实现对urllib2 urlopen的控制 我只是想监控如果5秒内没有xml数据返回 则切断此连接并重新连接 我应该使用一些计时器吗 谢谢 urllib2 urlopen http www example com tim
  • ARM 系统调用的接口是什么?它在 Linux 内核中的何处定义?

    我读过有关 Linux 中的系统调用的内容 并且到处都给出了有关 x86 架构的描述 0x80中断和SYSENTER 但我无法追踪 ARM 架构中系统调用的文件和进程 任何人都可以帮忙吗 我知道的几个相关文件是 arch arm kerne
  • 什么是标记结构初始化语法?

    struct file operations scull fops owner THIS MODULE llseek scull llseek read scull read write scull write ioctl scull io
  • Linux、ARM:为什么仅当启动时存在 I2C GPIO 扩展器时才创建 gpiochip

    在 imx6sx 硬件平台 NXP 嵌入式 ARM 上使用 Linux 3 14 52 问题是设备树中指定的 PCF8575 I2C GPIO 扩展器不会实例化为 sys class gpio 结构中的设备 除非它们在内核启动期间存在 这些
  • Linux内核页表更新

    在linux x86 中分页 每个进程都有它自己的页面目录 页表遍历从 CR3 指向的页目录开始 每个进程共享内核页目录内容 假设三个句子是正确的 假设某个进程进入内核 模式并更新他的内核页目录内容 地址映射 访问 权利等 问题 由于内核地
  • 同步 I/O 是否会使线程繁忙?

    假设我正在同步 I O 套接字上执行 I O 该套接字已准备好read or write手术 这意味着调用线程不会在操作上被阻塞 无论非阻塞 SOCK NONBLOCK 套接字的阻塞性质 但以下事情我不清楚 实际转移何时发生 当套接字标记为
  • 数据表“footerCallback”函数未在页脚中显示结果

    我尝试获取每列的总和并将结果显示在页脚中 我在用着 页脚回调 https datatables net reference option footerCallbackDatatables提供的功能 但是它在页脚中没有显示任何内容 数据表解释
  • 如何使用 Python 3 正确显示倒计时日期

    我正在尝试获取将显示的倒计时 基本上就像一个世界末日时钟哈哈 有人可以帮忙吗 import os import sys import time import datetime def timer endTime datetime datet
  • C++ 装饰器模式,模板的静态多态性和注册回调方法

    我正在尝试使用静态多态性来创建装饰器模式 至于为什么我不使用动态多态 请看这个QA https stackoverflow com questions 39312070 c dynamic cast over decorator insta
  • Android相当于javascript的setTimeout和clearTimeout?

    setTimeout 有一个答案https stackoverflow com a 18381353 433570 https stackoverflow com a 18381353 433570 它没有提供我们是否可以像在 JavaSc
  • 停止从标准输入读取

    我正在用 LInux C 编写一个简单的控制台应用程序 它接受来自命令行的用户输入 我在用std getline std cin std cin gt gt text在一个线程中 10 秒后 我想停止接受控制台输入并写一条短信 然后做其他事
  • 为什么内核需要虚拟寻址?

    在Linux中 每个进程都有其虚拟地址空间 例如 32位系统为4GB 其中3GB为进程保留 1GB为内核保留 这种虚拟寻址机制有助于隔离每个进程的地址空间 对于流程来说这是可以理解的 因为有很多流程 但既然我们只有 1 个内核 那么为什么我
  • Linux中的定时器类

    我需要一个计时器来以相对较低的分辨率执行回调 在 Linux 中实现此类 C 计时器类的最佳方法是什么 有我可以使用的库吗 如果您在框架 Glib Qt Wx 内编写 那么您已经拥有一个具有定时回调功能的事件循环 我认为情况并非如此 如果您

随机推荐

  • DLL 文件到底是什么?它们如何工作?

    DLL 文件到底是如何工作的 它们似乎有很多 但我不知道它们是什么或它们如何工作 那么 他们有什么关系呢 什么是DLL 动态链接库 DLL 类似于 EXE 但它们不能直接执行 它们类似于 Linux Unix 中的 so 文件 也就是说DL
  • Spring文件混合形式上传

    我想将文件上传到我的 spring 3 0 应用程序 使用 roo 创建 我已经拥有以下实体 Entity RooJavaBean RooToString RooEntity public class SelniumFile ManyToO
  • 与“ws://localhost:3000/”的 WebSocket 连接失败:连接在收到握手响应之前关闭

    我选择了朋友制作的一款游戏 希望通过使用 WebRTC 和 websocket 在对等点之间发送按键数据 使其可以跨浏览器玩 但是 我在控制台中收到此错误 与 ws localhost 3000 的 WebSocket 连接失败 连接在收到
  • Scala 在解析隐式类型时如何使用显式类型?

    我有以下代码 它使用 Spray json 将一些 JSON 反序列化为案例类 通过parseJson方法 根据隐式 JsonFormat MyCaseClass 的定义位置 内联或从伴生对象导入 以及定义时是否提供显式类型 代码可能无法编
  • 无堆栈语言如何工作?

    我听说过无堆栈语言 但是我不知道如何实现这样的语言 有人可以解释一下吗 我们拥有的现代操作系统 Windows Linux 采用我所说的 大堆栈模型 运行 有时 这种模型是错误的 并且激发了对 无堆栈 语言的需求 大堆栈模型 假设编译的程序
  • 如何使用 Koush AndroidAsync 关闭/重试/管理 WebSocket?

    我正在使用 Koush 的 AndroidAsync 作为 WebSocket 客户端 我的代码遵循以下示例https github com koush AndroidAsync并有效 示例复制如下 我需要我的应用程序在启动时打开一个 we
  • 从内存加载.so文件[重复]

    这个问题在这里已经有答案了 可能的重复 从内存中打开 我在 Windows 的 DLL 文件中看到过这种情况 从内存缓冲区加载 但在 Linux 中我找不到它 而且 ld 源代码是我见过的最复杂的代码 所以 有从内存加载 so 文件的示例吗
  • 指针参数和数组参数有区别吗?

    void method double v void method double v 5 这两者有什么区别吗 第二个是否更具体 如v长度限制为 5 个元素 当数组被声明为参数类型时 会退化为指针类型 在你的例子中 void method do
  • 查询两个不同表中两个字段的 SUM

    我正在尝试确定如何在两个表之间求和字段 在表 1 中 我们简称为 gegevens 例如 我会使用 gegevenID vertrekdatum prijs 在表 2 中 我们将其称为费用 例如 feeID gegevenID 金额 我想根
  • Gradle 构建时在 APK META-INF 中复制的重复文件

    我一直在环顾四周一些答案在这里发布了有关此错误的信息 但没有运气 我希望得到一些有关正在发生的事情的澄清 我的错误如下 错误 任务 app transformResourcesWithMergeJavaResForDebug 执行失败 co
  • 如何通过角度2中的Router.navigate传递RouteData

    agnular2 中是否有一个 api 允许传递 json 对象而不是字符串值 例如 在Router navigate 我可以传递路由参数 Router navigate routename key stringvalue 并可以使用检索它
  • ic_sync_black_24dp.xml 的 android.content.res.Resources$NotFoundException

    我已经为此苦苦挣扎了一个多星期 因为我认为这一定与我的环境有关 但我无法缩小范围 我启动一个空项目 添加一个 空白 活动并接受所有默认值 项目完成设置后 我添加一个 设置 活动 在 MainActivity java 中 我添加两行代码来连
  • Qt5内存泄漏?如何删除QMimeData?

    我刚刚提供了一个答案this问题并想提供一个工作示例 当我注意到新创建的QMimeData返回的实例QListModel mimeData 在应用程序终止之前不会被删除 所以这不是一个real由于 Qt 处理所有内存泄漏QMimeData关
  • 如何在 Android 模拟器上模拟硬件媒体控制按钮

    Android 支持耳机和连接设备上的硬件播放 暂停按钮 我正在尝试找到一种方法来测试模拟器上对这些设备的支持 这安卓文档讨论如何添加对硬件播放控件的支持 但不幸的是 我找不到有关如何模拟它们的文档 谢谢 您可以使用 adb 发送按键事件
  • 如何使用 d3.js 计算给定 x 的 y 值

    我定义了一个线生成器d3 js如下 var line d3 svg line interpolate monotone x function d return x d date y function d return y0 d visits
  • 更新 Java HashMap 键

    我只是想知道 如果 a 的 key 会发生什么HashMap是可变的 下面的测试程序证明了这一点 我无法理解何时两者都等于并且hashCode方法返回 true 和相同的值 为什么hashmap containsKey return fal
  • Init方法继承

    如果我有带有 init 方法的抽象类 A abstract class A init println Hello 然后扩展 A 的 B 类 class B A 如果我像这样实例化 B fun main args Array
  • 如何返回指向ctypes结构体的指针?

    我尝试将一个结构指针传递给函数 bar 作为函数 foo write 的返回值 但我收到行 foo POINTER temp foo 的错误消息 TypeError 必须是 ctypes 类型 在里面ctypes在线帮助我发现 ctypes
  • 安装ffi(1.1.2)时出错,Bundler无法继续

    在 Rails 3 0 项目中运行 OSX Mountain Lion 当尝试在 Rails 项目中使用捆绑器更新我的 gems 时 出现以下错误 An error occured while installing ffi 1 1 2 an
  • Linux 内核中的 hrtimer 重复任务

    我的目标是使用以下命令在 Linux 内核中创建一个重复任务hrtimer结构 我希望它每 500 毫秒重复一次 但是 我有点困惑如何hrtimer在 Linux 内核中工作 参见linux hrtimer h 我知道时间已指定 回调应该返