加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (http://www.0523zz.com/)- 视觉智能、AI应用、CDN、行业物联网、智能数字人!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

Linux芯片级移植与底层驱动(基于3.7.4内核) 内核节拍

发布时间:2016-01-19 13:49:20 所属栏目:Linux 来源:网络整理
导读:1.SoC Linux底层驱动的组成和现状 为了让Linux在一个全新的ARM SoC上运行,需要提供大量的底层支撑,如定时器节拍、中断控制器、SMP启动、CPU hotplug以及底层

当前Linux多采用tickless方案,并支持高精度定时器,内核的配置一般会使能NO_HZ(即tickless,或者说动态tick)和HIGH_RES_TIMERS。要强调的是tickless并不是说系统中没有时钟节拍了,而是说这个节拍不再像以前那样,周期性地产生。Tickless意味着,根据系统的运行情况,以事件驱动的方式动态决定下一个tick在何时发生。如果画一个时间轴,周期节拍的系统tick中断发生的时序看起来如下:

Linux芯片级移植与底层驱动(基于3.7.4内核) 内核节拍

而NO_HZ的Linux看起来则是,2次定时器中断发生的时间间隔可长可短:

Linux芯片级移植与底层驱动(基于3.7.4内核) 内核节拍

在当前的Linux系统中,SoC底层的timer被实现为一个clock_event_device和clocksource形式的驱动。在clock_event_device结构体中,实现其set_mode()和set_next_event()成员函数;在clocksource结构体中,主要实现read()成员函数。而定时器中断服务程序中,不再调用timer_tick(),而是调用clock_event_device的event_handler()成员函数。一个典型的SoC的底层tick定时器驱动形如:

61static irqreturn_t xxx_timer_interrupt(int irq, void *dev_id)

62{

63        struct clock_event_device *ce = dev_id;

65        …

70        ce->event_handler(ce);

71

72        return IRQ_HANDLED;

73}

74

75/* read 64-bit timer counter */

76static cycle_t xxx_timer_read(struct clocksource *cs)

77{

78        u64 cycles;

79

80        /* read the 64-bit timer counter */

81        cycles = readl_relaxed(xxx_timer_base + XXX_TIMER_LATCHED_HI);

83        cycles = (cycles << 32) | readl_relaxed(xxx_timer_base + XXX_TIMER_LATCHED_LO);

84

85        return cycles;

86}

87

88static int xxx_timer_set_next_event(unsigned long delta,

89        struct clock_event_device *ce)

90{

91        unsigned long now, next;

92

93        writel_relaxed(XXX_TIMER_LATCH_BIT, xxx_timer_base + XXX_TIMER_LATCH);

(编辑:云计算网_泰州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读