Linux内核 -- 普通定时器mod_timer的使用示例

server/2024/12/19 5:20:24/

Linux Kernel 普通定时器使用示例

本文介绍如何在 Linux 内核模块中使用普通定时器(timer_list 结构)。

示例代码

#include <linux/module.h>
#include <linux/init.h>
#include <linux/timer.h>
#include <linux/jiffies.h>
#include <linux/kernel.h>MODULE_LICENSE("GPL");
MODULE_AUTHOR("Example Author");
MODULE_DESCRIPTION("A simple Linux kernel timer example");static struct timer_list my_timer;// 定时器回调函数
static void my_timer_callback(struct timer_list *t)
{printk(KERN_INFO "Timer callback function called at %ld jiffies\n", jiffies);// 重新设置定时器(如果需要循环执行)mod_timer(&my_timer, jiffies + msecs_to_jiffies(1000)); // 再次设置1秒后触发
}// 模块加载时初始化定时器
static int __init my_timer_init(void)
{printk(KERN_INFO "Initializing timer module\n");// 初始化定时器timer_setup(&my_timer, my_timer_callback, 0);// 设置定时器初始触发时间mod_timer(&my_timer, jiffies + msecs_to_jiffies(1000)); // 1秒后触发return 0;
}// 模块卸载时清理定时器
static void __exit my_timer_exit(void)
{printk(KERN_INFO "Exiting timer module\n");// 删除定时器del_timer(&my_timer);
}module_init(my_timer_init);
module_exit(my_timer_exit);

说明

定时器初始化

  • 使用 timer_setup 初始化 timer_list
  • 参数说明:
    • 第一个参数是 struct timer_list 的指针。
    • 第二个参数是回调函数。
    • 第三个参数是标志,通常为 0。

设置定时器

  • 使用 mod_timer 函数设置定时器的触发时间。
  • 示例:mod_timer(&my_timer, jiffies + msecs_to_jiffies(delay)),其中 delay 是以毫秒为单位的延迟。

删除定时器

  • 在模块卸载时,使用 del_timer 确保定时器被清除,避免内核出现未知行为。

回调函数

  • 定时器触发时,内核调用指定的回调函数。
  • 回调函数运行在软中断上下文中,不能进行阻塞操作。

编译和加载

创建 Makefile

obj-m += timer_example.o

编译模块

make -C /lib/modules/$(uname -r)/build M=$(pwd) modules

加载模块

sudo insmod timer_example.ko

查看日志

dmesg

卸载模块

sudo rmmod timer_example

输出示例

加载模块后,日志会显示类似如下内容:

[12345.678901] Initializing timer module
[12346.678902] Timer callback function called at 123456 jiffies
[12347.678903] Timer callback function called at 123457 jiffies
[12348.678904] Timer callback function called at 123458 jiffies
...
[12349.678905] Exiting timer module

注意事项

  1. 定时器的精度依赖于内核的 HZ 值(通常为 250 或 1000)。
  2. 在模块卸载前务必删除定时器,避免未决的回调函数访问非法内存。

http://www.ppmy.cn/server/151368.html

相关文章

分布式全文检索引擎ElasticSearch-数据的写入存储底层原理

一、数据写入的核心流程 当向 ES 索引写入数据时&#xff0c;整体流程如下&#xff1a; 1、客户端发送写入请求 客户端向 ES 集群的任意节点&#xff08;称为协调节点&#xff0c;Coordinating Node&#xff09;发送一个写入请求&#xff0c;比如 index&#xff08;插入或更…

安卓课设版算法计算器

安卓课设版算法计算器&#xff08;HNUST&#xff09; 前言&#xff1a; 如果只想看函数使用说明请跳转到“四、使用函数介绍” 该版本为课设版&#xff0c;富含多个界面&#xff0c;是前版的plus版本&#xff0c;进行了更多的复杂化操作&#xff0c;故因此会觉得对于计算器有点…

springboot java ffmpeg 视频压缩、提取视频帧图片、获取视频分辨率

用到的maven依赖&#xff1a; lombok依赖就不贴出来了 <dependency><groupId>org.bytedeco</groupId><artifactId>ffmpeg-platform</artifactId><version>4.3.2-1.5.5</version></dependency><dependency><groupId&…

list使用

目录 list介绍 list使用 list创建 list迭代器 容量操作 元素访问 修改元素 其他操作 list介绍 ● list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代 ● list的底层是双向链表结构&#xff0c;双向链表中每个元素存…

华为WLAN基础配置(AC6005模拟配置)

AC6005基础配置 本次实验模拟华为AC6005的基本配置 Tip display interface GigabitEthernet 0/0/0 查看ap接口mac 前提条件&#xff1a;Vlan10为业务网段&#xff0c;vlan100为管理网段&#xff0c;5700作为dhcp。 5700配置如下 <Huawei>sy [Huawei]sys 5700 //设…

数据仓库-集群管理

主要介绍操作类问题中的集群管理问题。 无法成功创建数据仓库集群时怎么处理&#xff1f; 请检查用户账户余额是否少于100元&#xff0c;是否已经没有配额创建新的数据仓库集群&#xff0c;以及是否存在网络问题。 如账户余额、配额、网络均未发现问题&#xff0c;请联系客户…

欧科云链研究院:AI时代,如何证明“我是我”?

OKG Research&#xff5c;编辑 近日&#xff0c;OpenAI 发布了新模型 Sora。这是一款高性能的文本到多模态生成工具&#xff0c;支持从文本生成精细的图像和动态视频。 相较早先发布的视频样例&#xff0c;该功能目前已经可以由用户真实上手体验&#xff0c;目前由于服务过载…

【Android】EventBus——进行良好的组件通信

引言 EventBus是一个基于发布/订阅模式的事件总线库。它主要用于Android应用程序中组件之间的通信&#xff0c;允许不同组件&#xff08;如Activity、Fragment、Service等&#xff09;之间进行松耦合的交互。EventBus通过一个中央事件系统来传递消息&#xff0c;这些消息可以是…