Linux 提供了定时器,当超过预定时间时,就会触发回调函数,此外,Linux内核还提供了短延时函数,比如微秒、纳秒、毫秒延时函数。
一、内核定时器API
1、节拍数
内核定时器是通过节拍数来计时的,节拍数与时间存在关联性,在 include/asm-generic/param.h 中定义了一秒会产生多少次节拍数。由图中可知,当前系统一秒产生的节拍数为 100 次。

知道了节拍数的概念,接下来就不得不提一下全局变量 jiffies 了,jiffies 定义在文件 linux/jiffies.h 中,用于记录系统从启动以来的系统节拍数,类似于时间戳。由此可知定时器延时的基本原理,假设当前 jiffies = 1000,我们要延时2s(200次节拍),当 jiffies = 1000 + 200 时,说明定时的时间到了,此时就会执行相应的回调函数。
注意:jiffies既然是变量,那必然存在溢出的风险,溢出以后会 jiffies 重新从 0 开始计数
2、定时器数据结构
Linux内核提供了 struct timer_list 类型来表示定时器,timer_list 定义在文件 linux/timer.h 中。
struct timer_list {
struct list_head entry;
unsigned long expires; // 超时时间(单位: 节拍数)
struct tvec_base

本文介绍了Linux内核中的定时器机制,包括节拍数、jiffies计时、定时器数据结构以及如何使用内核API进行定时器的初始化、注册、修改和删除。同时展示了如何利用定时器控制LED灯状态,以及通过ioctl接口进行延时操作。
最低0.47元/天 解锁文章
921

被折叠的 条评论
为什么被折叠?



