内核时间子系统开发

来源:互联网 发布:网络兼职网 编辑:程序博客网 时间:2024/05/29 17:58

内核的时间子系统,我们从功能上来划分,可以分为两种设备,一种叫做clocksource设备,另一种叫clockevent设备。对于一个MP Core SOC来说,一般和时间子系统相关的有两种器件,一种是free running的system counter设备,它是向系统提供时间的硬件,属于clocksource设备。另一种就是timer定时器设备,不管是CPU内部私有的还是CPU外部公共的,都属于clockevent设备。

内核提供两种设备的开发模型,分别提供了clocksource和clockevent公共模块。Clocksource模块向下提供system counter的注册接口,向上提供timekeeping的调用接口,timekeeping向上又提供时间相关的接口给用户层使用,如gettimeofday,等等。

Clockevent模块向下提供clockevent设备(硬件timer操作)的注册接口,向上提供tick设备的调用接口,hrtimer又会调用tick设备的接口来实现高精度timer解决方案,最终形成接口由用户来使用。

由上面的介绍可知,对于时间子系统的移植,只要是把最底层的硬件驱动做好,上层的框架代码基本不需要去改动,而对于底层的驱动,主要也就是指system counter驱动和timer定时器驱动。

1.对于system counter,它的功能有两个,一个是作为clocksource设备提供给timekeeping,另一个是作为scheduler clock使用,sched_clock主要是提供一个获取当前时间点到系统启动之间的纳秒值。所以我们需要做如下关键的步骤:
setup_sched_clock(…);
clocksource_register_hz(…);
这两个步骤只是为了把驱动加入到时间子系统的框架内,除了这个我们当然还要对硬件做初始化操作和一些具体的寄存器设置。

2.对于硬件timer定时器,它需要注册为一个clockevent设备到内核。当然这一步也仅仅是为了加入时间子系统框架,我们还需要为该定时器设置好中断服务程序,以便定时器中断到来时进行event的通知和处理。我们要使用如下方式来注册一个clockevent设备:
setup_irq(IRQ_TIMER1, &timer_irq);
clockevents_config_and_register(&clockevent, rate,0xf, 0xffffffff);
当然除了上面的这些,我们同样要对具体硬件进行初始化操作和寄存器配置。

对于时间子系统来说,基本上只要完成了上面两种最底层驱动的实现,就OK了,上层的模块会依赖到他们进行工作,只要底层驱动没问题,上面就可以工作正常,内核开发人员已经帮你做好了整个框架的实现。

0 0