驱动-Linux定时-timer_list
了解内核定时相关基础知识
文章目录
- 简要介绍
- timer_list 特点
- API 函数
- 实验
- 测试程序 - timer_mod.c
- 编译文件-Makefile
- 实验验证
- 注意事项
- 总结
简要介绍
硬件为内核提供了一个系统定时器来计算流逝的时间(即基于未来时间点的计时方式, 以当前时刻为计时开始的起点, 以未来的某一时刻为计时的终点) , 内核只有在系统定时器的帮助下才能计算和管理时间, 但是内核定时器的精度并不高, 所以不能作为高精度定时器使用。并且内核定时器的运行没有周期性, 到达计时终点后会自动关闭。 如果要实现周期性定时, 就要在定时处理函数中重新开启定时器。
Linux 内核中使用 timer_list 结构体表示内核定时器, 该结构体定义在“内核源码/include/li
nux/timer.h”文件中, 具体内容如下所示
struct timer_list {struct hlist_node entry;unsigned long expires;/* 定时器超时时间,单位是节拍数 */void (*function)(struct timer_list *);/* 定时处理函数 */u32 flags;#ifdef CONFIG_LOCKDEPstruct lockdep_map lockdep_map;
#endifANDROID_KABI_RESERVE(1);ANDROID_KABI_RESERVE(2);
};
timer_list 特点
inux 内核定时器是基于 timer_list 结构的动态定时器,具有以下特点:
-
不是周期性的,超时后会自动失效
-
基于内核的 jiffies 计时
-
在中断上下文执行,因此不能睡眠
-
精度取决于 HZ 值(通常为 1ms 或 10ms)
API 函数
函数 | 作用 |
---|---|
void add_timer(struct timer_list *timer) | 向 Linux 内核注册定时器,使用 add_timer 函数向内核注册定时器以后,定时器就会开始运行 |
int del_timer(struct timer_list * timer) | 删除一个定时器 |
int mod_timer(struct timer_list *timer,unsigned long expires) | 修改定时值,如果定时器还没有激活的话,mod_timer 函数会激活定时器 |
在使用add_timer()函数向 Linux 内核注册定时器之前,还需要设置定时时间,定时时间由timer_list结构体中的expires参数所确定,单位为节拍数
这里简要理解,节拍数 jiffies 和 时间之间的转换函数:
jiffies_64用于64位系统,而jiffies用于 32 位系统。为了方便开发,Linux 内核还提供了几个jiffies和ms、us、ns之间的转换函数,如下 所示:
函数 | 作用 |
---|---|
int jiffies_to_msecs(const unsigned long j) | 将 jiffies 类型的参数 j 分别转换为对应的毫秒 |
int jiffies_to_usecs(const unsigned long j) | 将 jiffies 类型的参数 j 分别转换为对应的微秒 |
u64 jiffies_to_nsecs(const unsigned long j) | 将 jiffies 类型的参数 j 分别转换为对应的纳秒 |
long msecs_to_jiffies(const unsigned int m) | 将毫秒转换为 jiffies 类型 |
long usecs_to_jiffies(const unsigned int u) | 将微秒转换为 jiffies 类型 |
unsigned long nsecs_to_jiffies(u64 n) | 将纳秒转换为 jiffies 类型 |
既然要定时,那么情形就是 把定时时间转换成节拍数,系统内核根据节拍数和节拍频率。内核里面只认节拍数,它对应的就是频率
例如:进行3秒钟的定时:
timer_test.expires = jiffies_64 +msecs_to_jiffies(3000)
实验
测试程序 - timer_mod.c
#include <linux/init.h>
#include <linux/module.h>
#include <linux/timer.h>static void function_test(struct timer_list *t);//定义function_test定时功能的函数
DEFINE_TIMER(timer_test,function_test);static void function_test(struct timer_list *t){printk(" this is function test \n");mod_timer(&timer_test,jiffies_64+msecs_to_jiffies(5000)); 使用mod_timer函数将定时时间设置为五秒后}static int __init time_module_init(void) //驱动入口函数
{timer_test.expires = jiffies_64 + msecs_to_jiffies(5000);//将定时时间设置为五秒后add_timer(&timer_test);//添加一个定时器return 0;}
static void __exit time_module_exit(void) //驱动出口函数
{del_timer(&timer_test);//删除一个定时器printk("module exit \n");}
module_init(time_module_init);
module_exit(time_module_exit);
MODULE_LICENSE("GPL v2");
MODULE_AUTHOR("wang fang chen");
源码分析
-
这里用到了定时器timer_list 的三个api 函数:
定义定时器:DEFINE_TIMER(timer_test,function_test); 参数为定时器名称和回调方法
添加定时器:add_timer(&timer_test);
修改定时器:mod_timer(&timer_test,jiffies_64+msecs_to_jiffies(5000));
删除定时器:del_timer(&timer_test);**注意点:**定时器的名称并不是作为变量定义的,作为方法参数定义了的 DEFINE_TIMER的方法参数。
回调函数 function_test 是先定义,然后实现 。
编译文件-Makefile
#!/bin/bash
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
obj-m += timer_mod.o
KDIR :=/home/wfc123/Linux/rk356x_linux/kernel
PWD ?= $(shell pwd)
all:make -C $(KDIR) M=$(PWD) modulesclean:make -C $(KDIR) M=$(PWD) clean
实验验证
加载驱动看打印信息
注意事项
-
定时器精度:内核定时器的精度受 HZ 值影响,不适合需要高精度的场合
-
执行上下文:回调函数在中断上下文执行,不能调用可能睡眠的函数
-
多核处理:del_timer() 可能在 SMP 系统上返回后定时器仍在运行,使用 del_timer_sync() 更安全
-
竞争条件:确保在模块退出时删除所有定时器
总结
这里了解的是内核的一个定时器timer_list 的使用。 了解基本知识即可。
相关文章:
驱动-Linux定时-timer_list
了解内核定时相关基础知识 文章目录 简要介绍timer_list 特点API 函数实验测试程序 - timer_mod.c编译文件-Makefile实验验证 注意事项总结 简要介绍 硬件为内核提供了一个系统定时器来计算流逝的时间(即基于未来时间点的计时方式, 以当前时刻为计时开始…...
从理论到实战:模糊逻辑算法的深度解析与应用实践
从理论到实战:模糊逻辑算法的深度解析与应用实践 一、模糊逻辑的核心概念与数学基础 模糊逻辑(Fuzzy Logic)是一种处理不确定性的数学工具,其核心思想是将传统布尔逻辑的“非黑即白”扩展为连续的隶属度函数。例如,在…...
涨薪技术|0到1学会性能测试第65课-SQL捕获阻塞事件
前面的推文我们掌握了JVM调优技术。今天给大家分享MS SQL数据库监控与调优技术。后续文章都会系统分享干货,带大家从0到1学会性能测试。 01SQL捕获阻塞事件 在SQL Server 2005之前的版本,分析哪些进程产生阻塞以及哪些进程被阻塞,都需要使用脚…...
SQL实战:06交叉日期打折问题求解
文章目录 概述题目:交叉打折问题求解题解第一步:使用滑动窗口统计当前活动前的最大结束日期步骤二:拆分出交叉部分步骤三:计算每次活动的持续天数步骤四:分组统计最终结果完整SQL 概述 最近刷题时遇到一些比较有意思的…...
Linux云计算训练营笔记day09(MySQL数据库)
Linux云计算训练营笔记day09(MySQL数据库) 目录 Linux云计算训练营笔记day09(MySQL数据库)外键约束数据的导入和导出数据的导出数据的导入 DQL 数据查询语言查指定字段查所有字段where 过滤条件and 和 orin 和 not inbetween...an…...
docker 学习记录
docker pull nginx docker 将本地nginx快照保存到当前文件夹下 docker save -o nginx.tar nginx:latestdocker 将本地nginx 加载 docker load -i nginx.tar docker运行nginx在80端口 docker run --name dnginx -p 80:80 -d nginxredis启动 docker run --name mr -p 6379:6379 -…...
Kind方式部署k8s单节点集群并创建nginx服务对外访问
资源要求 请准备好doker环境,尽量用比较新的版本。我的docker环境如下 docker 环境: Docker version 20.10.21, build 20.10.21-0ubuntu1~18.04.3 安装kind kind表现上就是一个二进制程序,下载对应版本并增加执行权限即可: cu…...
Da14531蓝牙特征值1读没有回调解决
一. 我们调试中发现user_peripheral.c中的回调,一直都没有回调。(大家可以通过打印去排查) void user_catch_rest_hndl(ke_msg_id_t const msgid, void const *param, ke_task_id_t const dest_id, ke_task_id_t const src_id) { //此处省…...
journal of Electronic Imaging(JEI)投稿咨询
研究生投的第二篇论文-CV方向,由于太菜了,到处被拒,最后选择了Journal of Electronic Imaging(JEI) 审稿了三个月,最近突然变了状态,之前催稿说才一个审稿人,这样子是不是要被拒了,有没有知道的…...
upload-labs靶场通关详解:第6-9关
目录 第六关:大小写绕过 一、分析源代码 二、解题思路 三、解题步骤 第七关:空格绕过 一、分析源代码 二、解题思路 三、解题步骤 第八关:点号绕过 一、分析源代码 二、解题思路 三、解题步骤 第九关:::$DATA字符串绕…...
算法图表总结:查找、排序与递归(含 Mermaid 图示)
算法图表总结:查找、排序与递归(含 Mermaid 图示) 分类标签:算法、数据结构、Mermaid、技术图表 关键词: 算法可视化、Mermaid 图表、数据结构、二分查找、快速排序、递归树 摘要: 本文通过 Mermaid 图表…...
在文件检索方面doris和elasticsearch的区别
apache Doris 与 Elasticsearch 在文件检索领域的差异源于技术架构与定位目标的本质区别,以下从核心维度对比分析二者的技术特性: 一、 架构设计与定位差异 维度Apache DorisElasticsearch核心架构分布式 MPP 列式分析引擎,面向 OLAP 优化分布式倒排索…...
linux系统服务
Linux 系统服务(System Services) 是在后台持续运行的进程(守护进程,即 daemon),用于提供核心功能或支持其他应用程序(如网络管理、日志记录、定时任务等)。它们通常在系统启动时自动…...
大语言模型三大演进方向:记忆增强、工具集成与多模态突破
目录 一、方向演进:从通用模型到记忆增强系统 1.1 技术瓶颈分析 1.2 记忆增强技术路径 1.3 企业级应用架构 二、工具调用:从语言理解到行动执行 2.1 工具调用协议演进 2.2 工具编排范式比较 三、多模态突破:跨模态统一建模 3.1 多模态架构演进 3.2 医学多模态应用…...
嵌入式学习笔记DAY21(双向链表、Makefile)
一、双向链表 1.概念 双向链表(Doubly Linked List) 是一种链式数据结构,每个节点包含 两个指针(前驱指针 prev 和后继指针 next),分别指向 前一个节点 和 后一个节点,形成双向连接。 头节点&…...
Vue 学习随笔系列二十三 -- el-date-picker 组件
el-date-picker 组件 文章目录 el-date-picker 组件el-date-picker 只有某些日期可选 el-date-picker 只有某些日期可选 <template><div><el-form ref"form" size"mini":model"form" :rules"rules"label-width"8…...
IEEE出版|连续多年稳定检索|第三届信号处理与智能计算国际学术会议(SPIC2025)
【重要信息】 会议官网: www.ic-spic.com 会议日期:2025年11月28-30日 会议地点:中国 广州 截稿日期:2025年11月10日 接受或拒绝通知日期:提交后7个工作日 【征稿主题】 人工智能和机器学习 计算机系统和架构 …...
用Python代码绘制动态3D爱心效果
引言 介绍Python在创意编程中的应用,特别是如何通过简单的代码实现视觉上的美感。引出本文将分享的爱心代码,并简要说明其实现原理。 爱心代码的基本实现 展示一个简单的Python代码示例,使用字符画的方式在控制台中绘制一个爱心图案。 pr…...
牛客网刷题:NC208813求逆序数
牛客网刷题:NC208813求逆序数 问题描述 在排序和数据结构分析中,逆序数是一个重要的概念。对于一个数列来说,如果一对数的前后位置与大小顺序相反(即前面的数大于后面的数),那么它们就称为一个逆序对。一个…...
Day 21 训练
Day 21 训练 常见的降维算法数据预处理无监督降维PCA(主成分分析)主成分分析(PCA)作用和优势应用场景t-SNE(t-分布随机邻域嵌入)t-SNE(t-分布随机邻域嵌入)为什么 t-SNE 特别适用于高…...
1267, “Illegal mix of collations (latin1_swedish_ci,IMPLICIT
python 执行数据迁移报错 mysql : 1267, "Illegal mix of collations (latin1_swedish_ci,IMPLICIT 解决方法: 替换TABLE 后面的表名为你自己的表名,mysql 黑窗口执行。 以下是我的表名,仅作参考 ALTER TABLE book CONVERT TO CHARACTE…...
【C#】Thread.Join()、异步等待和直接join
JogThread.Join() 是 .NET 中 System.Threading.Thread 类的一个方法,用来让当前调用线程暂停执行,直到目标线程(这里是 JogThread)终止为止。以下是它的核心语义和你在 UI 代码里需要注意的几个相关知识点。 1. Thread.Join() 的…...
Malformed input or input contains unmappable characters解决
JDK 17 文件上传编码异常解决方案技术文档 1. 问题背景 在 JDK 17 环境下,文件上传过程中可能抛出 Malformed input or input contains unmappable characters 错误。此问题通常由以下原因触发: 文件路径/名称包含非 ASCII 字符(如中文、日…...
PYTHON训练营DAY26
一、函数 (一)不带参数的函数 # 定义一个简单的问候函数 def greet():"""打印一句问候语。"""message "大家好!欢迎学习Python函数定义!"print(message)greet()(二&#x…...
奇变偶不变,符号看象限
三角函数诱导公式口诀详解:奇变偶不变,符号看象限 口诀解析 1. 口诀含义 奇变偶不变: 奇/偶:指角度加减的是π/2(90)的奇数倍还是偶数倍 奇数倍(如π/2, 3π/2)→ 函数名改变&…...
基于SpringBoot的家政服务系统设计与实现(源码+文档+部署讲解)
技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…...
Makefile 在 Go 项目中的实践
在 Go 项目中,Makefile 是一个强大的工具,用于自动化构建、测试和部署流程。它不仅能减少重复命令输入,还能确保团队开发环境的一致性。本文以 CoreDNS(一个高性能 DNS 服务器)的 Makefile 为例,解析其设计…...
关闭所有Nginx进程
要关闭所有Nginx进程,可以使用以下命令。这些命令适用于不同的操作系统。 在Linux/Unix系统中 在Linux或Unix系统中,可以使用killall命令来关闭所有Nginx进程。 sudo killall nginx 在Windows系统中 在Windows系统中,可以使用taskkill命…...
开源模型应用落地-模型上下文协议(MCP)-Resources-资源的使用逻辑
一、前言 在大型语言模型与外部世界交互的探索中,如何高效、灵活地接入多样化数据始终是核心命题。MCP(Model Context Protocol)协议中的Resources 机制,正是为这一问题提供了优雅的解决方案。通过URI(统一资源标识符&…...
如何判断一个网站后端是用什么语言写的
判断一个网站的后端是用什么语言写的,可以从以下几个方面入手: 一、通过响应头(HTTP Response Headers) 使用浏览器开发者工具或工具如 curl 查看网站返回的响应头信息,有时可以看到蛛丝马迹: 示例&#…...
CertiK助力以太坊扩展战略,解析Pectra升级的变革与挑战
近期,美国知名金融科技媒体Benzinga发表文章,深入探讨以太坊Pectra升级的变革性影响,并特别引用了CertiK对潜在风险的权威分析,特别是EIP-7702引入的全新信任模型变化。此次升级不仅重新定义了EOA与智能合约的交互方式,…...
【C++】Module CPP:模块化编程 Demo
一、C20 模块简介 C20 模块是 C 语言发展史上的重要革新,它从根本上改变了代码组织方式。相比传统的头文件(#include)机制,模块具有以下核心优势: 隔离编译:模块独立编译,避免重复编译头文件符…...
mvc-service引入
什么是业务层 1)Model1(JSP)和Model2(模糊的mvc): MVC:Model(模型),View(视图),Controller(控制器) 视图层:用于数据展示以及用户交互的界…...
Linux线程互斥锁
1. 什么是互斥锁(Mutex)? 互斥锁(Mutex,Mutual Exclusion) 是一种用于多线程编程的同步机制,用于保护共享资源(如变量、内存、文件等),确保在同一时刻只有一…...
PINN Poisson 1d
📌 一、问题定义 我们要求解的微分方程是 d 2 u d x 2 f ( x ) \begin{equation} \frac{d^2 u}{d x^2} f(x) \end{equation} dx2d2uf(x) 其中: f ( x ) − 0.49 s i n ( 0.7 x ) − 2.25 c o s ( 1.5 x ) f(x) -0.49sin(0.7x) - 2.25cos(1.5x) f(x)−…...
国内优质沉金PCB厂家有哪些?
在高端电子制造领域,沉金工艺因其优异的抗氧化性、信号完整性和焊接可靠性,成为5G通信、AI服务器、新能源汽车等领域的核心需求。本文精选五家国内技术领先的沉金PCB厂家,从工艺精度、交付效率、品质管控等维度展开深度解析,助力企…...
【Trae插件】从0到1,搭建一个能够伪装成网页内容的小说阅读Chrome插件
【Trae插件】从0到1,搭建一个能够伪装成网页内容的小说阅读Chrome插件 最近,Trae 插件也迎来了更新,Trae 插件(原MarsCode 编程助手)Builder模式全面上线,同时支持 VS Code 、JetBrains IDEs,助…...
2025年5月AI科技领域周报(5.5-5.11):AGI研究进入关键验证期 具身智能开启物理世界交互新范式
2025年5月AI科技领域周报(5.5-5.11):AGI研究进入关键验证期 具身智能开启物理世界交互新范式 一、本周热点回顾1. OpenAI发布GPT-5多模态大模型 突破通用智能关键阈值2. 特斯拉Optimus机器人量产版发布 具身智能进入工业场景3. 百度文心ERNIE…...
UDP 多点通信
一、setsockopt/getsockopt 函数详解 1. 函数原型 c #include <sys/socket.h> int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen); int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);…...
什么是TCP协议?它存在哪些安全挑战?
一、TCP协议概述 TCP(传输控制协议)是互联网中面向连接、可靠的传输层协议,主要负责在不可靠的IP层上实现数据的可靠传输。其核心特点包括: 面向连接:通信前需通过三次握手(SYN-SYN/ACK-ACK)建…...
《Python星球日记》 第80天:目标检测(YOLO、Mask R-CNN)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、目标检测简介1. 边界框(Bounding Box)与类别标签2. 两阶段 vs 单阶段检测器两阶段检测器特点:单阶段检测器特点:二、YOLO(You Only Lo…...
工业大数据的定义
目录 工业大数据的定义 工业大数据发展历程 工业大数据的特征 工业大数据的处理流程 工业大数据在处理上面临的挑战 工业大数据的有效处理方案 工业大数据处理相关案例 数益工联 x TDengine 中天钢铁 x TDengine 广州某企业工业互联网项目 x TDengine 格创东智 x TD…...
Cursor vs VS Code vs Zed
代码编辑器的世界已经迎来了创新的爆发。曾经由重量级IDE或基础文本编辑器主导的领域,如今开发者们发现自己正在探索全新一波聚焦于AI集成、协作和性能的工具。 在本文中,我们将深入探讨2025年三款流行的编辑器:Cursor、Visual Studio Code (VS Code)和Zed Code Editor。每…...
道通龙鱼系列-混合翼无人机:垂直起降+长时续航
道通龙鱼系列-混合翼无人机:垂直起降长时续航 道通龙鱼系列无人机采用独特的倾转翼尖设计,有效融合多旋翼垂直起降和固定翼长时续航的双重优势,机动、灵活,适应各种复杂起降条件;整机采用快拆和高效气动设计࿰…...
单片机-STM32部分:17、数码管
飞书文档https://x509p6c8to.feishu.cn/wiki/TOQqweKHWinugokUyqzcwb0fnTd 原理: 一个二极管等于八个LED组合在一起,想要显示什么形状,就点亮对应LED即可。 数码管根据其公共端所接的阳极和阴极的不同,分为了共阴极数码管和共阳…...
Web安全科普:构建数字世界的“防盗门”
目录 一、Web安全的核心挑战 二、六大核心威胁深度解析 三、安全防御体系构建 四、开发者必备工具包 五、法律合规要点 六、未来安全趋势 一、Web安全的核心挑战 1. 攻击者视角的入口 数据流动路径:用户 → 浏览器 → 网络 → 服务器 → 数据库 脆弱点分布&a…...
深入解析HTTP协议演进:从1.0到3.0的全面对比
HTTP协议作为互联网的基础协议,经历了多个版本的迭代演进。本文将详细解析HTTP 1.0、HTTP 1.1、HTTP/2和HTTP/3的核心特性与区别,帮助开发者深入理解网络协议的发展脉络。 一、HTTP 1.0:互联网的奠基者 核心特点: 短连接模式&am…...
【RAP】RAP动作与流行舞蹈/街舞
RAP动作与流行舞蹈风格的匹配性分析 Rap动作与各种流行舞蹈风格的匹配度如下: 最匹配 街舞(Hip-hop/Street Dance) 完美匹配程度:★★★★★原因:Rap和街舞同源于嘻哈文化,共享相同的文化根基特点:街舞的断点式动作、力量感和即兴性与Rap的节奏完美契合代表动作:Break…...
BUUCTF——web刷题第一页题解
共31题,admin那题没有,因为环境问题,我做的非常卡 目录 极客大挑战 2019]Havefun [HCTF 2018]WarmU [ACTF2020 新生赛]Include [ACTF2020 新生赛]Exec [GXYCTF2019]Ping Ping Ping [SUCTF 2019]EasySQL [极客大挑战 2019]LoveSQL [极…...
windows、Ubuntu、Debian 添加静态路由
1. windows 10 添加静态路由 快捷键win R: 输入 cmd ,打开命令行窗口 route print // 查看已经存在的路由 route add 192.168.3.0 mask 255.255.255.0 192.168.3.200 // 添加静态路由 192.168.3.200 为下一跳 route add -p 192.168.…...