Example #1
0
void _TOD_Tickle_ticks( void )
{
  TOD_Control       *tod = &_TOD;
  ISR_lock_Context   lock_context;
  Timestamp_Control  tick;
  uint32_t           nanoseconds_per_tick;

  nanoseconds_per_tick = rtems_configuration_get_nanoseconds_per_tick();

  /* Convert the tick quantum to a timestamp */
  _Timestamp_Set( &tick, 0, nanoseconds_per_tick );

  /* Update the counter of ticks since boot */
  _Watchdog_Ticks_since_boot += 1;

  _TOD_Acquire( tod, &lock_context );

  /* Update the uptime */
  _Timestamp_Add_to( &tod->uptime, &tick );

  /* Update the current TOD */
  _Timestamp_Add_to( &tod->now, &tick );

  _TOD_Release( tod, &lock_context );

  _TOD.seconds_trigger += nanoseconds_per_tick;
  if ( _TOD.seconds_trigger >= 1000000000UL ) {
    _TOD.seconds_trigger -= 1000000000UL;
    _Watchdog_Tickle_seconds();
  }
}
Example #2
0
void _TOD_Set_with_timestamp(
  const Timestamp_Control *tod_as_timestamp
)
{
  TOD_Control *tod = &_TOD;
  uint32_t nanoseconds = _Timestamp_Get_nanoseconds( tod_as_timestamp );
  Watchdog_Interval seconds_next = _Timestamp_Get_seconds( tod_as_timestamp );
  Watchdog_Interval seconds_now;
  ISR_lock_Context lock_context;

  _Thread_Disable_dispatch();

  seconds_now = _TOD_Seconds_since_epoch();

  if ( seconds_next < seconds_now )
    _Watchdog_Adjust_seconds( WATCHDOG_BACKWARD, seconds_now - seconds_next );
  else
    _Watchdog_Adjust_seconds( WATCHDOG_FORWARD, seconds_next - seconds_now );

  _TOD_Acquire( tod, &lock_context );
  tod->now = *tod_as_timestamp;
  _TOD_Release( tod, &lock_context );

  tod->seconds_trigger = nanoseconds;
  tod->is_set = true;

  _Thread_Enable_dispatch();
}