[PATCH] part of implimenting a monotonic clock in rtems part of this is not the final patch.

zack_on_the_speed_chanel zack_on_the_speed_chanel at protonmail.ch
Fri Jun 11 21:07:35 UTC 2021


So the intention of the patch was to implement a timer_create function for monotonic clocks. A monotonic clock is a clock that keeps track of the time that has elapsed since the Linux epoch.

I did the following so far.

- I added a field in the RTEMS_timer_control so that in create_timer it's able to keep track of what type of clock is provided as a argument
- I have looked at the old source code for the getttime and joel suggested me to use different functions to get the value of the time one being _Timecounter_Nanouptime and _TOD_Get

These are so  far the changes I made so far. I think since the clock type only affects the value given for time I do not think I need to make anymore changes to the code. I do not know if need to add anything else. Im just looking for suggestions on anything I overlooked.
Thanks
Zack

Sent with ProtonMail Secure Email.

‐‐‐‐‐‐‐ Original Message ‐‐‐‐‐‐‐

On Friday, June 11th, 2021 at 4:01 PM, Christian Mauderer <oss at c-mauderer.de> wrote:

> Hello Zack,
>
> you say: "part of this is not the final patch" in the subject. So what
>
> is the intention of this patch? Do you need a complete review? Is it
>
> some kind of preview and you need input? If yes: For what parts do you
>
> need input?
>
> Best regards
>
> Christian
>
> On 11/06/2021 17:20, zack_on_the_speed_chanel wrote:
>
> > ping
> >
> > Sent with ProtonMail Secure Email.
> >
> > ‐‐‐‐‐‐‐ Original Message ‐‐‐‐‐‐‐
> >
> > On Wednesday, June 9th, 2021 at 6:27 PM, zack zakthertemsdev at outlook.com wrote:
> >
> > > From: zack zack_on_the_speed_chanel at protonmail.ch
> > >
> > > cpukit/include/rtems/posix/timer.h | 6 ++-
> > >
> > > cpukit/posix/src/psxtimercreate.c | 5 +-
> > >
> > > cpukit/posix/src/timergettime.c | 61 ++++++++++++++++++++---
> > >
> > > testsuites/psxtests/psxtimer02/psxtimer.c | 26 +++++++---
> > >
> > > 4 files changed, 81 insertions(+), 17 deletions(-)
> > >
> > > diff --git a/cpukit/include/rtems/posix/timer.h b/cpukit/include/rtems/posix/timer.h
> > >
> > > index bcbf07a65a..f8cf6115b2 100644
> > >
> > > --- a/cpukit/include/rtems/posix/timer.h
> > >
> > > +++ b/cpukit/include/rtems/posix/timer.h
> > >
> > > @@ -21,7 +21,7 @@
> > >
> > > #include <rtems/score/objectdata.h>
> > >
> > > #include <rtems/score/watchdog.h>
> > >
> > > +#include <time.h>
> > >
> > > #include <pthread.h>
> > >
> > > #ifdef __cplusplus
> > >
> > > @@ -47,7 +47,9 @@ typedef struct {
> > >
> > > struct itimerspec timer_data; /* Timing data of the timer /
> > >
> > > uint32_t ticks; / Number of ticks of the initialization /
> > >
> > > uint32_t overrun; / Number of expirations of the timer */
> > >
> > > -   struct timespec time; /* Time at which the timer was started */
> > >
> > > -   struct timespec time; /* Time at which the timer was started */
> > >
> > > -   clockid_t clock_type;
> > >
> > >
> > > } POSIX_Timer_Control;
> > >
> > > /**
> > >
> > > diff --git a/cpukit/posix/src/psxtimercreate.c b/cpukit/posix/src/psxtimercreate.c
> > >
> > > index a63cf1d100..e78c359bd5 100644
> > >
> > > --- a/cpukit/posix/src/psxtimercreate.c
> > >
> > > +++ b/cpukit/posix/src/psxtimercreate.c
> > >
> > > @@ -40,7 +40,7 @@ int timer_create(
> > >
> > > {
> > >
> > > POSIX_Timer_Control *ptimer;
> > >
> > > -   if ( clock_id != CLOCK_REALTIME )
> > >
> > > -   if ( clock_id != CLOCK_REALTIME || clock_id != CLOCK_MONOTONIC )
> > >
> > >     rtems_set_errno_and_return_minus_one( EINVAL );
> > >
> > >     if ( !timerid )
> > >
> > >     @@ -91,7 +91,8 @@ int timer_create(
> > >
> > >     ptimer->timer_data.it_value.tv_nsec = 0;
> > >
> > >     ptimer->timer_data.it_interval.tv_sec = 0;
> > >
> > >     ptimer->timer_data.it_interval.tv_nsec = 0;
> > >
> > > -   ptimer->clock_type=clock_id;
> > >
> > > -   _Watchdog_Preinitialize( &ptimer->Timer, _Per_CPU_Get_snapshot() );
> > >
> > >     _Watchdog_Initialize( &ptimer->Timer, _POSIX_Timer_TSR );
> > >
> > >     _Objects_Open_u32(&_POSIX_Timer_Information, &ptimer->Object, 0);
> > >
> > >
> > > diff --git a/cpukit/posix/src/timergettime.c b/cpukit/posix/src/timergettime.c
> > >
> > > index ee2a566f0e..62011cde58 100644
> > >
> > > --- a/cpukit/posix/src/timergettime.c
> > >
> > > +++ b/cpukit/posix/src/timergettime.c
> > >
> > > @@ -28,6 +28,7 @@
> > >
> > > #include <rtems/score/todimpl.h>
> > >
> > > #include <rtems/score/watchdogimpl.h>
> > >
> > > #include <rtems/seterr.h>
> > >
> > > +#include <rtems/timespec.h>
> > >
> > > /*
> > >
> > > -              - When a timer is initialized, the value of the time in
> > >
> > >
> > >
> > > @@ -43,21 +44,67 @@ int timer_gettime(
> > >
> > > {
> > >
> > > POSIX_Timer_Control *ptimer;
> > >
> > > ISR_lock_Context lock_context;
> > >
> > > -   uint64_t now;
> > >
> > >     uint32_t remaining;
> > >
> > > -         Per_CPU_Control *cpu;
> > >
> > >
> > > -         struct  timespec * now; // get time now either with
> > >
> > >
> > > -         struct  timespec * expire; // expire
> > >
> > >
> > > -         struct  timespec * result;// get remaining time
> > >
> > >
> > >
> > > if ( !value )
> > >
> > > -   rtems_set_errno_and_return_minus_one( EINVAL );
> > >
> > > -   rtems_set_errno_and_return_minus_one( EINVAL );
> > >
> > >     ptimer = _POSIX_Timer_Get( timerid, &lock_context );
> > >
> > > -   if ( ptimer != NULL ) {
> > >
> > > -   Per_CPU_Control *cpu;
> > >
> > > -   if(ptimer== NULL ){
> > >
> > > -   rtems_set_errno_and_return_minus_one( EINVAL );
> > >
> > > -   }
> > >
> > >
> > > +if ( ptimer->clock_type ==CLOCK_REALTIME) {
> > >
> > > -   cpu = _POSIX_Timer_Acquire_critical( ptimer, &lock_context );
> > >
> > > -              _TOD_Get(now); // get current time
> > >
> > >
> > > -            rtems_timespec_from_ticks (ptimer->Timer.expire,expire ); // get the time to expire
> > >
> > >
> > > -   if (now->tv_nsec+now->tv_sec > expire->tv_nsec+expire->tv_sec) { // check if the time expired
> > >
> > > -            rtems_timespec_subtract (now ,expire , result); //
> > >
> > >
> > > -          remaining = (uint32_t) result->tv_nsec+result->tv_sec;
> > >
> > >
> > > -   } else {
> > >
> > > -          remaining = 0;
> > >
> > >
> > > -   }
> > >
> > > -   _Timespec_From_ticks( remaining, &value->it_value );
> > >
> > > -   value->it_interval = ptimer->timer_data.it_interval;
> > >
> > > -   _POSIX_Timer_Release( cpu, &lock_context );
> > >
> > > -   return 0;
> > >
> > > -   }
> > >
> > >
> > > +if ( ptimer->clock_type ==CLOCK_MONOTONIC) {
> > >
> > > -   cpu = _POSIX_Timer_Acquire_critical( ptimer, &lock_context );
> > >
> > > -   now = cpu->Watchdog.ticks;
> > >
> > > -           _Timecounter_Nanouptime(now );
> > >
> > >
> > > -            rtems_timespec_from_ticks (ptimer->Timer.expire,expire );
> > >
> > >
> > > -   if (now->tv_nsec+now->tv_sec > expire->tv_nsec+expire->tv_sec) {
> > >
> > > -            rtems_timespec_subtract (now, expire, result);
> > >
> > >
> > > -   if ( now < ptimer->Timer.expire ) {
> > >
> > > -          remaining = (uint32_t) ( ptimer->Timer.expire - now );
> > >
> > >
> > > -          remaining = (uint32_t) result->tv_nsec+result->tv_sec;
> > >
> > >
> > >     } else {
> > >
> > >     remaining = 0;
> > >
> > >     }
> > >
> > >     diff --git a/testsuites/psxtests/psxtimer02/psxtimer.c b/testsuites/psxtests/psxtimer02/psxtimer.c
> > >
> > >     index 9f79d33c42..029e638c76 100644
> > >
> > >     --- a/testsuites/psxtests/psxtimer02/psxtimer.c
> > >
> > >     +++ b/testsuites/psxtests/psxtimer02/psxtimer.c
> > >
> > >     @@ -59,17 +59,31 @@ void *POSIX_Init (
> > >
> > >     fatal_posix_service_status_errno( status, EINVAL, "bad clock id" );
> > >
> > >     puts( "timer_create - bad timer id pointer - EINVAL" );
> > >
> > > -   status = timer_create( CLOCK_REALTIME, &event, NULL );
> > >
> > > -   status = timer_create( CLOCK_MONOTONIC, &event, NULL );
> > >
> > >     fatal_posix_service_status_errno( status, EINVAL, "bad timer id" );
> > >
> > >     puts( "timer_create - OK" );
> > >
> > > -   status = timer_create( CLOCK_REALTIME, NULL, &timer );
> > >
> > > -   status = timer_create( CLOCK_MONOTONIC, NULL, &timer );
> > >
> > >     posix_service_failed( status, "timer_create OK" );
> > >
> > >     puts( "timer_create - too many - EAGAIN" );
> > >
> > > -   status = timer_create( CLOCK_REALTIME, NULL, &timer1 );
> > >
> > > -   status = timer_create( CLOCK_MONOTONIC, NULL, &timer1 );
> > >
> > >     fatal_posix_service_status_errno( status, EAGAIN, "too many" );
> > >
> > > -   puts( "timer_create (monotonic) - bad timer id pointer - EINVAL" );
> > >
> > > -   status = timer_create( CLOCK_MONOTONIC, &event, NULL );
> > >
> > > -   fatal_posix_service_status_errno( status, EINVAL, "bad timer id" );
> > >
> > > -   puts( "timer_create (Monotonic) - OK" );
> > >
> > > -   status = timer_create( CLOCK_MONOTONIC, NULL, &timer );
> > >
> > > -   posix_service_failed( status, "timer_create OK" );
> > >
> > > -   puts( "timer_create (monotonic)- too many - EAGAIN" );
> > >
> > > -   status = timer_create( CLOCK_MONOTONIC, NULL, &timer1 );
> > >
> > > -   fatal_posix_service_status_errno( status, EAGAIN, "too many" );
> > >
> > > -   puts( "timer_delete - bad id - EINVAL" );
> > >
> > >     status = timer_delete( timer1 + 1 );
> > >
> > >     fatal_posix_service_status_errno( status, EINVAL, "bad id" );
> > >
> > >     @@ -100,14 +114,14 @@ void *POSIX_Init (
> > >
> > >     status = timer_settime( timer, TIMER_ABSTIME, &itimer, NULL );
> > >
> > >     fatal_posix_service_status_errno( status, EINVAL, "bad itimer value #2" );
> > >
> > > -   clock_gettime( CLOCK_REALTIME, &now );
> > >
> > > -   clock_gettime( CLOCK_MONOTONIC, &now );
> > >
> > >     itimer.it_value = now;
> > >
> > >     itimer.it_value.tv_sec = itimer.it_value.tv_sec - 1;
> > >
> > >     puts( "timer_settime - bad itimer value - previous time - EINVAL" );
> > >
> > >     status = timer_settime( timer, TIMER_ABSTIME, &itimer, NULL );
> > >
> > >     fatal_posix_service_status_errno( status, EINVAL, "bad itimer value #3" );
> > >
> > > -   clock_gettime( CLOCK_REALTIME, &now );
> > >
> > > -   clock_gettime( CLOCK_MONOTONIC, &now );
> > >
> > >     itimer.it_value = now;
> > >
> > >     itimer.it_value.tv_sec = itimer.it_value.tv_sec + 1;
> > >
> > >     puts( "timer_settime - bad id - EINVAL" );
> > >
> > >     @@ -129,4 +143,4 @@ void *POSIX_Init (
> > >
> > >     TEST_END();
> > >
> > >     rtems_test_exit (0);
> > >
> > >     -}
> > >
> > >     +}
> > >
> > >     \ No newline at end of file
> > >
> > >     --
> > >
> > >     2.31.1
> > >
> >
> > devel mailing list
> >
> > devel at rtems.org
> >
> > http://lists.rtems.org/mailman/listinfo/devel


More information about the devel mailing list