linux 单调时间实现原理,Linux时间子系统(一) -- 原理

转载请标明出处floater的csdn blog,http://blog.csdn.net/flaoter

1 内核概述

内核2.6之前的时间子系统主要是围绕低分辨定时器和基于它实现的tick时钟周期展开的,随着嵌入式应用的发展,时间子系统引入了两个主要功能: 高分辨率定时器, tickless系统。

1. tickless系统。为了满足嵌入式设备的低功耗需求,会停用周期性的时钟,使系统长时间地进入省电模式。

2.高分辨率定时器。为了满足多媒体的应用程序需要的非常精确的计时功能。

原来的定时器是由固定的栅栏所框定的,而高分辨率事件在本质上可以发生在任意时刻,如下图。高分辨率时钟信号只在某些事件可能发生时才会发生。

8035a8d929d72321997323ac392781b1.png

下图是来自wowotech的一幅关于当前时间子系统的框架图。

■ 最底层是硬件和驱动层,每个cpu core都有自己的cpu local timer,此外SOC内部肯定会有一个用于全局的global counter。

■ 中间层是linux内核层,内核抽象出了时钟源(clocksource), 时钟事件设备(clock_event_device), tick设备(tick_device)用于时间管理。分为左右两部分,

• 右边实现计时功能。linux内核有各种time line, 包括real time clock, monotonic clock, monotonic raw clock等。clocksource提供了一个单调增加的计时器产生tick,为timeline提供时钟源。timekeeper是内核提供时间服务的基础模块,负责选择并维护最优的clocksource。

• 左边实现定时功能。clock event管理可产生event或是触发中断的定时器, 一般而言,每个CPU形成自己的一个小系统,也就要管理自己的clock event。tick device是基于clock event设备进行工作的,cpu管理自己的调度、进程统计等是基于tick设备的。低精度timer和高精度timer都是基于tick device生成的定时器设备,关于它们的事件和周期信号的关系在上面的图中有一个大体的介绍。

■ 最上层是linux应用层。基于timekeeping设备的是时间管理的库time lib,基于定时器设备的是定时管理的库timer lib。

4d9d625caab7ce9aea9db6825ee6885f.png

2 时钟硬件介绍

ARM在自己的design中加入了时钟模块的设计,方便SOC开发者进行设计和管理。下图是来自与Arm Architecutre Reference Manual Armv8的arm generic timer的框图。

97f4db27465b86ce11ff4d7104c5a4d4.png

ARM Generic Timer的主要特点,

• System Counter, 就是计数器,计量real-time单调递增,全局共享。

• Timer,就是定时器,每个Processor Element都有一个,当定时是时间结束时会触发system events。可进行增加计数和减少计数,可工作在real-time和virtual-time

• Virtual Counter,需要virtualization extension的系统支持,virtualization并不是本节关注的内容,所以关于这方面的设计在此不进行展开。

每一个clock cycle,System counter会加一。每个timer可以通过Counter interface获得System counter的值,并且所有timer看到的counter值都是一致的。

此外,System counter需要工作在一个Always-powered的domain,不能进入睡眠。timer会和processor一起会进入休眠模式。

1. System Counter

Width 至少56 bits, 64-bit 读操作返回的值0扩展到64bit.

Frequency 1-50MHz,低功耗时支持以更低频率计数并每次增长大于1的数,例如10MHz的counter可以在10M频率下每次加一,也可以在低功耗的50K频率下每次加200

Roll-over 40 years.

Accuracy 推荐24小时10s误差

Start-up 0

此外,system counter还支持event stream功能,ARM处理器会进入WFE状态等待event进行唤醒,这个唤醒操作可能来自与其他处理器或者SOC上的其它硬件block,比如system counter,它能产生event stream生成周期性的wakeup event。

2. Timers

ARMv8 每个processor都有如下四个timer,

• A Non-secure EL1 physical timer.

• A Secure EL1 physical timer.

• A Non-secure EL2 physical timer.

• A virtual timer.

每个timer都有输出信号输出到GIC,可产生中断。并且由于timer都是cpu私有的,所以应该使用PPI类型的中断。

此外关于时钟硬件的寄存器访问支持两种方式,

• CP15协处理访问

• memory map到IO地址空间,需要SOC设计时进行定义

具体使用依赖于具体的SOC设计。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值