Linux 内核开发 - 内核定时器

时间差的度量

系统的定时器硬件以固定的频率产生时钟中断,产生始终中断的间隔以HZ 常量来决定,通常在50~1200之间,x86默认是1000,HZ可以根据不同的内核来配置。

Linux 采用jiffies (unsigned long)来对时钟中断进行计数,每当发生时钟中断时jiffies的值将+1,因此jiffies就记录了系统开机以来的时钟中断总次数。在驱动开发过程中经常会使用时钟中断来计算不同事件的时间间隔。

延迟执行

对于不精确的时间延迟要求,可以使用while 循环来计算延迟的时间。

//延迟10秒

	unsigned long j = jiffies + 10 * HZ;
	while(jiffies < j)
	{
		// do something.
	}

内核定时器

内核定时器用于控制每个函数在未来的某个时间点执行。内核定时器被注册后只能执行一次,如果尚未到达执行目标函数的时间点就删除该定时器,那么目标函数将不能被执行。

内核定时器使用的数据结构(不同内核定时事件以双向链表的形式连接起来):

struct timer_list {
	struct list_head entry; //链表头
	unsigned long expires; //延迟的时间
	struct tvec_base *base;

	void (*function)(unsigned long); //目标函数,定时时间到达时会被调用
	unsigned long data; //目标函数携带的数据
	……
};
  • init_timer(struct timer_list *timer) //初始化timer事件
  • void add_timer(struct timer_list *timer) //添加定时事件
  • int del_timer(struct timer_list *timer) //删除定时事件

范例:

#include <linux/module.h>
#include <linux/init.h>

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Jack Chen");
MODULE_DESCRIPTION("Hello World");
MODULE_ALIAS("A simple module");
MODULE_VERSION("V1.0");

struct timer_list timer;

static void _function(int data)
{
	printk("<3> time is up data:%d\n",data);
}

static int timer_init()
{
	init_timer(&timer);
	timer.expires = jiffies + 5*HZ;
	timer.function = _function;
	timer.data = 10;
	add_timer(&timer);

	return 0;
}

static void timer_exit()
{
	del_timer(&timer);
}

module_init(timer_init);
module_exit(timer_exit);

时间: 2024-12-23 01:47:33

Linux 内核开发 - 内核定时器的相关文章

Linux 内核开发—内核简单介绍

内核简单介绍 Linux 构成 Linux 为什么被划分为系统空间和内核空间 隔离核心程序和应用程序,实现对核心程序和数据的保护. 什么内核空间,用户空间 内核空间和用户空间是程序执行的两种不同的状态,Linux对自身软件系统进行了划分,一部分核心的软件独立于普通的软件,拥有特权级别,可以訪问平台的全部硬件和资源,称为"内核空间".而普通的软件执行在"用户空间",它仅仅拥有有限的系统资源,不能直接訪问内核空间和硬件资源. 将系统分为"内核空间"和

Linux 内核开发——内核简介

内核简介 Linux 构成 Linux 为什么被划分为系统空间和内核控件 隔离核心程序和应用程序,实现对核心程序的保护,如保护操作系统本身的保护. 什么内核空间,用户空间 内核空间和用户空间是程序运行的两种不同的状态,Linux对自身软件系统进行了划分,一部分核心的软件独立于普通的软件,拥有特权级别,能够访问平台的所有硬件和资源,称为"内核空间".而普通的软件运行在"用户空间",它只拥有有限的系统资源,不能直接访问内核空间和硬件资源. 将系统分为"内核空间

《Linux设备驱动开发具体解释(第3版)》(即《Linux设备驱动开发具体解释:基于最新的Linux 4.0内核》)网购链接

<Linux设备驱动开发具体解释:基于最新的Linux 4.0内核> china-pub   spm=a1z10.3-b.w4011-10017777404.30.kvceXB&id=521111707813&rn=4cf013961288ab7c4dfd2016aeb21fa8&abbucket=5">天猫     dangdang   京东 China-pub 8月新书销售榜 推荐序一 技术日新月异,产业斗转星移,滚滚红尘,消逝的事物太多,新事物的诞

《Linux设备驱动开发详解:基于最新的Linux 4.0内核》china-pub预售

<Linux设备驱动开发详解:基于最新的Linux 4.0内核>china-pub今日上线进入预售阶段: http://product.china-pub.com/4733972 推荐序一 技术日新月异,产业斗转星移,滚滚红尘,消逝的事物太多,新事物的诞生也更迅猛.众多新生事物如灿烂烟花,转瞬即逝.当我们仰望星空时,在浩如烟海的专业名词中寻找,赫然发现,Linux的生命力之旺盛顽强,斗志之昂扬雄壮,令人称奇.它正以摧枯拉朽之势迅速占领包括服务器.云计算.消费电子.工业控制.仪器仪表.导航娱乐等

《Linux设备驱动开发详解:基于最新的Linux 4.0内核》china-pub 预售

<Linux设备驱动开发详解:基于最新的Linux 4.0内核>china-pub今日上线进入预售阶段: http://product.china-pub.com/4733972 推荐序一 技术日新月异,产业斗转星移,滚滚红尘,消逝的事物太多,新事物的诞生也更迅猛.众多新生事物如灿烂烟花,转瞬即逝.当我们仰望星空时,在浩如烟海的专业名词中寻找,赫然发现,Linux的生命力之旺盛顽强,斗志之昂扬雄壮,令人称奇.它正以摧枯拉朽之势迅速占领包括服务器.云计算.消费电子.工业控制.仪器仪表.导航娱乐等

Linux内核设计基础(十)之内核开发与总结

(1)Linux层次结构: (2)Linux内核组成: 主要由进程调度(SCHED).内存管理(MM).虚拟文件系统(VFS).网络接口(NET)和进程间通信(IPC)等5个子系统组成. (3)与Unix的差异: Linux支持动态加载内核模块 支持对称多处理(SMP)机制 Linux内核可以抢占 Linux内核并不区分线程和其他的一般进程 Linux提供具有设备类的面向对象的设备模型.热插拔事件,以及用户空间的设备文件系统(sysfs) (4)内核开发的特点: 内核编程时既不能访问C库也不能访

如何参与Linux内核开发(转)

本文来源于linux内核代码的Document文件夹下的Hoto文件.Chinese translated version of Documentation/HOWTO If you have any comment or update to the content, please contact theoriginal document maintainer directly.  However, if you have a problemcommunicating in English yo

《Linux内核设计与实现》读书笔记(二)- 内核开发的准备

在尝试内核开发之前,需要对内核有个整体的了解. 主要内容: 获取内核源码 内核源码的结构 编译内核的方法 内核开发的特点 1. 获取内核源码 内核是开源的,所有获取源码特别方便,参照以下的网址,可以通过git或者直接下载压缩好的源码包. http://www.kernel.org 2. 内核源码的结构 目录 说明 arch 特定体系结构的代码 block 块设备I/O层 crypo 加密API Documentation 内核源码文档 drivers 设备驱动程序 firmware 使用某些驱动

Linux内核开发 — 进程调度

本节简单介绍内核开发中,进程调度的相关知识点. 什么是进程调度 进程调度就是在已经就绪的进程中选择一个最合适的进程执行的过程. 进程调度策略 实时类调度策略 非实时类调度策略 进程调度时机 主动式抢占 当前进程因为需要等待资源等原因主动放弃执行权限,主动要求切换到下一个进程执行. 主动放弃CPU的例子: current->state = TASK_INTERRUPTIBLE;               schedule(); 被动式抢占 当前进程因为优先级.进程属性等原因被迫让出CPU执行权限