mips时钟中断初始化
相关函数有:1 tick_init(); 2 init_timers(); 3 hrtimers_init(); 4 time_init();
1 tick_init()
注册一个时钟消息链的框架,即把 struct notifier_block tick_notifier 实体结构加入到clockevents_chain链中,clockevents_chain链是一个struct raw_notifier_head结构的表头
2 init_timers()
首先初始化每个cpu的基准定时器和一些统计.注册cpu的时钟消息处理回调函数,即把struct notifier_block __cpuinitdata timers_nb实体加入到全局的cpu_chain链中,cpu_chain链是一个struct raw_notifier_head结构的表头.在打开软时钟中断.
3 hrtimers_init()
高精度时钟有关
4 time_init()
初始化和平台相关的时钟频率.初始化时钟消息,这里以MIPS 74k为例
函数调用过程:
time_init()
plat_time_init()
mips_clockevent_init()
r4k_clockevent_init()
clockevents_register_device()
__raw_notifier_call_chain()发送消息到clockevents_chain链
tick_notify()
tick_check_new_device()
tick_setup_device()
tick_setup_periodic()
tick_set_periodic_handler()//重新初始化时钟设备的消息处理函数cd->event_handler
init_mips_clocksource()
r4k_clockevent_init()函数先注册一个时钟消息的设备到clockevent_devices链中,然后发送一个CLOCK_EVT_NOTIFY_ADD消息到clockevents_chain链,最终该消息发送到tick_notifier->notifier_call()函数(tick_notify),该函数在根据消息类型路由到了tick_check_new_device()函数.进过一大堆的检查.最终把新的旧的struct clock_event_device加入到clock_released链中,把新的struct clock_event_device加入到struct tick_device结构的evtdev指针.在重新初始化时钟设备的消息处理函数cd->event_handler,使其指向tick_handle_periodic(),并最终在时钟中断产生时时的jiffies_64加1,在注册一个时钟中断的action(c0_compare_irqaction)
阅读(1608) | 评论(0) | 转发(0) |