新闻  |   论坛  |   博客  |   在线研讨会
rtems:定时器
tongxin | 2009-04-12 21:25:50    阅读:1436   发布文章

12.1: 介绍
%A
%A 定时器管理器提供对定时器支持。由计时器管理器提供的函数是:
%A
%A     *
%A       rtems_timer_create- 创建一个定时器
%A     *
%A       rtems_timer_ident- 获取定时器的 ID标识
%A     *
%A       rtems_timer_cancel- 取消一个定时器
%A     *
%A       rtems_timer_delete- 删除一个定时器
%A     *
%A       rtems_timer_fire_after- 在间隔后的触发定时器
%A     *
%A       rtems_timer_fire_when-在指定时间触发定时器
%A     *
%A       rtems_timer_initiate_server- 启动定时服务器rtems_timer_server_fire_after- 在指定时间间隔后触发与任务相关的定时器
%A     *
%A       rtems_timer_server_fire_when- 在指定时间,触发以任务为基础的定时器
%A     *
%A       rtems_timer_reset- 重新设定一个定时器
%A
%A 12.2: 背景
%A 12.2.1: 必需的支持
%A 时钟 BSP 是定时器必须的。
%A 12.2.2: 定时器
%A
%A 定时器允许在特定的时间调用激活的任务。用户提供的定时器例程在下面的条件下会被执行:( 1 ) rtems_clock_tick 函数调( 2 )一个特别的定时器服务器满足定时条件触发。定时器服务例程实现一些必须调用 rtems_clock_tick 才能实现的功能。
%A
%A 定时器可以用来实现看门狗例程,用于确保系统在错误时恢复。在应用中可以通过复位定时器来保证看门狗不会被激活,如果应用出错,无法对定时器复位,那么看门狗就会激活,整个应用程序重新复位。
%A 12.2.3: 定时器服务器
%A
%A 定时服务任务负责运行所有的任务相关的定时器服务例程。该任务的优先级比任何的 RTEMS 应用都高,所以可以看成是一个最低优先级的中断。
%A
%A RTMES 可以让定时服务例程以任务的方式运行,而不是以中断的方式运行。这样应用程序的设计也可以变得更灵活。比如,定时器例程可以被配置成浮点任务(通常来说,在中断中执行浮点任务是不安全的)
%A
%A 定时器服务器启动后就会进入阻塞态,直到任务初始化了定时器。这可以减少定时器服务器的执行开销。
%A 12.2.4: 定时器服务例程
%A
%A 定时器服务例程的定义遵循 C 的函数定义,下面是定义的原型:
%A
%A rtems_timer_service_routine user_routine(
%A
%A rtems_id timer_id,
%A
%A void *user_data
%A
%A );
%A
%A 在 timer_id 参数是被触发的定时器对象, user_data 是一个指向用户定义信息的指针,指针对象存放了可能被定时器使用的信息,他可以为 NULL 。
%A 12.3: 操作
%A
%A     *
%A       创造一个定时器
%A     *
%A       获得定时器 ID 标识
%A     *
%A       开始一个间隔定时器
%A     *
%A       开始一个日期定时器
%A     *
%A       取消一个定时器
%A     *
%A       重新设定一个定时器
%A     *
%A       开始定时器服务器
%A     *
%A       删除一个定时器
%A
%A 12.3.1: 创造一个定时器
%A
%A rtems_timer_create 函数通过分派一个定时器控制块 (TMCB) 来创建定时器。分配给定时器一个用户指定的名字 , 和一个定时器 ID 标识。新创建的定时器没有与之关联的定时器服务例程。
%A 12.3.2: 获得定时器 ID 标识
%A
%A 当创建定时器被产生时 , RTEMS 产生一个独特的定时器 ID 标识。定时器 ID 标识可使用两种方法获取。首先, rtems_timer_create 函数调用后, ID 会被存放在指定的区域。其次,定时器 ID 标识可使用 rtems_timer_ident 函数获取。操作定时器的函数需要使用定时器 ID 标识作为参数。
%A 12.3.3: 开始一个间隔定时器
%A
%A 当指定时间片到的时候, rtems_timer_fire_after 和 rtems_timer_server_fire_after 函数将触发与定时器关联的用户定义的超时处理例程。当间隔时间到,如果使用 rtems_timer_fire_after 初始化的定时器,那么定时服务例程将会在 rtems_clock_tick 函数后执行。如果是 rtems_timer_server_fire_after 创建的定时器,那么将会执行对应的时间服务任务。
%A 12.3.4: 开始一个日期定时器
%A
%A 当指定时间到达,rtems_timer_fire_when 和 rtems_timer_server_fire_when 函数将执行与定时器关联的时器服务例程。如果使用rtems_timer_fire_when 函数,定时器服务例程被 rtems_clock_tick函数触发。如果使用 rtems_timer_server_fire_when 函数,那么定时服务将从定时器服务任务处执行。
%A 12.3.5: 取消一个定时器
%A
%A rtems_timer_cancel 函数是用来停止指定的定时器。一旦取消,除非定时器重新启动,否则定时器服务例程将无效。定时器能使用 rtems_timer_reset , rtems_timer_fire_after 和 rtems_timer_fire_when 函数重新初始化。
%A 12.3.6: 重新设定一个定时器
%A
%A rtems_timer_reset 函数是用来复位被rtems_timer_fire_after 或 rtems_timer_server_fire_after启动的定时器。如果定时器没有被启动,或者定时器是使用 rtems_timer_fire_when 或 rtems_timer_server_fire_when 函数启动的,那么rtems_timer_reset将会返回错误。
%A 12.3.7: 开始定时器服务器
%A
%A rtems_timer_initiate_server 函数是用来启动定时器服务器任务。应用能配置定时器服务器的属性(堆栈大小等)。定时器服务器的优先级是所有任务中最高的。所以当前任务调用rtems_timer_initiate_server 后会被抢占。
%A 12.3.8: 删除一个定时器
%A
%A rtems_timer_delete 函数是用来删除一个定时器。如果定时器是正在运行的并且没有到时间,定时器会自动删除。删除后,定时器的控制块将返回给TMCB空闲表中。一个定时器能被其他任务删除(删除定时器的任务不是创建定时器的任务),删除后定时器的ID标识将无效。
%A%A
%A

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
最近文章
寂寞如雪
2009-05-19 19:01:18
夜色花
2009-05-19 18:56:22
没有爱可以重来
2009-05-19 18:54:59
推荐文章
最近访客