rtems: 时钟管理器
RTEMS版权所有,转载请注明来源www.rtems.net,作者ray@rtems
%A 11.1: 介绍
%A
%A 时钟管理器提供对日期和其他的与时间相关的服务。 由时钟管理器提供的函数是:
%A
%A rtems_clock_set- 设定系统日期和时间
%A
%A rtems_clock_get- 获取系统时间信息
%A
%A rtems_clock_tick- 发布时间信号
%A 11.2.1: 必需的支持
%A
%A 为了向钟管理器提供时钟,必须有一个周期型的时钟中断。因此系统中必须要有一个硬件的实时时钟(RTC)去产生这个中断。时钟ISR会调用 rtems_clock_tick函数通知系统已经经过了一个特定的时间段。在RTEMS中,时间的单位是tick(我翻译成嘀哒,相当于Linux中的 Jifferies)。他的实际时间值在系统配置表中配置。
%A 11.2.2: 时间和日期数据结构
%A
%A 时钟管理器对时间进行操作。他使用到的函数中大多使用了以下的数据结构记录时间:
%A
%A struct rtems_tod_control{
%A rtems_unsigned32 year; /* 比 1987 大 */
%A rtems_unsigned32 montn; /*1- 12*/
%A rtems_unsigned32 day; /*1- 31*/
%A rtems_unsigned32 hour; /*0- 23*/
%A rtems_unsigned32 minut; /*0- 59*/
%A rtems_unsigned32 second; /*0- 59*/
%A rtems_unsigned32 ticks; /*小于1秒 */
%A };
%A typedef struct rtems_tod_control rtems_time_of_day;
%A
%A 使用 rtems_clock_get 函数设定系统的日期和时间的时候 , 必须使用上面的格式。Linux的程序员可能会希望使用 "UNIX/Linux风格"的日期和时间数据结构。rtems_clock_get函数能可选择地在下列的结构中返回现在的日期和时间:
%A
%A typedef struct{
%A rtems_unsigned32 seconds; /* 秒自从~以后 RTEMS 新纪元*/
%A rtems_unsigned32 microseconds; /* 自从最后的秒以后 */
%A }rtems_clock_time_value;
%A
%A 该结构的第二个字段是自从1988 年一月 1 日以后的微秒数。
%A 11.2.3: 时钟滴哒和时间片复用
%A
%A 前面说过,时分复用也称为为轮转法调度,是让优先级相同的任务共享时间片的一种调度方式。分配给给每个任务的时间长度被称为时间片(timeslice) 。
%A
%A 系统的 timeslice 被定义为滴哒的整数倍, 该数在配置表中指定。 timeslice定义好后,整个系统都将使用这个数作为自己的时间片。当然,每个任务可以决定是否参加时间片调度。
%A
%A 当时分复用和抢占使能时,时分复用是通过rtems_clock_tick 函数来实现倒计时功能。如果任务的时间片用完了,调度管理器将当前任务调度出嵌入式处理器。
%A 11.2.4: 延时
%A
%A 休眠定时器允许任务将自己挂起一个给定的时间间隔, 然后唤醒自己,继续执行。由于该类型的计时器使用rtems_task_wake_after 和 rtems_task_wake_when 函数自动创建而且,所以他们没有RTEMS的ID标识。 一旦激活,任务是不能删除他的休眠的计时器。每个任务每次只能激活一个休眠计时器。
%A 11.2.5: 超时设定
%A
%A 超时是一类特殊的定时器。如果使用rtems_message_queue_receive , rtems_event_receive , rtems_semaphore_obtain 和 rtems_region_get_segment 函数,并且设置了超时选项,就会创建一个超时定时器。每个任务在任何时刻都将有且仅有一个超时定时器。当任务的超时定时器时间片到达时,定时器将解除阻塞的任务。
%A 11.3: 定时器管理函数
%A
%A 发布时间滴哒
%A
%A 设置时钟
%A
%A 获取时间
%A 11.3.1: 发布时钟滴哒
%A
%A RTEMS 提供rtems_clock_tick 函数,该函数在时钟的ISR中调用,告诉RTMES系统一个时钟滴哒过去了。滴哒的实际值(使用微秒表示)定义在系统的配置表里。RTEMS使用时钟的滴哒数以及每个滴哒代表的实际时间来维护系统时间。rtems_clock_tick 函数函数执行的频率决定了系统时钟的精度(粒度)。例如每秒调用一次rtems_clock_tick 函数的系统时间粒度大于每秒调用十次rtems_clock_tick的系统。rtems_clock_tick函数用来维护系统时间和定时器时钟。
%A 11.3.2: 设定时间
%A
%A rtems_clock_set 函数允许一个任务或 ISR 设定RTEMS日期和时间。 如果设定日期和时间导致任何一个计时器超时,那么将会触发时间片到的信号。
%A 11.3.2: 设定时间
%A
%A rtems_clock_set 函数允许一个任务或 ISR 设定RTEMS日期和时间。 如果设定日期和时间导致任何一个计时器超时,那么将会触发时间片到的信号。
%A 11.3.3: 获得时间
%A
%A rtems_clock_get 函数允许一个任务或 ISR 获得现在的日期和时间或其他与事件相关的信息。当前日期和时间能使用RTEMS标准的格式或者UNIX风格的格式。此外,也能返回从纪元(1900年7月1号零时)起的时间(滴哒数,秒数等) 。返回值在rtems_clock_get_options 中制定,该参数可以为下面的常量之一:
%A
%A RTEMS_CLOCK_GET_TOD- 获得RTEMS风格日期和时间
%A
%A RTEMS_CLOCK_GET_TIME_VALUE- 获得 UNIX风格的日期和时间
%A
%A RTEMS_CLOCK_GET_TICKS_SINCE_BOOT- 获取RTEMS初始化后的滴哒数目。
%A
%A RTEMS_CLOCK_GET_SECONDS_SINCE_EPOCH- 获取从纪元起的秒数
%A
%A RTEMS_CLOCK_GET_TICKS_PER_SECOND- 获取每秒的滴哒数目
%A%A
%A
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。