QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

发新帖

22

主题

1

听众

457

积分

中级工程师

Rank: 3

  • TA的每日心情
    开心
    2013-4-28 20:45
  • 签到天数: 1 天

    [LV.1]初来乍到

    最后登录
    2013-11-3
    威望
    0
    金钱
    344
    贡献
    0
    注册时间
    2013-4-28
    积分
    457
    帖子
    93
    主题
    22
    精华
    4
    UID
    279

    [原创经验] eCos嘀嗒定时器

    发表于 2013-4-30 16:02:22 |显示全部楼层
    更多
    本帖最后由 weddedbonze 于 2013-5-1 18:35 编辑

    郑明督<mingdu <dot> zheng <at> gmail.com>
    最后修改:2013-04-30
    最新版本:DocBook XMLHTMLCHMPDF


    目录
    1. 概述

    2. 配置项
    3. 内核函数
    4. HAL代码
    5. 内核代码
    6. 计数器溢出
    1. 概述
    嘀嗒定时器(Tick)是操作系统的核心部件之一,操作系统使用嘀嗒定时器实现时间片轮、延时、超时判断等特性。 本文介绍eCos系统中的嘀嗒定时器的使用和实现,以及需要考虑的一些问题。
    嘀嗒定时器在eCos中称做RealTimeClock(RTC),一般情况下,RTC是指提供年月日时分秒的实时时钟, 在eCos中RTC表示嘀嗒定时器,WallClock(挂钟)才是指提供年月日时分秒的实时时钟,为什么是这样?
    通常使用定时器模块为系统提供嘀嗒定时服务,Cortex-M提供了专用的SysTick定时器。
    嘀嗒定时器与硬件相关的代码是由HAL提供的,与硬件无关的代码由内核的clock.cxx提供,ISR和DSR也是由clock.cxx提供的。

    2. 配置项
    共有3个配置项与嘀嗒定时器有关,分别是:Real-time clock numerator(CYGNUM_HAL_RTC_NUMERATOR)、 Real-time clock denominator(CYGNUM_HAL_RTC_DENOMINATOR)、Real-time clock period(CYGNUM_HAL_RTC_PERIOD), 这3个配置项通常在平台层HAL或变体层HAL定义。
    CYGNUM_HAL_RTC_NUMERATOR和CYGNUM_HAL_RTC_DENOMINATOR定义嘀嗒定时器中断间隔时间, 中断间隔时间 =CYGNUM_HAL_RTC_NUMERATOR / CYGNUM_HAL_RTC_DENOMINATOR,单位为纳秒(ns)。 默认情况下CYGNUM_HAL_RTC_NUMERATOR = 1000000000ns = 1s,CYGNUM_HAL_RTC_DENOMINATOR = 100, 中断间隔 = 1000000000 / 100 = 10000000ns = 10ms。在CYGNUM_HAL_RTC_NUMERATOR = 1s 的情况下, CYGNUM_HAL_RTC_DENOMINATOR 等于每秒产生的嘀嗒数。 据eCos参考手册的描述,采用分子分母的形式来定义中断间隔的原因是提高分辨率减少误差, 在CYGNUM_HAL_RTC_NUMERATOR不能被CYGNUM_HAL_RTC_DENOMINATOR整除的情况下,确实是这么一回事。
    CYGNUM_HAL_RTC_PERIOD是嘀嗒定时器中断间隔时间内CPU运行的时钟数,这个选项用来初始化定时器硬件, 一般情况下,CYGNUM_HAL_RTC_PERIOD = CPU主频 / CYGNUM_HAL_RTC_DENOMINATOR。

    3. 内核函数
    与嘀嗒定时器相关的内核函数包括cyg_current_time、cyg_thread_delay以及支持超时机制的通信和同步函数。
    cyg_tick_count_t cyg_current_time(void):读取当前嘀嗒计数器值,返回值类型为cyg_tick_count_t,这是个64位无符号整数类型。
    void cyg_thread_delay(cyg_tick_count_t delay):线程延时,delay为需要延时的嘀嗒数。
    支持超时机制的通信和同步函数包括cyg_mbox_timed_get、cyg_mbox_timed_put、cyg_semaphore_timed_wait、cyg_flag_timed_wait、cyg_cond_timed_wait,这些函数都有一个abstime参数,abstime是嘀嗒计数器值的绝对值, 这是与cyg_thread_delay的delay参数不同的,在使用这些函数前首先要调用cyg_current_time获取当前计数器值,然后加上超时时间再传给abstime参数, 为什么不使用和cyg_thread_delay一样的相对计数器值呢?下面是使用超时等待条件变量的一个简单例子。
    res = cyg_cond_timed_wait( cv, cyg_current_time()+10 );

    4. HAL代码
    HAL为内核实现嘀嗒定时器提供3个硬件相关的宏定义:HAL_CLOCK_INITIALIZE、HAL_CLOCK_RESET、 CYGNUM_HAL_INTERRUPT_RTC
    HAL_CLOCK_INITIALIZE( _period_ )对定时器进行初始化,通常对定时器模块相关的寄存器进行设置, 但是不会安装ISR和DSR,也不会使能中断,这部分工作由内核在初始化嘀嗒定时器时完成。 _period_为CYGNUM_HAL_RTC_PERIOD。
    HAL_CLOCK_RESET( _vec_, _period_ )清除定时器中断标志,复位计数器值,在ISR中调用, _vec_为CYGNUM_HAL_INTERRUPT_RTC,_period_为CYGNUM_HAL_RTC_PERIOD。
    CYGNUM_HAL_INTERRUPT_RTC嘀嗒定时器的中断号,定时器中断的ISR和DSR是由内核提供的, 只有知道中断号的情况下,才能安装ISR和DSR,以及屏蔽和使能中断。

    帖子限制长度啊,后续内容请移步到 http://zhengmingdu.org/docbook/ecos-tick-timer/index.html 或者下载附件中的CHM版本,如果CHM版显示不出来,那么打开CHM文件属性,点击解除锁定。


    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?注册会员 新浪微博账号登陆

    回复

    使用道具 举报

    84

    主题

    16

    听众

    2930

    积分

    超级版主

    Rank: 8Rank: 8Rank: 8Rank: 8

    该用户从未签到

    最后登录
    2015-5-31
    威望
    0
    金钱
    2418
    贡献
    0
    注册时间
    2012-5-1
    积分
    2930
    帖子
    492
    主题
    84
    精华
    4
    UID
    2
    发表于 2013-5-1 09:17:42 |显示全部楼层
    兄弟,你的链接打不开呢!
    回复

    使用道具 举报

    22

    主题

    1

    听众

    457

    积分

    中级工程师

    Rank: 3

  • TA的每日心情
    开心
    2013-4-28 20:45
  • 签到天数: 1 天

    [LV.1]初来乍到

    最后登录
    2013-11-3
    威望
    0
    金钱
    344
    贡献
    0
    注册时间
    2013-4-28
    积分
    457
    帖子
    93
    主题
    22
    精华
    4
    UID
    279
    发表于 2013-5-1 16:32:33 |显示全部楼层
    reille 发表于 2013-5-1 09:17
    兄弟,你的链接打不开呢!

    嘿嘿,恢复了,回头发个PDF和CHM版作为附件,省的链接失效
    专注于工业控制领域的数字电路和嵌入式软件
    回复

    使用道具 举报

    22

    主题

    1

    听众

    457

    积分

    中级工程师

    Rank: 3

  • TA的每日心情
    开心
    2013-4-28 20:45
  • 签到天数: 1 天

    [LV.1]初来乍到

    最后登录
    2013-11-3
    威望
    0
    金钱
    344
    贡献
    0
    注册时间
    2013-4-28
    积分
    457
    帖子
    93
    主题
    22
    精华
    4
    UID
    279
    发表于 2013-5-1 18:36:50 |显示全部楼层
    weddedbonze 发表于 2013-5-1 16:32
    嘿嘿,恢复了,回头发个PDF和CHM版作为附件,省的链接失效

    已经添加CHM版的附件
    专注于工业控制领域的数字电路和嵌入式软件
    回复

    使用道具 举报

    22

    主题

    1

    听众

    457

    积分

    中级工程师

    Rank: 3

  • TA的每日心情
    开心
    2013-4-28 20:45
  • 签到天数: 1 天

    [LV.1]初来乍到

    最后登录
    2013-11-3
    威望
    0
    金钱
    344
    贡献
    0
    注册时间
    2013-4-28
    积分
    457
    帖子
    93
    主题
    22
    精华
    4
    UID
    279
    发表于 2013-5-1 18:37:09 |显示全部楼层
    reille 发表于 2013-5-1 09:17
    兄弟,你的链接打不开呢!

    已经添加CHM版的附件
    专注于工业控制领域的数字电路和嵌入式软件
    回复

    使用道具 举报

    14

    主题

    0

    听众

    451

    积分

    中级工程师

    Rank: 3

  • TA的每日心情
    开心
    2013-6-21 21:45
  • 签到天数: 16 天

    [LV.4]偶尔看看III

    最后登录
    2013-7-9
    威望
    0
    金钱
    419
    贡献
    0
    注册时间
    2013-3-29
    积分
    451
    帖子
    32
    主题
    14
    精华
    0
    UID
    240
    发表于 2013-5-18 08:49:08 |显示全部楼层
    楼主CHM版文档用哪个软件生成的?
    专注于高可靠性实时性嵌入式系统
    回复

    使用道具 举报

    22

    主题

    1

    听众

    457

    积分

    中级工程师

    Rank: 3

  • TA的每日心情
    开心
    2013-4-28 20:45
  • 签到天数: 1 天

    [LV.1]初来乍到

    最后登录
    2013-11-3
    威望
    0
    金钱
    344
    贡献
    0
    注册时间
    2013-4-28
    积分
    457
    帖子
    93
    主题
    22
    精华
    4
    UID
    279
    发表于 2013-5-18 12:33:19 |显示全部楼层
    guqsir 发表于 2013-5-18 08:49
    楼主CHM版文档用哪个软件生成的?

    DocBook XML使用Xalan转换成HTML和CHM工程文件,然后用微软的HTML Help Workshop生成最终的CHM。

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?注册会员 新浪微博账号登陆

    专注于工业控制领域的数字电路和嵌入式软件
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册会员 新浪微博账号登陆

    无觅相关文章插件

    申请友链|手机版|关于本站|站点帮助|eCos技术网 ( 粤ICP备12094833号-1  

    GMT+8, 2017-12-17 16:20 , Processed in 0.224159 second(s), 35 queries .

    Powered by Discuz!2.5 X2.5

    © 2001-2012 Comsenz Inc.

    回顶部