下面这段code,包含相关头文件,声明定时器函数,定义定时器和等待队列。
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/timer.h>
#include <linux/kthread.h>
#include <linux/delay.h>
#include <linux/wait.h>
static void timer_func(struct timer_list *timer);
static DEFINE_TIMER(gtimer, timer_func);
static struct task_struct *gtask;
static DECLARE_WAIT_QUEUE_HEAD(wait_queue);
static int waited = 0;
下面这段code,分别为定时器函数和线程函数。其中定时器函数实现了,唤醒等待队列;线程函数在一直等待队列唤醒时间和等待标志,成功后修改定时器为100ms后再次唤醒。
static void timer_func(struct timer_list *timer)
{
if (waited == 0) {
waited = 1;
wake_up_interruptible(&wait_queue);
printk("wake up. jiffies:%lx\n", jiffies);
}
}
static int mock_wait_thread(void *data)
{
int error = 0;
while (!kthread_should_stop()) {
error = wait_event_interruptible(wait_queue, waited);
printk("state:%d\n", error);
if (!error) {
printk("waited, jiffies:%lx\n", jiffies);
waited = 0;
mod_timer(>imer, jiffies + msecs_to_jiffies(100));
//msleep(1000);
}
}
return 0;
}
下面这段code,为模块的初始化和退出函数。在初始化函数中,添加定时器,创建线程;在退出函数中,停止线程,删除定时器。
static int __init timer_thread_init(void)
{
add_timer(>imer);
//init_waitqueue_head(&wait_queue);
gtask = kthread_run(mock_wait_thread, NULL, "mock irq");
if (!gtask) {
printk("create thread failed\n");
}
printk("timer_thread module init\n");
return 0;
}
static void __exit timer_thread_exit(void)
{
kthread_stop(gtask);
del_timer(>imer);
printk("timer_thread module exit\n");
}
module_init(timer_thread_init);
module_exit(timer_thread_exit);
MODULE_LICENSE("GPL");
以上code的运行效果是,会每间隔100毫秒交叉打印"waited..."和"wake up"。