尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
linux驱动-定时器教程
定时器介绍在 Linux 内核驱动开发中定时器Timer是一个基于jiffies系统时钟滴答数运作的核心机制用于在指定时间后执行特定任务。其实现位于kernel/linux/timer.h和kernel/timer.c文件中。定时器不是从某个时刻开始“倒计时”而是设定一个未来的绝对时间点expires。系统时钟中断会不断检查当前jiffies是否到达该目标值一旦到达内核就会执行预设的超时函数。定时器类似于一种软件中断当系统时钟滴答数到达特定值时触发中断系统执行超时函数而且是处于非进程的上下文中所以调度函数必须遵守以下规则没有 current 指针、不允许访问用户空间。因为没有进程上下文相关代码和被中断的进程没有任何联系。不能执行休眠或可能引起休眠的函数和调度。任何被访问的数据结构都应该针对并发访问进行保护以防止竞争条件。内核定时器的调度函数运行过一次后就不会再被运行了相当于自动注销但可以通过在被调度的函数中重新调度自己来周期运行。在SMP系统中调度函数总是在注册它的同一CPU上运行以尽可能获得缓存的局域性。操作步骤1.初始化void init_timer(struct timer_list *timer); // 初始化定时器结构体。 void setup_timer(struct timer_list *timer, (*function)(unsigned long), unsigned long data);//初始化时一并设置超时函数和参数。2.注册/开启计时器要想定时器生效还需要将定时器添加到内核专门的链表中void add_timer(struct timer_list *timer)3.重新注册修改要修改一个定时器的调度时间可以通过调用mod_timer(struct timer_list *timer, unsigned long expires)。mod_timer()会重新注册定时器到内核而不管定时器函数是否被运行过。Linux 内核定时器是“一次性”的触发一次就失效了。如果想让超时函数再次被调用必须重新激活它。4.注销注销一个定时器可以通过del_timer(struct timer_list *timer)或del_timer_sync(struct timer_list *timer)。其中del_timer_sync是用在 SMP 系统上的在非SMP系统上它等于del_timer当要被注销的定时器函数正在另一个 cpu 上运行时del_timer_sync()会等待其运行完所以这个函数会休眠。另外还应避免它和被调度的函数争用同一个锁。对于一个已经被运行过且没有重新注册自己的定时器而言注销函数其实也没什么事可做。int timer_pending(const struct timer_list *timer);这个函数用来判断一个定时器是否被添加到了内核链表中以等待被调度运行。注意当一个定时器函数即将要被运行前内核会把相应的定时器从内核链表中删除相当于注销。函数列表分类函数名作用参数说明返回值初始化init_timer初始化定时器结构体。这是使用前必须做的第一步。timer: 指向struct timer_list的指针。无初始化setup_timer旧版API初始化时一并设置超时函数和参数。timer: 定时器指针function: 超时回调data: 传给回调的参数。无初始化timer_setup新版API推荐类型更安全的初始化方式替代setup_timer。timer: 定时器指针callback: 超时回调flags: 标志位通常填0。无启动/修改add_timer将已设置好超时时间expires的定时器激活加入内核调度队列。timer: 定时器指针。无启动/修改mod_timer最常用。用于修改定时器的超时时间。若定时器未激活则会激活它。timer: 定时器指针expires:绝对超时时间通常用jiffies 偏移。1修改了已激活的定时器0定时器原本未激活。启动/修改mod_timer_pending安全版本。仅当定时器当前处于激活状态时才修改超时时间。同mod_timer。同mod_timer。停止/删除del_timer停用定时器。不等待正在其他CPU执行的回调函数完成适合中断上下文。timer: 定时器指针。1成功停用一个激活的定时器0定时器原本未激活。停止/删除del_timer_sync同步版本。会等待其他CPU上的回调函数执行完毕。不能在中断上下文调用。timer: 定时器指针。1成功停用一个激活的定时器0定时器原本未激活。辅助timer_pending检查定时器当前是否处于激活挂起状态。timer: 定时器指针。1激活状态0未激活。辅助msecs_to_jiffies将毫秒转换为jiffies单位必须使用此函数以保证兼容性。m: 要转换的毫秒数。转换后的jiffies值。辅助usecs_to_jiffies将微秒转换为jiffies单位。m: 要转换的微秒数。转换后的jiffies值。
RELATED

相关推荐

2026封神3款AI低代码:免模型调参,开箱落地

2026封神3款AI低代码:免模型调参,开箱落地

2026年低代码赛道早已告别拖拽搭建的蛮荒时代,行业内卷核心转向原生AI智能体能力。当下绝大多数商用低代码平台存在致命通病:封装浅层、大模型适配割裂、需要运维手动微调Prompt、部署后算力适配报错率高。 一、行业祛魅:2026年,…

📅 2026/10/8 17:40:49
什么时候用npm install 什么时候用pnpm install

什么时候用npm install 什么时候用pnpm install

一般看项目用哪个包管理器:有 package-lock.json:用 npm install有 pnpm-lock.yaml:用 pnpm install有 yarn.lock:用 yarn install对你这个 Postiz 项目,优先看根目录有没有 pnpm-lock.yaml 或 package-lock.json。不要…

📅 2026/10/26 10:07:44
AI 电动工具智能功率覆盖电机驱动 完整选型方案

AI 电动工具智能功率覆盖电机驱动 完整选型方案

2026年随着 AI 技术在电动工具中的深度融合(如智能扭矩控制、自适应负载、电池健康管理),对功率 MOSFET 提出更高要求:高效率、高功率密度、高可靠性。微碧半导体(VBsemi)基于先进 Trench 工艺,…

📅 2026/10/20 5:45:57
MORE NEWS

更多资讯

📰

R语言hyperframes详解:让空间对象与元数据同行的数据结构

先讲一个我记忆里特别深刻的场景:三年前做一次空间点格局实验,要同时分析几十个样地的结果,每个样地会产出一张密度图、一个拟合模型、还有十来个统计指标。按照惯性思维,我打开 RStudio 准备把这些信息全部塞进 data.frame&#…

📰

从零搭建个人技能体系:刻意练习与可迁移能力实战指南

刚工作那几年,我一度陷入一个很尴尬的状态:收藏夹里存了几百个教程,书架上堆着二十多本“必读经典”,报过的线上课程更是数不清。可真正遇到问题时,脑子里能调用的东西却少得可怜。“skills”这个词人人都挂在嘴边&…

📰

告别‘学了就忘’:从技能地图到变现,一套高效能学习方法论

不知道你有没有过这种体验:收藏夹里躺着几十篇“干货”,网盘里存了十几个G的教程,每天也在刷各种碎片知识,可真到用的时候,脑子里却一片空白。我们太容易把“知道了”当成“学会了”,把“看过”当成“会用”…

📰

原根判定与搜索:从数论基础到NTT工程实践

1. 原根:数论里那个“能生出整个群”的种子你翻过初等数论教材,大概率在“模运算”章节末尾见过这个词——原根。它不像最大公约数那样天天打交道,也不像费马小定理那样被反复引用,但它一旦出现,往往意味着某个模数下的…

📰

VISSIM交通仿真优化方法与实战技巧

1. 项目概述:VISSIM交通仿真优化方法解析第一次接触VISSIM是在2018年参与城市快速路改造项目时,当时我们需要评估新建匝道对主路通行效率的影响。传统的人工计算和静态模型已经无法满足复杂交通流分析的精度要求,而VISSIM的动态微观仿真能力完…

📰

Harness 与 AgentCore Gateway 深度集成:AI Agent 实时安全防线全拆解

先说一个我在生产环境里亲眼见过的事故现场。一个跑在客服场景的 AI Agent,上线第二周就被用户用一段精心构造的提示词绕过了系统提示,直接调用了内部通讯录查询接口,把几百条员工信息拖了出来。那一次之后我们才意识到:AI Agent …

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬