summaryrefslogblamecommitdiffstats
path: root/c_user/timespec_helpers.rst
blob: b24a63d24b532755ac78600cd2e0d3ef84f0faf1 (plain) (tree)
1
2
3
4
5
6

                                                



                                                            










                                                                          
                                            
 
                                              
 
                                                       
 
                                            
 
                                                   
 
                                               
 
                                                                
 
                                                
 
                                                      
 
                                                             
 
                                                                  
 
                                                                          
 
                                                                
 
                                                        






                        






                                                                              






                             


                                                                               



                                                                 


                                                                             



             


                                                                             
 


                                                                       
 

                                                                              
 


                                                                       
 


                                                                          



                                   


                                                                



                              

                                                                         
 

                                                                         



          




                                                                             


                                           
                                       


                     


                             

                            


                                    

      





                 

                                                                             


          



                                                                             





                                             


                              

                             
                             

      





                 

                                                                              




          

                            




                                                                


                                  

                                 
                                   

      

                 
                                                                               


                


                                                                               


          

                          




                                                   


                                

                                   

                                    

      





                                                               


                                                                           




          

                            




                                                          


                                  

                                 


                                     

      





                 

                                                                           


          







                                                                               





                                                      


                                

                               



                                               

      





                 



                                                                               
 

                                                                     




                                                                   

                                                                       


                                                               

                                     




                                                                            


                                           

                                         


                                          

      





                 

                                                                             


          



                                                                               





                                       


                                   

                                  

                                   

      

                 

                                                                       


                


                                                                              




          

                                




                                             


                                      

                                     

                                    

      

                 
                                                                          
                           








                                                                       

                            




                                               


                                  

                                 

                                   

      

                 
                                                                               
                  








                                                                   

                               




                                                                      


                                     

                                      
                             

      

                 

                                                                            


                

                                                                            




          

                                   




                                                                                  


                                         

                                            
                              

      






                                                                     

                                                                              


          

                            




                                                             


                                  

                                     
                                   

      





                                                    

                                                                            




          

                              




                                                                     


                                    

                                   

                               









                                    

                                                                            



          
.. comment SPDX-License-Identifier: CC-BY-SA-4.0

.. COMMENT: COPYRIGHT (c) 2011.
.. COMMENT: On-Line Applications Research Corporation (OAR).
.. COMMENT: All rights reserved.

Timespec Helpers
################

Introduction
============

The Timespec helpers manager provides directives to assist in manipulating
instances of the POSIX ``struct timespec`` structure.

The directives provided by the timespec helpers manager are:

- rtems_timespec_set_ - Set timespec's value

- rtems_timespec_zero_ - Zero timespec's value

- rtems_timespec_is_valid_ - Check if timespec is valid

- rtems_timespec_add_to_ - Add two timespecs

- rtems_timespec_subtract_ - Subtract two timespecs

- rtems_timespec_divide_ - Divide two timespecs

- rtems_timespec_divide_by_integer_ - Divide timespec by integer

- rtems_timespec_less_than_ - Less than operator

- rtems_timespec_greater_than_ - Greater than operator

- rtems_timespec_equal_to_ - Check if two timespecs are equal

- rtems_timespec_get_seconds_ - Obtain seconds portion of timespec

- rtems_timespec_get_nanoseconds_ - Obtain nanoseconds portion of timespec

- rtems_timespec_to_ticks_ - Convert timespec to number of ticks

- rtems_timespec_from_ticks_ - Convert ticks to timespec

Background
==========

Time Storage Conventions
------------------------

Time can be stored in many ways. One of them is the ``struct timespec`` format
which is a structure that consists of the fields ``tv_sec`` to represent
seconds and ``tv_nsec`` to represent nanoseconds.  The``struct timeval``
structure is simular and consists of seconds (stored in ``tv_sec``) and
microseconds (stored in ``tv_usec``). Either``struct timespec`` or ``struct
timeval`` can be used to represent elapsed time, time of executing some
operations, or time of day.

Operations
==========

Set and Obtain Timespec Value
-----------------------------

A user may write a specific time by passing the desired seconds and nanoseconds
values and the destination ``struct timespec`` using the ``rtems_timespec_set``
directive.

The ``rtems_timespec_zero`` directive is used to zero the seconds
and nanoseconds portions of a ``struct timespec`` instance.

Users may obtain the seconds or nanoseconds portions of a ``struct timespec``
instance with the ``rtems_timespec_get_seconds`` or
``rtems_timespec_get_nanoseconds`` methods, respectively.

Timespec Math
-------------

A user can perform multiple operations on ``struct timespec`` instances. The
helpers in this manager assist in adding, subtracting, and performing divison
on ``struct timespec`` instances.

- Adding two ``struct timespec`` can be done using the
  ``rtems_timespec_add_to`` directive. This directive is used mainly to
  calculate total amount of time consumed by multiple operations.

- The ``rtems_timespec_subtract`` is used to subtract two ``struct timespecs``
  instances and determine the elapsed time between those two points in time.

- The ``rtems_timespec_divide`` is used to use to divide one ``struct
  timespec`` instance by another. This calculates the percentage with a
  precision to three decimal points.

- The ``rtems_timespec_divide_by_integer`` is used to divide a ``struct
  timespec`` instance by an integer. It is commonly used in benchmark
  calculations to dividing duration by the number of iterations performed.

Comparing struct timespec Instances
-----------------------------------

A user can compare two ``struct timespec`` instances using the
``rtems_timespec_less_than``, ``rtems_timespec_greater_than`` or
``rtems_timespec_equal_to`` routines.

Conversions and Validity Check
------------------------------

Conversion to and from clock ticks may be performed by using the
``rtems_timespec_to_ticks`` and ``rtems_timespec_from_ticks`` directives.

User can also check validity of timespec with ``rtems_timespec_is_valid``
routine.

Directives
==========

This section details the Timespec Helpers manager's directives.  A subsection
is dedicated to each of this manager's directives and describes the calling
sequence, related constants, usage, and status codes.

.. _rtems_timespec_set:

TIMESPEC_SET - Set struct timespec Instance
-------------------------------------------
.. index:: set struct timespec instance

**CALLING SEQUENCE:**

.. index:: rtems_timespec_set

.. code-block:: c

    void rtems_timespec_set(
        struct timespec *time,
        time_t           seconds,
        uint32_t         nanoseconds
    );

**STATUS CODES:**

NONE

**DESCRIPTION:**

This directive sets the ``struct timespec`` *time* to the desired ``seconds``
and ``nanoseconds`` values.

**NOTES:**

This method does NOT check if ``nanoseconds`` is less than the maximum number
of nanoseconds in a second.

.. _rtems_timespec_zero:

TIMESPEC_ZERO - Zero struct timespec Instance
---------------------------------------------

**CALLING SEQUENCE:**

.. index:: rtems_timespec_zero

.. code-block:: c

    void rtems_timespec_zero(
        struct timespec *time
    );

**STATUS CODES:**

NONE

**DESCRIPTION:**

This routine sets the contents of the ``struct timespec`` instance ``time`` to
zero.

**NOTES:**

NONE

.. _rtems_timespec_is_valid:

TIMESPEC_IS_VALID - Check validity of a struct timespec instance
----------------------------------------------------------------

**CALLING SEQUENCE:**

.. index:: rtems_timespec_is_valid

.. code-block:: c

    bool rtems_timespec_is_valid(
        const struct timespec *time
    );

**STATUS CODES:**

This method returns ``true`` if the instance is valid, and ``false`` otherwise.

**DESCRIPTION:**

This routine check validity of a ``struct timespec`` instance. It checks if the
nanoseconds portion of the ``struct timespec`` instanceis in allowed range
(less than the maximum number of nanoseconds per second).

**NOTES:**

.. _rtems_timespec_add_to:

TIMESPEC_ADD_TO - Add Two struct timespec Instances
---------------------------------------------------

**CALLING SEQUENCE:**

.. index:: rtems_timespec_add_to

.. code-block:: c

    uint32_t rtems_timespec_add_to(
        struct timespec       *time,
        const struct timespec *add
    );

**STATUS CODES:**

The method returns the number of seconds ``time`` increased by.

**DESCRIPTION:**

This routine adds two ``struct timespec`` instances. The second argument is
added to the first. The parameter ``time`` is the base time to which the
``add`` parameter is added.

**NOTES:**

NONE

.. _rtems_timespec_subtract:

TIMESPEC_SUBTRACT - Subtract Two struct timespec Instances
----------------------------------------------------------

**CALLING SEQUENCE:**

.. index:: rtems_timespec_subtract

.. code-block:: c

    void rtems_timespec_subtract(
        const struct timespec *start,
        const struct timespec *end,
        struct timespec       *result
    );

**STATUS CODES:**

NONE

**DESCRIPTION:**

This routine subtracts ``start`` from ``end`` saves the difference in
``result``. The primary use of this directive is to calculate elapsed time.

**NOTES:**

It is possible to subtract when ``end`` is less than ``start`` and it produce
negative ``result``. When doing this you should be careful and remember that
only the seconds portion of a ``struct timespec`` instance is signed, which
means that nanoseconds portion is always increasing. Due to that when your
timespec has seconds = -1 and nanoseconds = 500,000,000 it means that result is
-0.5 second, NOT the expected -1.5!

.. _rtems_timespec_divide:

TIMESPEC_DIVIDE - Divide Two struct timespec Instances
------------------------------------------------------

**CALLING SEQUENCE:**

.. index:: rtems_timespec_divide

.. code-block:: c

    void rtems_timespec_divide(
        const struct timespec *lhs,
        const struct timespec *rhs,
        uint32_t              *ival_percentage,
        uint32_t              *fval_percentage
    );

**STATUS CODES:**

NONE

**DESCRIPTION:**

This routine divides the ``struct timespec`` instance ``lhs`` by the ``struct
timespec`` instance ``rhs``. The result is returned in the ``ival_percentage``
and ``fval_percentage``, representing the integer and fractional results of the
division respectively.

The ``ival_percentage`` is integer value of calculated percentage and
``fval_percentage`` is fractional part of calculated percentage.

**NOTES:**

The intended use is calculating percentges to three decimal points.

When dividing by zero, this routine return both ``ival_percentage`` and
``fval_percentage`` equal zero.

The division is performed using exclusively integer operations.

.. _rtems_timespec_divide_by_integer:

TIMESPEC_DIVIDE_BY_INTEGER - Divide a struct timespec Instance by an Integer
----------------------------------------------------------------------------

**CALLING SEQUENCE:**

.. index:: rtems_timespec_divide_by_integer

.. code-block:: c

    int rtems_timespec_divide_by_integer(
        const struct timespec *time,
        uint32_t               iterations,
        struct timespec       *result
    );

**STATUS CODES:**

NONE

**DESCRIPTION:**

This routine divides the ``struct timespec`` instance ``time`` by the integer
value ``iterations``.  The result is saved in ``result``.

**NOTES:**

The expected use is to assist in benchmark calculations where you typically
divide a duration (``time``) by a number of iterations what gives average time.

.. _rtems_timespec_less_than:

TIMESPEC_LESS_THAN - Less than operator
---------------------------------------

**CALLING SEQUENCE:**

.. index:: rtems_timespec_less_than

.. code-block:: c

    bool rtems_timespec_less_than(
        const struct timespec *lhs,
        const struct timespec *rhs
    );

**STATUS CODES:**

This method returns ``struct true`` if ``lhs`` is less than ``rhs`` and
``struct false`` otherwise.

**DESCRIPTION:**

This method is the less than operator for ``struct timespec`` instances. The
first parameter is the left hand side and the second is the right hand side of
the comparison.

**NOTES:**

NONE

.. _rtems_timespec_greater_than:

TIMESPEC_GREATER_THAN - Greater than operator
---------------------------------------------

**CALLING SEQUENCE:**

.. index:: rtems_timespec_greater_than

.. code-block:: c

    bool rtems_timespec_greater_than(
        const struct timespec *_lhs,
        const struct timespec *_rhs
    );

**STATUS CODES:**

This method returns ``struct true`` if ``lhs`` is greater than ``rhs`` and
``struct false`` otherwise.

**DESCRIPTION:**

This method is greater than operator for ``struct timespec`` instances.

**NOTES:**

NONE

.. _rtems_timespec_equal_to:

TIMESPEC_EQUAL_TO - Check equality of timespecs
-----------------------------------------------

**CALLING SEQUENCE:**

.. index:: rtems_timespec_equal_to

.. code-block:: c

    bool rtems_timespec_equal_to(
        const struct timespec *lhs,
        const struct timespec *rhs
    );

**STATUS CODES:**

This method returns ``struct true`` if ``lhs`` is equal to ``rhs`` and ``struct
false`` otherwise.

**DESCRIPTION:**

This method is equality operator for ``struct timespec`` instances.

**NOTES:**

NONE

.. _rtems_timespec_get_seconds:

TIMESPEC_GET_SECONDS - Get Seconds Portion of struct timespec Instance
----------------------------------------------------------------------

**CALLING SEQUENCE:**

.. index:: rtems_timespec_get_seconds

.. code-block:: c

    time_t rtems_timespec_get_seconds(
        struct timespec *time
    );

**STATUS CODES:**

This method returns the seconds portion of the specified ``struct timespec``
instance.

**DESCRIPTION:**

This method returns the seconds portion of the specified ``struct timespec``
instance ``time``.

**NOTES:**

NONE

.. _rtems_timespec_get_nanoseconds:

TIMESPEC_GET_NANOSECONDS - Get Nanoseconds Portion of the struct timespec Instance
----------------------------------------------------------------------------------

**CALLING SEQUENCE:**

.. index:: rtems_timespec_get_nanoseconds

.. code-block:: c

    uint32_t rtems_timespec_get_nanoseconds(
        struct timespec *_time
    );

**STATUS CODES:**

This method returns the nanoseconds portion of the specified ``struct
timespec`` instance.

**DESCRIPTION:**

This method returns the nanoseconds portion of the specified timespec which is
pointed by ``_time``.

**NOTES:**

.. _rtems_timespec_to_ticks:

TIMESPEC_TO_TICKS - Convert struct timespec Instance to Ticks
-------------------------------------------------------------

**CALLING SEQUENCE:**

.. index:: rtems_timespec_to_ticks

.. code-block:: c

    uint32_t rtems_timespec_to_ticks(
        const struct timespec *time
    );

**STATUS CODES:**

This directive returns the number of ticks computed.

**DESCRIPTION:**

This directive converts the ``time`` timespec to the corresponding number of
clock ticks.

**NOTES:**

NONE

.. _rtems_timespec_from_ticks:

TIMESPEC_FROM_TICKS - Convert Ticks to struct timespec Representation
---------------------------------------------------------------------

**CALLING SEQUENCE:**

.. index:: rtems_timespec_from_ticks

.. code-block:: c

    void rtems_timespec_from_ticks(
        uint32_t         ticks,
        struct timespec *time
    );

.. index:: rtems_timespec_from_ticks

**STATUS CODES:**

NONE

**DESCRIPTION:**

This routine converts the ``ticks`` to the corresponding ``struct timespec``
representation and stores it in ``time``.

**NOTES:**

NONE