Linux2.6 内核中的计时器和列表

这篇博客探讨了Linux 2.6内核中的计时器API,通过一个简单的内核模块示例展示了如何使用计时器进行定时任务。虽然基本API适用于简单场景,但为了满足实时应用的精度需求,文章提到了支持更高精确度的计时器功能。通过`init_timer`、`add_timer`、`del_timer`等函数,开发者可以实现周期性的回调函数执行,例如每500毫秒执行一次的`func500`。
摘要由CSDN通过智能技术生成


我们来检查一下这些 API 函数的实际运行情况。清单 1 提供了一个简单的内核模块,用于展示简单计时器 API 的核心特点。在 init_module 中,您使用 setup_timer 初始化了一个计时器,然后调用 mod_timer 来启动它。当计时器过期时,将调用回调函数my_timer_callback。最后,当您删除模块时,计时器删除(通过 del_timer)发生。(注意来自 del_timer 的返回检查,它确定计时器是否还在使用。)


清单 1. 探索简单计时器 API
#include <linux/kernel.h> 
#include <linux/module.h>
#include <linux/timer.h>
MODULE_LICENSE("GPL"); 
static struct timer_list my_timer; 
void my_timer_callback( unsigned long data ) 
printk( "my_timer_callback called (%ld).\n", jiffies ); 
int init_module( void ) 
int ret; printk("Timer module installing\n"); // my_timer.function, my_timer.data 
setup_timer( &my_timer, my_timer_callback, 0 ); 
printk( "Starting timer to fire in 200ms (%ld)\n", jiffies );
ret = mod_timer( &my_timer, jiffies + msecs_to_jiffies(200) ); 
if (ret) 
printk("Error in mod_timer\n"); 
return 0; 
void cleanup_module( void ) 
int ret; 
ret = del_timer( &my_timer ); 
if (ret) 
printk("The timer is still in use...\n"); 
printk("Timer module uninstalling\n");
return; 
}

您可以在 ./include/linux/timer.h 中进一步了解计时器 API。尽管简单计时器 API 简单有效,但它并不能提供实时应用程序所需的准确性。为此,我们来看一下 Linux 最近新增的功能,该功能用于支持精确度更高的计时器。

一个简单的内核程序,每500ms执行一次func500

helloworld.c

#include <linux/init.h>  
#include <linux/module.h>  
#include <linux/timer.h>
MODULE_LICENSE("Dual BSD/GPL");  
struct timer_list my_timer;
void func500(unsigned long data)
{
static int a=0;
printk("nihao%d\ncurrent time is %ld\n",a,jiffies);
a++;
my_timer.expires=jiffies+msecs_to_jiffies(500);
add_timer(&my_timer);
}
void timer_call(void)
{
init_timer(&my_timer);
my_timer.expires=jiffies+msecs_to_jiffies(500);
my_timer.data=0;
my_timer.function=func500;
add_timer(&my_timer);
}


  
static int hello_init(void)  
{  
    printk("Hello, World\n"); 
    timer_call();
    return 0;  
}  
 
static void hello_exit(void)  
{  
    printk("Goodbye ,cruel world\n");  
    del_timer(&my_timer);
}  
  
module_init(hello_init);  
module_exit(hello_exit);

Makefile

obj-m:=helloworld.o
KDIR:=/lib/modules/$(shell uname -r)/build
PWD:=$(shell pwd)


dafault:
$(MAKE) -C $(KDIR) M=$(PWD) modules
clean:
$(MAKE) -C $(KDIR) M=$(PWD) clean
install:
insmod helloworld.ko
uninstall:
rmmod helloworld.ko

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值