[PATCH v2] c-user: Document new clock manager directives
Chris Johns
chrisj at rtems.org
Tue Nov 9 07:41:07 UTC 2021
On 9/11/21 5:57 pm, Sebastian Huber wrote:
> 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.
Sure. I was only comparing this against the other APIs we have and a NULL is
checked.
>
> 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.
>
Ah OK. This can be fixed and the performance improved but once the API is set it
cannot change or do you think we can add a check later and not break the API?
Chris
More information about the devel
mailing list