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 重复任务 的相关文章

  • 在ubuntu内核中启用cgroup cpu实时运行时

    我正在尝试在 Ubuntu 18 04 上运行的 docker 容器中使用实时调度 我已经按照给定的方法安装了实时内核here https stackoverflow com questions 51669724 install rt li
  • 我应该如何以非 root 身份读取 Linux 上的 Intel PCI 非核心性能计数器?

    我想要一个库 允许对 Linux 可执行文件的关键部分进行 自我分析 就像人们可以使用一个部分计时一样获取当日时间 http linux die net man 2 gettimeofday or RDTSC http www strchr
  • 在 PL/SQL 中创建队列订阅者的语法是什么?

    我正在尝试创建一个队列和一个在消息排队时触发的回调 但我无法触发回调 我究竟做错了什么 我有一个将消息入队的触发器 我可以在队列消息表上看到它 我可以手动将其出队并处理它 我只是无法在入队时触发回调 BEGIN DBMS AQADM CRE
  • 这些工作队列标志意味着什么?

    在研究工作队列时 我遇到了内核中定义的工作队列标志和常量 我有以下我无法理解的疑问 这里的排水和救援到底是什么意思 WQ DRAINING 1 lt lt 6 internal workqueue is draining WQ RESCUE
  • 如何将类成员函数作为回调传递?

    我使用的 API 要求我传递函数指针作为回调 我正在尝试在我的类中使用此 API 但出现编译错误 这是我在构造函数中所做的事情 m cRedundencyManager gt Init this gt RedundencyManagerCa
  • 民意调查立即从驱动程序中退出

    这是我第一次在 Linux 内核中实现驱动程序并面临这个问题 我正在尝试在我的字符驱动程序中实现 poll 我已调用 poll wait 并传递了一个等待队列 当从用户空间程序打开该驱动程序的设备文件并在此设备文件描述符 fd 上调用 po
  • 将 void *user_data 转换为对象

    我该如何投射void something到标准 C 中的对象 具体来说我想投void userdata to std map
  • 在 4.x 内核上的 64 位内存中查找系统调用表

    我正在尝试编写一个简单的内核模块来查找 Linux 中的 sys call table 但遇到了一些麻烦 我在这里找到了 32 位 Linux 的基本指南 https memset wordpress com 2011 03 18 sysc
  • 并发 I/O - 缓冲区损坏、块设备驱动程序

    我开发块分层设备驱动程序 所以 我拦截WRITE请求并加密数据 并解密数据end bio 例行程序 在处理和READ要求 所以在单流中一切正常 但是 如果尝试同时从两个或更多进程执行 I O 我会遇到缓冲区内容损坏的情况 我没有任何本地存储
  • 多线程进程的线程ID可以与另一个正在运行的进程的进程ID相同吗?

    我正在尝试找到一种方法来唯一标识多进程环境中的线程 我有一个服务器 它跟踪连接到它的不同进程 其中一些是多线程的 一些不是 为了识别多线程连接中的线程 我使用线程 ID 作为唯一标识符 在任何给定时间最多有 1 个多线程进程连接 我的问题是
  • CakePHP 1.3:测量页面执行时间

    想要弄清楚如何测量 CakePHP 站点的总 PHP 执行时间 看起来在 1 2 中 它在调试模式下作为 HTML 注释包含在渲染的 HTML 中 但这在我的 1 3 网站上没有发生 无论如何我希望它作为一个可以输出给用户的元素 而不是一个
  • 如何通过jiffies实现经过时间

    我想了解如何在 C 中使用 jiffies 实现经过时间 假设我有一系列指令 include
  • Linux CFS 调度程序代码在哪里?

    我有3 13版本的完整linux源代码 我试图找到 CFS 调度程序的源代码 根据流行书籍 它应该驻留在 kernel sched c 中作为基本调度程序代码 而 kernel sched fair c 专门针对 CFS 代码 我刚刚在 3
  • 在内核中创建一个简单的只写过程条目

    include
  • linux新手关于嵌入式linux设备驱动的问题

    最近在研究linux驱动 正如我读过的那些文章所说 设备驱动程序模块很可能会根据内核的需要自动加载 因此我想知道内核如何确定为特定设备 声卡 I2C spi 设备 等 我也无法彻底想象内核如何在启动时检测每个硬件设备 与嵌入式linux相关
  • Python:threading.timer不尊重间隔

    这是后续另一个问题 https stackoverflow com questions 32286049 python accept input while waiting 我现在有了一个解决方案 但由于不相关的原因 实现似乎没有正常运行
  • 等待多个异步调用完成后再继续

    因此 我有一个加载页面 并通过 jquery get 发出多个请求以使用其值填充下拉列表 function LoadCategories Category LoadPositions Position LoadDepartments Dep
  • ioctl 命令的用户权限检查

    我正在实现 char 驱动程序 Linux 并且我的驱动程序中有某些 IOCTL 命令仅需要由 ADMIN 执行 我的问题是如何在 ioctl 命令实现下检查用户权限并限制非特权用户访问 IOCTL 您可以使用bool capable in
  • 为什么 Linux 原始套接字的 RX 环大小限制为 4GB?

    背景 我试图mmap 我的原始套接字的 RX 环形缓冲区64 bitLinux 应用程序 我的环由 4096 个块组成 每个块大小为 1MB 总共 4GB 请注意 每个 1MB 块中可以有许多帧 如果您好奇 请参阅此文档了解背景信息 htt
  • 如何在 Flutter App 中按时间注销?

    如果用户在登录后对应用程序没有反应或不活动超过 5 分钟 我需要从应用程序中注销用户 该应用程序将转到主登录页面 我尝试实施给定的解决方案here https stackoverflow com questions 52602606 how

随机推荐

  • 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 我知道时间已指定 回调应该返