内核时间子系统开发
2016-06-06 14:10
190 查看
内核的时间子系统,我们从功能上来划分,可以分为两种设备,一种叫做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了,上层的模块会依赖到他们进行工作,只要底层驱动没问题,上面就可以工作正常,内核开发人员已经帮你做好了整个框架的实现。
内核提供两种设备的开发模型,分别提供了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了,上层的模块会依赖到他们进行工作,只要底层驱动没问题,上面就可以工作正常,内核开发人员已经帮你做好了整个框架的实现。
相关文章推荐
- Linux 自检和 SystemTap
- LKRG:用于运行时完整性检查的可加载内核模块
- 如何在 Linux 上安装、配置 NTP 服务器和客户端?
- 一张图看尽 Linux 内核运行原理
- Greg Kroah-Hartman 解释内核社区是如何使 Linux 安全的
- Chrony:一个类 Unix 系统上 NTP 客户端和服务器替代品
- DB2 日期和时间的函数应用说明
- flex actionScript时间处理相加返回相加后的date
- Delphi实现读取系统时间与日期完整实例
- Lua常用时间函数使用实例
- Ruby中Time对象的常用函数总结
- asp格式化日期时间格式的代码
- Powershell小技巧之通过EventLog查看近期电脑开机和关机时间
- C#实现判断一个时间点是否位于给定时间区间的方法
- 比较简洁的JavaScript 实时显示时间的脚本 修正版
- C#简单读取、改变文件的创建、修改及访问时间的方法
- 在C语言中转换时间的基本方法介绍
- C语言循环结构与时间函数用法实例教程
- C#获取指定目录最后写入时间的方法
- php mssql 时间格式问题