On 09/11/2021 03:46, Chris Johns wrote:

On 20/10/21 2:25 am, Sebastian Huber wrote:
Add new clock manager directives to get all times provided by the
timehands.

Update #4527.
---
For an updated document to review see:

https://ftp.rtems.org/pub/rtems/people/sebh/c-user.pdf

v2: Clarify boot time.

  c-user/clock/directives.rst   | 835 ++++++++++++++++++++++++++++++++++
  c-user/clock/introduction.rst |  81 ++++
  2 files changed, 916 insertions(+)

diff --git a/c-user/clock/directives.rst b/c-user/clock/directives.rst
index bdb7680..8f2d7ea 100644
--- a/c-user/clock/directives.rst
+++ b/c-user/clock/directives.rst
@@ -224,6 +224,841 @@ The following constraints apply to this directive:
    Applications which are restricted to only use interfaces of the 
pre-qualified
    feature set of RTEMS shall not use the directive.
+.. Generated from spec:/rtems/clock/if/get-realtime
+
+.. raw:: latex
+
+    \clearpage
+
+.. index:: rtems_clock_get_realtime()
+
+.. _InterfaceRtemsClockGetRealtime:
+
+rtems_clock_get_realtime()
+--------------------------
+
+Gets the time elapsed since the :term:`Unix epoch` measured using
+:term:`CLOCK_REALTIME` in seconds and nanoseconds format.
+
+.. rubric:: CALLING SEQUENCE:
+
+.. code-block:: c
+
+    void rtems_clock_get_realtime( struct timespec *time_snapshot );
+
+.. rubric:: PARAMETERS:
+
+``time_snapshot``
+    This parameter is the pointer to a `struct timespec
+<https://en.cppreference.com/w/c/chrono/timespec>`_ object. The time> +    
elapsed since the :term:`Unix epoch` measured using the
+    :term:`CLOCK_REALTIME` at some time point during the directive call will be
+    stored in this object.  Calling the directive with a pointer equal to `NULL
+<https://en.cppreference.com/w/c/types/NULL>`_ is undefined behaviour.
Why not return an invalid error status? Same question for the same thing below.

I just documented the existing implementation. If you want an error status and NULL pointer checks, then we have to add a wrapper function around the FreeBSD interface. We still have to export the FreeBSD interface since it is used by libbsd.

The functions just have a single parameter and no return value currently. Why would someone pass a NULL pointer to such functions?

We could also change

RTEMS_ALIAS(_Timecounter_Nanotime)
void rtems_clock_get_realtime(struct timespec *);

to

rtems_status_code
rtems_clock_get_realtime(struct timespec *time_snapshot)
{
  if ( time_snapshot == NULL ) {
    return RTEMS_INVALID_ADDRESS;
  }

  _Timecounter_Nanotime( time_snapshot );
  return RTEMS_SUCCESSFUL;
}

However, this is less efficient. You need an extra comparison, a branch, a stack frame, push/pop of the return address, and an extra function call.

We could also use something like this:

static inline struct timespec rtems_clock_get_realtime(void)
{
  struct timespec time_snapshot;

  _Timecounter_Nanotime( &time_snapshot );

  return time_snapshot;
}

Unfortunately GCC is not able to optimize this.

--
embedded brains GmbH
Herr Sebastian HUBER
Dornierstr. 4
82178 Puchheim
Germany
email: sebastian.hu...@embedded-brains.de
phone: +49-89-18 94 741 - 16
fax:   +49-89-18 94 741 - 08

Registergericht: Amtsgericht München
Registernummer: HRB 157899
Vertretungsberechtigte Geschäftsführer: Peter Rasmussen, Thomas Dörfler
Unsere Datenschutzerklärung finden Sie hier:
https://embedded-brains.de/datenschutzerklaerung/
_______________________________________________
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel

Reply via email to