注册时钟事件监听器

原创 2011年01月11日 22:53:00

5.1.3 注册时钟事件监听器

由于我们在.config文件中设置了CONFIG_GENERIC_CLOCKEVENTS,所以,start_kernel函数的第558行调用kernel/time/tick-common.c中的tick_init函数,来注册一个时钟事件监听器。tick_init只调用一个clockevents_register_notifier函数:

 

static struct notifier_block tick_notifier = {

       .notifier_call = tick_notify,

};

 

void __init tick_init(void)

{

       clockevents_register_notifier(&tick_notifier);

}

 

int clockevents_register_notifier(struct notifier_block *nb)

{

       unsigned long flags;

       int ret;

 

       raw_spin_lock_irqsave(&clockevents_lock, flags);

       ret = raw_notifier_chain_register(&clockevents_chain, nb);

       raw_spin_unlock_irqrestore(&clockevents_lock, flags);

 

       return ret;

}

 

这个函数很简单,只要先明白一个notifier_block结构就行了:

struct notifier_block {

       int (*notifier_call)(struct notifier_block *, unsigned long, void *);

       struct notifier_block *next;

       int priority;

};

 

tick_notifier全局变量在编译vmlinux的时候其notifier_call被设置成了tick_notify函数:

 

static int tick_notify(struct notifier_block *nb, unsigned long reason,

                            void *dev)

{

       switch (reason) {

 

       case CLOCK_EVT_NOTIFY_ADD:

              return tick_check_new_device(dev);

 

       case CLOCK_EVT_NOTIFY_BROADCAST_ON:

       case CLOCK_EVT_NOTIFY_BROADCAST_OFF:

       case CLOCK_EVT_NOTIFY_BROADCAST_FORCE:

              tick_broadcast_on_off(reason, dev);

              break;

 

       case CLOCK_EVT_NOTIFY_BROADCAST_ENTER:

       case CLOCK_EVT_NOTIFY_BROADCAST_EXIT:

              tick_broadcast_oneshot_control(reason);

              break;

 

       case CLOCK_EVT_NOTIFY_CPU_DYING:

              tick_handover_do_timer(dev);

              break;

 

       case CLOCK_EVT_NOTIFY_CPU_DEAD:

              tick_shutdown_broadcast_oneshot(dev);

              tick_shutdown_broadcast(dev);

              tick_shutdown(dev);

              break;

 

       case CLOCK_EVT_NOTIFY_SUSPEND:

              tick_suspend();

              tick_suspend_broadcast();

              break;

 

       case CLOCK_EVT_NOTIFY_RESUME:

              tick_resume();

              break;

 

       default:

              break;

       }

 

       return NOTIFY_OK;

}

 

这上面一串函数是什么意思?这里要学一个新知识——通知链技术。我们知道内核一些驱动或文件系统是被编译成模块了的,当某个模块的某些事件对其模块是很有用的,则本模块应该定义一个通知链,并导出接口。

 

那么其它模块对其事件感兴趣时,可以调用这些接口注册(注销)当事件发生时的行为。而本模块在事件发生时,调用通知其链上的所有订阅者(调用其函数)。

 

而这个notifier_block就是通知链中的元素,记录了当发出通知时,应该执行的操作(即回调函数)。这里tick_notifier是一个时钟事件监听器模块,当发出通知是,就执行tick_notify函数。

 

所以,clockevents_register_notifier函数就调用raw_notifier_chain_register来注册,其实就是把三步:获得自旋锁、把tick_notifier加入clockevents_chain、释放自旋锁。

安卓的事件分发机制

android中与事件相关的方法有:dispatchTouchEven、onInterceptTouchEvent、onTouchEvent。能够响应这些方法的控件包括:ViewGroup及其子类、A...
  • qq_31552755
  • qq_31552755
  • 2016年11月04日 17:57
  • 117

SWT注册无类型事件监听器

SWT类所代表的事件常量: 事件类型常量 说明 SWT.Activate 当激活窗口时 SWT.Arm 菜单项被选中之前 SWT.Close 关...
  • o274274
  • o274274
  • 2012年03月31日 10:12
  • 632

事件及事件监听器类 java

一般来说,Xevent对应Xlistener,相应注册方法为addXListener。   1.     ComponentEvent组件事件类 ComponentListener组件事件接口 ...
  • yuge1hao
  • yuge1hao
  • 2014年04月07日 22:39
  • 862

Linux内核时间管理子系统——时钟源

在Linux内核中有两种不同的clock设备,一种是clock source设备,另一种是clock event设备。...
  • colddown
  • colddown
  • 2014年08月27日 22:17
  • 1359

Java中的事件监听注册

Java中的事件监听是整个Java消息传递的基础和关键。牵涉到两类对象:事件发生者和事件监听者。事件发生者是事件的起源,它可以是一个按钮,编辑框等。事件监听者就是事件的接受者,如果要想接收某个事件,它...
  • wtyvhreal
  • wtyvhreal
  • 2014年11月09日 17:43
  • 2024

  事件监听器

  每类事件都有对应的事件监听器,监听器是接口,根据动作来定义方法。   例如,与键盘事件KeyEvent相对应的接口是:   public interface KeyListener extends...
  • william_918
  • william_918
  • 2008年09月05日 20:09
  • 283

事件监听器

1.背景 类是对象的抽象,是一个特征集,我们会定义一些成员变量和构造函数来体现不同实例之间的差异。比如孩子中会有名字等 当然在类中也会有一些成员方法,如孩子们可以玩游戏等。 这些都是我们可以根据...
  • mouttz
  • mouttz
  • 2013年10月06日 22:33
  • 624

javascript 案例:十秒钟后协议文本框下的注册按钮才能点击,时钟倒数

1.注册按钮初始状态为不可用,disabled 2.启动定时器,setInterval,1秒钟运行一次CountDown方法,设定一个初始值为10的全局变量,    在CountDown方法中对全...
  • limlimlim
  • limlimlim
  • 2012年12月19日 16:43
  • 1217

【Spring4揭秘 基础1】监听器和事件

基础观察者模式 :观察者(Observer)模式又名发布-订阅 。GOF给观察者模式如下定义:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。...
  • u011179993
  • u011179993
  • 2016年05月24日 10:02
  • 1883

Android事件和监听器详细的介绍

Android中的事件按类型可以分为:按键事件和屏幕触摸事件。在MVC模型中,控制器根据界面事件(UI Event)类型不同,将事件传递给界面控件不同的事件处理函数。 按键事件(KeyEvent):将...
  • heyuchang666
  • heyuchang666
  • 2014年12月05日 15:49
  • 2554
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:注册时钟事件监听器
举报原因:
原因补充:

(最多只允许输入30个字)