分类: 嵌入式
2012-07-26 11:21:04
定时器 API
内核提供给驱动许多函数来声明, 注册, 以及去除内核定时器. 下列的引用展示了基本的代码块:
#include
struct timer_list
{
/* ... */
unsigned long expires;
void (*function)(unsigned long);
unsigned long data;
};
void init_timer(struct timer_list *timer);
struct timer_list TIMER_INITIALIZER(_function, _expires, _data);
void add_timer(struct timer_list * timer);
int del_timer(struct timer_list * timer);
这个数据结构expires 字段表示定时器期望运行的 jiffies 值; 在那个时间, 这个 function 函数被调用使用 data 作为一个参数. 如果你需要在参数中传递多项, 你可以捆绑它们作为一个单个数据结构并且传递一个转换为 unsiged long 的指针,
/**
* ??
* Lzy 2012\7\26
*/
#include
#include
#include
#include /*timer*/
#include /*jiffies*/
struct timer_list timer;
void timer_function(unsigned long para)
{
printk("<0>Timer Expired and para is %ld !!\n",para);
}
static int mem_module_init(void)
{
init_timer(&timer);
timer.data = 5;
timer.expires = jiffies + (5 * HZ);
timer.function = timer_function;
add_timer(&timer);
return 0;
}
static void mem_module_exit(void)
{
del_timer( &timer );
}
module_init(mem_module_init);
module_exit(mem_module_exit);
MODULE_LICENSE("GPL"); /* ?鐭? */
MODULE_AUTHOR("Lzy"); /* ???÷ */
MODULE_DESCRIPTION("memdev module"); /* ?部? */
MODULE_VERSION("V1.0"); /* ?鰦?÷ */
源码: temp.rar
定时器 API 包括几个比上面介绍的那些更多的功能. 下面的集合是完整的核提供的函数列表:
int mod_timer(struct timer_list *timer, unsigned long expires);
更新一个定时器的超时时间, 使用一个超时定时器的一个普通的任务(再一次, 关马达软驱定时器是一个典型例子). mod_timer 也可被调用于非激活定时器, 那里你正常地使用 add_timer.
int del_timer_sync(struct timer_list *timer);
如同 del_timer 一样工作, 但是还保证当它返回时, 定时器函数不在任何 CPU 上运行. del_timer_sync 用来避免竞争情况在 SMP 系统上, 并且在 UP 内核中和 del_timer 相同. 这个函数应当在大部分情况下比 del_timer 更首先使用. 这个函数可能睡眠如果它被从非原子上下文调用, 但是在其他情况下会忙等待. 要十分小心调用 del_timer_sync 当持有锁时; 如果这个定时器函数试图获得同一个锁, 系统会死锁. 如果定时器函数重新注册自己, 调用者必须首先确保这个重新注册不会发生; 这常常同设置一个" 关闭 "标志来实现, 这个标志被定时器函数检查.
int timer_pending(const struct timer_list * timer);
返回真或假来指示是否定时器当前被调度来运行, 通过调用结构的其中一个不透明的成员.