zoukankan      html  css  js  c++  java
  • rtems 4.11 时钟驱动(arm, beagle)

    根据bsp_howto手册,时钟驱动的框架主要在 c/src/lib/libbsp/shared/Clockdrv_shell.h 文件中实现

     时钟初始化

    时钟驱动初始化函数为 Clock_initialize(),这个函数在哪里被调用了呢?

    cpukit/include/rtems/clockdrv.h 中定义了 CLOCK_DRIVER_TABLE_ENTRY

    #define CLOCK_DRIVER_TABLE_ENTRY 
      { Clock_initialize, NULL, NULL, NULL, NULL, NULL } 

    然后将 CLOCK_DRIVER_TABLE_ENTRY 放到了IO驱动列表中,在初始化的时候应该就会被调用了。


    Clock_initialize() 函数定义在 c/src/lib/libbsp/shared/Clockdrv_shell.h 中,调用了BSP提供的2个函数:
    Clock_driver_support_install_isr() => 安装中断处理函数 Clock_isr
    Clock_driver_support_initialize_hardware() => 初始化硬件
     
    再看Clock_isr(),在中断处理的结束位置调用了 Clock_driver_support_at_tick() ,这个函数可以用来通知硬件中断响应已经完成。
    c_user手册中说明的 Clock_isr() 应该调用的 rtems_clock_tick() 函数,这是在 Clock_isr()=>Clock_driver_timecounter_tick()中完成的, 不过,现在调用更新版本的rtems_timecounter_tick(),更现代的时钟驱动需要一个精准的时钟,每个tick中断时, 去读这个精准的时钟,这样就可以提高定时的精度了。
     
    Clock_exit() 函数中调用的 Clock_driver_support_shutdown_hardware() 也是BSP可以提供的函数,用于停止时钟运行。
     

    beagle

    再看beagle BSP的代码,在 c/src/lib/libbsp/arm/beagle/Clock.c 中,直接到结束位置看就行了
     

    #define Clock_driver_support_at_tick() beagle_clock_at_tick()
    #define Clock_driver_support_initialize_hardware() beagle_clock_initialize()
    #define Clock_driver_support_install_isr(isr, old_isr) 
      do {                   
        beagle_clock_handler_install(isr);          
        old_isr = NULL;              
      } while (0)
     
    #define Clock_driver_support_shutdown_hardware() beagle_clock_cleanup()
     
    /* Include shared source clock driver code */
    #include "../../shared/clockdrv_shell.h" 

     beagle_clock_initialize() 中使用了两个时钟,一个不停的跑,用作精准时钟(以最高频率运行),另一个仅用于产生tick中断。注意beagle_clock_initialize()函数中调用了rtems_configuration_get_microseconds_per_tick(),这个是从配置表中获取,由应用程序编写人员通过宏定义配置tick时间。

    ------------------------------------------------------------
    本文由WindTaiL在cnblogs中发布,转载请注明出处
  • 相关阅读:
    图解:在资深架构师眼中的架构应该是怎样的?
    面试必看|面试官之间的“潜规则”
    职业规划:专属程序员的巡礼之年
    互联网企业如何应对网站架构演化带来的“蝴蝶效应”
    阿里首席架构师,是如何选择并落地架构方案的
    你真的了解微服务架构吗?听听八年阿里架构师怎样讲述Dubbo和Spring Cloud微服务架构
    大型分布式电商系统架构演进史?
    大厂面试官:Java工程师的“十项全能”
    打包签名时出现Conversion to Dalvik format failed with error 1
    Android项目混淆打包
  • 原文地址:https://www.cnblogs.com/windtail/p/5719393.html
Copyright © 2011-2022 走看看