• Embeded linux之节拍驱动


    平台:imx6、3.0.35

    节拍驱动:

      2.6.21以前内核基于节拍设计,SoC将linux移植到芯片上时,会找一个定时器,每个时钟节拍时间到会调用timer_tick函数,引发系统行为

      2.6.21以后内核基于无节拍设计,支持高精度定时器,内核配置会使能NO_HZ和HIGH_RES_TIMERS。

        无节拍含义:节拍不以周期性产生,而是根据系统运行的情况,以事件驱动动态确定节拍产生时间。

    /arch/arm/plat-mxc/time.c

    void __init mxc_timer_init(struct clk *timer_clk, void __iomem *base, int irq)

      ->static int __init mxc_clockevent_init(struct clk *timer_clk)

        ->设置clockevent_mxc

          -> static struct clock_event_device clockevent_mxc = {

    .name = "mxc_timer1",
    .features = CLOCK_EVT_FEAT_ONESHOT,
    .shift = 32,
    .set_mode = mxc_set_mode,
    .set_next_event = mx1_2_set_next_event,
    .rating = 200,
    };

      ->static void mxc_set_mode(enum clock_event_mode mode,struct clock_event_device *evt)

      //设置定时器的模式以及恢复、关闭等功能,目前采用ONESHOT模式,即一次一次产生终端。

      ->static int mx1_2_set_next_event(unsigned long evt,

    struct clock_event_device *unused)

               //evt为linux内核传递给底层定时器的一个差值,是下一次节拍终端产生的硬件定时器中计数器的值相对于当前计数器的差值。将硬件定时器设置为在当前计数器计数值+evt的时刻产生下一次节拍中断。

      -> static struct irqaction mxc_timer_irq = {

    .name = "i.MX Timer Tick",
    .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
    .handler = mxc_timer_interrupt,
    };

      ->static irqreturn_t mxc_timer_interrupt(int irq, void *dev_id)

        ->evt->event_handler(evt);

            //直接调用clock_event_device的event_handler,具体工作也是linux内核根据linux内核配置和运行情况自行设置。

  • 相关阅读:
    给JFinal添加 Sqlite 数据库支持
    超强、超详细Redis数据库入门教程
    HTML5实现多文件的上传示例代码
    JAVA 使用Dom4j 解析XML
    【VBA研究】Excel VBA利用ADODB访问数据库使用小结
    JFinal 部署在 Tomcat 下推荐方法
    Java WebService 简单实例
    关于XML的验证(DTD与XSD)一点实践
    基于机器学习的web异常检测
    30万奖金!还带你奔赴加拿大相约KDD!?阿里聚安全算法挑战赛带你飞起!
  • 原文地址:https://www.cnblogs.com/pokerface/p/6654924.html
Copyright © 2020-2023  润新知