2023-10-29 16:40:32 +01:00
|
|
|
=================
|
2020-07-21 00:18:26 +02:00
|
|
|
Clocks and Timers
|
2023-10-29 16:40:32 +01:00
|
|
|
=================
|
2020-07-21 00:18:26 +02:00
|
|
|
|
|
|
|
- :c:func:`clock_settime`
|
|
|
|
- :c:func:`clock_gettime`
|
|
|
|
- :c:func:`clock_getres`
|
|
|
|
- :c:func:`mktime`
|
|
|
|
- :c:func:`gmtime`
|
|
|
|
- :c:func:`localtime`
|
|
|
|
- :c:func:`asctime`
|
|
|
|
- :c:func:`ctime`
|
|
|
|
- :c:func:`gmtime_r`
|
|
|
|
- :c:func:`localtime_r`
|
|
|
|
- :c:func:`asctime_r`
|
|
|
|
- :c:func:`ctime_r`
|
|
|
|
- :c:func:`timer_create`
|
|
|
|
- :c:func:`timer_delete`
|
|
|
|
- :c:func:`timer_settime`
|
|
|
|
- :c:func:`timer_gettime`
|
|
|
|
- :c:func:`timer_getoverrun`
|
|
|
|
- :c:func:`gettimeofday`
|
2020-09-14 12:35:34 +02:00
|
|
|
- :c:func:`gethrtime`
|
2020-07-21 00:18:26 +02:00
|
|
|
|
|
|
|
.. c:function:: int clock_settime(clockid_t clockid, const struct timespec *tp)
|
|
|
|
|
|
|
|
:return: If successful, returns zero (``OK``). Otherwise,
|
|
|
|
a non-zero error number will be returned to indicate the error.
|
|
|
|
|
|
|
|
.. c:function:: int clock_gettime(clockid_t clockid, struct timespec *tp)
|
|
|
|
|
|
|
|
:return: If successful, returns zero (``OK``). Otherwise,
|
|
|
|
a non-zero error number will be returned to indicate the error.
|
|
|
|
|
|
|
|
.. c:function:: int clock_getres(clockid_t clockid, struct timespec *res)
|
|
|
|
|
|
|
|
:return: If successful, returns zero (``OK``). Otherwise,
|
|
|
|
a non-zero error number will be returned to indicate the error.
|
|
|
|
|
|
|
|
.. c:function:: time_t mktime(struct tm *tp);
|
|
|
|
|
|
|
|
:return: If successful, returns zero (``OK``). Otherwise,
|
|
|
|
a non-zero error number will be returned to indicate the error.
|
|
|
|
|
|
|
|
.. c:function:: FAR struct tm *gmtime(FAR const time_t *timep);
|
|
|
|
|
|
|
|
Represents GMT date/time in a type ``struct tm``. This
|
|
|
|
function is not re-entrant.
|
|
|
|
|
|
|
|
:param timep: Represents GMT calendar time. This is an absolute time
|
|
|
|
value representing the number of seconds elapsed since 00:00:00 on
|
|
|
|
January 1, 1970, Coordinated Universal Time (UTC).
|
|
|
|
|
|
|
|
:return: If successful, the function will return the pointer to a statically defined
|
|
|
|
instance of ``struct tm``. Otherwise, a NULL will be returned to
|
|
|
|
indicate the error:
|
|
|
|
|
|
|
|
.. c:function:: FAR struct tm *localtime(FAR const time_t *timep)
|
|
|
|
|
|
|
|
Represents local date/time in a type ``struct tm``.
|
|
|
|
This function is not re-entrant.
|
|
|
|
|
|
|
|
:param timep: Represents GMT calendar time. This is an absolute time
|
|
|
|
value representing the number of seconds elapsed since 00:00:00 on
|
|
|
|
January 1, 1970, Coordinated Universal Time (UTC).
|
|
|
|
|
|
|
|
:return: If successful, the function will return the pointer to a statically defined
|
|
|
|
instance of ``struct tm``. Otherwise, a NULL will be returned to
|
|
|
|
indicate the error:
|
|
|
|
|
|
|
|
.. c:function:: FAR char *asctime(FAR const struct tm *tp);
|
|
|
|
|
|
|
|
Converts the time provided in a
|
|
|
|
``struct tm`` to a string representation. ``asctime()`` is not
|
|
|
|
re-entrant.
|
|
|
|
|
|
|
|
:param tp: Pointer to the time to be converted.
|
|
|
|
:return: If successful, the function will
|
|
|
|
return a pointer to a statically defined string holding the converted
|
|
|
|
time. Otherwise, a NULL will be returned to indicate the error.
|
|
|
|
|
|
|
|
.. c:function:: FAR char *ctime(FAR const time_t *timep)
|
|
|
|
|
|
|
|
Converts the time provided in seconds since
|
|
|
|
the epoch to a string representation. ``ctime()`` is not re-entrant.
|
|
|
|
|
|
|
|
:param timep: The current time represented as seconds since the epoch.
|
|
|
|
:return: If successful, the function will return
|
|
|
|
the pointer to the converted string. Otherwise, a NULL will be returned
|
|
|
|
to indicate the error.
|
|
|
|
|
|
|
|
.. c:function:: struct tm *gmtime_r(const time_t *timep, struct tm *result);
|
|
|
|
|
|
|
|
Represents GMT date/time in a type ``struct tm``. This
|
|
|
|
function is re-entrant.
|
|
|
|
|
|
|
|
:param timep: Represents GMT calendar time. This is an absolute time
|
|
|
|
value representing the number of seconds elapsed since 00:00:00 on
|
|
|
|
January 1, 1970, Coordinated Universal Time (UTC).
|
|
|
|
:param result: A user-provided buffer to receive the converted time
|
|
|
|
structure.
|
|
|
|
:return: If successful, the ``gmtime_r()`` function will
|
|
|
|
return the pointer, ``result``, provided by the caller. Otherwise, a
|
|
|
|
NULL will be returned to indicate the error:
|
|
|
|
|
|
|
|
.. c:function:: FAR struct tm *localtime_r(FAR const time_t *timep, FAR struct tm *result)
|
|
|
|
|
|
|
|
Represents local date/time in a type ``struct tm``.
|
|
|
|
This function is re-entrant.
|
|
|
|
|
|
|
|
:param timep: Represents GMT calendar time. This is an absolute time
|
|
|
|
value representing the number of seconds elapsed since 00:00:00 on
|
|
|
|
January 1, 1970, Coordinated Universal Time (UTC).
|
|
|
|
:param result: A user-provided buffer to receive the converted time
|
|
|
|
structure.
|
|
|
|
:return: If successful, the
|
|
|
|
``localtime_r()`` function will return the pointer, ``result``, provided
|
|
|
|
by the caller. Otherwise, a NULL will be returned to indicate the error:
|
|
|
|
|
|
|
|
.. c:function:: FAR char *asctime_r(FAR const struct tm *tp, FAR char *buf)
|
|
|
|
|
|
|
|
Converts the time provided in a
|
|
|
|
``struct tm`` to a string representation. ``asctime-r()`` is re-entrant.
|
|
|
|
|
|
|
|
:param tp: Pointer to the time to be converted.
|
|
|
|
:param buf: The user provider buffer. of size >= 26 characters, to
|
|
|
|
receive the converted time.
|
|
|
|
:return: If successful, the ``asctime_r()`` function will
|
|
|
|
return the pointer, ``buf``, provided by the caller. Otherwise, a NULL
|
|
|
|
will be returned to indicate the error.
|
|
|
|
|
2020-10-18 18:48:44 +02:00
|
|
|
.. c:function:: FAR char *ctime_r(FAR const time_t *timep, FAR char *buf)
|
2020-07-21 00:18:26 +02:00
|
|
|
|
|
|
|
Converts the time provided in seconds
|
|
|
|
since the epoch to a string representation. ``ctime()`` is re-entrant.
|
|
|
|
|
|
|
|
:param timep: The current time represented as seconds since the epoch.
|
|
|
|
:param buf: The user provider buffer. of size >= 26 characters, to
|
|
|
|
receive the converted time.
|
|
|
|
:return: If successful, the ``ctime_r()`` function will
|
|
|
|
return the pointer, ``buf``, provided by the caller. Otherwise, a NULL
|
|
|
|
will be returned to indicate the error.
|
|
|
|
|
|
|
|
.. c:function:: int timer_create(clockid_t clockid, struct sigevent *evp, timer_t *timerid);
|
|
|
|
|
|
|
|
Creates per-thread
|
|
|
|
timer using the specified clock, ``clock_id``, as the timing base. The
|
|
|
|
``timer_create()`` function returns, in the location referenced by
|
|
|
|
``timerid``, a timer ID of type timer_t used to identify the timer in
|
|
|
|
timer requests. This timer ID is unique until the timer is deleted. The
|
|
|
|
particular clock, ``clock_id``, is defined in ``<time.h>``. The timer
|
|
|
|
whose ID is returned will be in a disarmed state upon return from
|
|
|
|
``timer_create()``.
|
|
|
|
|
|
|
|
The ``evp`` argument, if non-NULL, points to a ``sigevent`` structure.
|
|
|
|
This structure is allocated by the called and defines the asynchronous
|
|
|
|
notification to occur. If the ``evp`` argument is NULL, the effect is as
|
|
|
|
if the ``evp`` argument pointed to a ``sigevent`` structure with the
|
|
|
|
``sigev_notify`` member having the value ``SIGEV_SIGNAL``, the
|
|
|
|
``sigev_signo`` having a default signal number, and the ``sigev_value``
|
|
|
|
member having the value of the timer ID.
|
|
|
|
|
|
|
|
Each implementation defines a set of clocks that can be used as timing
|
|
|
|
bases for per-thread timers. All implementations will support a
|
|
|
|
``clock_id`` of ``CLOCK_REALTIME``.
|
|
|
|
|
|
|
|
:param clockid: Specifies the clock to use as the timing base. Must be
|
|
|
|
``CLOCK_REALTIME``.
|
|
|
|
:param ``evp``: Refers to a user allocated sigevent structure that defines
|
|
|
|
the asynchronous notification. evp may be NULL (see above).
|
|
|
|
:param ``timerid``: The pre-thread timer created by the call to
|
|
|
|
timer_create().
|
|
|
|
:return: If the call succeeds, ``timer_create()`` will return
|
|
|
|
0 (``OK``) and update the location referenced by ``timerid`` to a
|
|
|
|
``timer_t``, which can be passed to the other per-thread timer calls. If
|
|
|
|
an error occurs, the function will return a value of -1 (``ERROR``) and
|
|
|
|
set ``errno`` to indicate the error.
|
|
|
|
|
|
|
|
- ``EAGAIN``. The system lacks sufficient signal queuing resources to
|
|
|
|
honor the request.
|
|
|
|
- ``EAGAIN``. The calling process has already created all of the timers
|
|
|
|
it is allowed by this implementation.
|
|
|
|
- ``EINVAL``. The specified clock ID is not defined.
|
|
|
|
- ``ENOTSUP``. The implementation does not support the creation of a
|
|
|
|
timer attached to the CPU-time clock that is specified by clock_id
|
|
|
|
and associated with a thread different thread invoking
|
|
|
|
timer_create().
|
|
|
|
|
|
|
|
**POSIX Compatibility:** Comparable to the POSIX interface of the same
|
|
|
|
name. Differences from the full POSIX implementation include:
|
|
|
|
|
|
|
|
- Only ``CLOCK_REALTIME`` is supported for the ``clockid`` argument.
|
|
|
|
|
|
|
|
.. c:function:: int timer_delete(timer_t timerid);
|
|
|
|
|
|
|
|
Deletes the specified
|
|
|
|
timer, ``timerid``, previously created by the ``timer_create()``
|
|
|
|
function. If the timer is armed when ``timer_delete()`` is called, the
|
|
|
|
timer will be automatically disarmed before removal. The disposition of
|
|
|
|
pending signals for the deleted timer is unspecified.
|
|
|
|
|
|
|
|
:param timerid: The pre-thread timer, previously created by the call to
|
|
|
|
timer_create(), to be deleted.
|
|
|
|
:return: If successful, the ``timer_delete()`` function will
|
|
|
|
return zero (``OK``). Otherwise, the function will return a value of -1
|
|
|
|
(``ERROR``) and set ``errno`` to indicate the error:
|
|
|
|
|
|
|
|
- ``EINVAL``. The timer specified timerid is not valid.
|
|
|
|
|
|
|
|
**POSIX Compatibility:** Comparable to the POSIX interface of the same
|
|
|
|
name.
|
|
|
|
|
|
|
|
.. c:function:: int timer_settime(timer_t timerid, int flags, const struct itimerspec *value, \
|
|
|
|
struct itimerspec *ovalue);
|
|
|
|
|
|
|
|
Sets the time until
|
|
|
|
the next expiration of the timer specified by ``timerid`` from the
|
|
|
|
``it_value`` member of the value argument and arm the timer if the
|
|
|
|
``it_value`` member of value is non-zero. If the specified timer was
|
|
|
|
already armed when ``timer_settime()`` is called, this call will reset
|
|
|
|
the time until next expiration to the value specified. If the
|
|
|
|
``it_value`` member of value is zero, the timer will be disarmed. The
|
|
|
|
effect of disarming or resetting a timer with pending expiration
|
|
|
|
notifications is unspecified.
|
|
|
|
|
|
|
|
If the flag ``TIMER_ABSTIME`` is not set in the argument flags,
|
|
|
|
``timer_settime()`` will behave as if the time until next expiration is
|
|
|
|
set to be equal to the interval specified by the ``it_value`` member of
|
|
|
|
value. That is, the timer will expire in ``it_value`` nanoseconds from
|
|
|
|
when the call is made. If the flag ``TIMER_ABSTIME`` is set in the
|
|
|
|
argument flags, ``timer_settime()`` will behave as if the time until
|
|
|
|
next expiration is set to be equal to the difference between the
|
|
|
|
absolute time specified by the ``it_value`` member of value and the
|
|
|
|
current value of the clock associated with ``timerid``. That is, the
|
|
|
|
timer will expire when the clock reaches the value specified by the
|
|
|
|
``it_value`` member of value. If the specified time has already passed,
|
|
|
|
the function will succeed and the expiration notification will be made.
|
|
|
|
|
|
|
|
The reload value of the timer will be set to the value specified by the
|
|
|
|
``it_interval`` member of value. When a timer is armed with a non-zero
|
|
|
|
``it_interval``, a periodic (or repetitive) timer is specified.
|
|
|
|
|
|
|
|
Time values that are between two consecutive non-negative integer
|
|
|
|
multiples of the resolution of the specified timer will be rounded up to
|
|
|
|
the larger multiple of the resolution. Quantization error will not cause
|
|
|
|
the timer to expire earlier than the rounded time value.
|
|
|
|
|
|
|
|
If the argument ``ovalue`` is not NULL, the t\ ``imer_settime()``
|
|
|
|
function will store, in the location referenced by ``ovalue``, a value
|
|
|
|
representing the previous amount of time before the timer would have
|
|
|
|
expired, or zero if the timer was disarmed, together with the previous
|
|
|
|
timer reload value. Timers will not expire before their scheduled time.
|
|
|
|
|
|
|
|
**NOTE:**\ At present, the ``ovalue`` argument is ignored.
|
|
|
|
|
|
|
|
:param timerid: The pre-thread timer, previously created by the call to
|
|
|
|
timer_create(), to be be set.
|
|
|
|
:param flags: Specify characteristics of the timer (see above)
|
|
|
|
:param value: Specifies the timer value to set
|
|
|
|
:param ovalue: A location in which to return the time remaining from the
|
|
|
|
previous timer setting (ignored).
|
|
|
|
|
|
|
|
:return: If the timer_gettime() succeeds, a value of 0
|
|
|
|
(``OK``) will be returned. If an error occurs, the value -1 (``ERROR``)
|
|
|
|
will be returned, and ```errno`` <#ErrnoAccess>`__ set to indicate the
|
|
|
|
error.
|
|
|
|
|
|
|
|
- ``EINVAL``. The timerid argument does not correspond to an ID
|
|
|
|
returned by timer_create() but not yet deleted by timer_delete().
|
|
|
|
- ``EINVAL``. A value structure specified a nanosecond value less than
|
|
|
|
zero or greater than or equal to 1000 million, and the it_value
|
|
|
|
member of that structure did not specify zero seconds and
|
|
|
|
nanoseconds.
|
|
|
|
|
|
|
|
**POSIX Compatibility:** Comparable to the POSIX interface of the same
|
|
|
|
name. Differences from the full POSIX implementation include:
|
|
|
|
|
|
|
|
- The ``ovalue`` argument is ignored.
|
|
|
|
|
|
|
|
.. c:function:: int timer_gettime(timer_t timerid, struct itimerspec *value);
|
|
|
|
|
|
|
|
Stores the amount
|
|
|
|
of time until the specified timer, ``timerid``, expires and the reload
|
|
|
|
value of the timer into the space pointed to by the ``value`` argument.
|
|
|
|
The ``it_value`` member of this structure will contain the amount of
|
|
|
|
time before the timer expires, or zero if the timer is disarmed. This
|
|
|
|
value is returned as the interval until timer expiration, even if the
|
|
|
|
timer was armed with absolute time. The ``it_interval`` member of
|
|
|
|
``value`` will contain the reload value last set by ``timer_settime()``.
|
|
|
|
|
|
|
|
Due to the asynchronous operation of this function, the time reported by
|
|
|
|
this function could be significantly more than that actual time
|
|
|
|
remaining on the timer at any time.
|
|
|
|
|
|
|
|
:param timerid: Specifies pre-thread timer, previously created by the
|
|
|
|
call to ``timer_create()``, whose remaining count will be returned.
|
|
|
|
:return: If successful, the ``timer_gettime()`` function will
|
|
|
|
return zero (``OK``). Otherwise, an non-zero error number will be
|
|
|
|
returned to indicate the error:
|
|
|
|
|
|
|
|
- ``EINVAL``. The ``timerid`` argument does not correspond to an ID
|
|
|
|
returned by ``timer_create()`` but not yet deleted by
|
|
|
|
``timer_delete()``.
|
|
|
|
|
|
|
|
**POSIX Compatibility:** Comparable to the POSIX interface of the same
|
|
|
|
name.
|
|
|
|
|
|
|
|
.. c:function:: int timer_getoverrun(timer_t timerid);
|
|
|
|
|
|
|
|
Only a single signal will be queued to the process for
|
|
|
|
a given timer at any point in time. When a timer for which a signal is
|
|
|
|
still pending expires, no signal will be queued, and a timer overrun
|
|
|
|
will occur. When a timer expiration signal is delivered to or accepted
|
|
|
|
by a process, if the implementation supports the *Realtime Signals
|
|
|
|
Extension*, the ``timer_getoverrun()`` function will return the timer
|
|
|
|
expiration overrun count for the specified timer. The overrun count
|
|
|
|
returned contains the number of extra timer expirations that occurred
|
|
|
|
between the time the signal was generated (queued) and when it was
|
|
|
|
delivered or accepted, up to but not including an implementation-defined
|
|
|
|
maximum of ``DELAYTIMER_MAX``. If the number of such extra expirations
|
|
|
|
is greater than or equal to ``DELAYTIMER_MAX``, then the overrun count
|
|
|
|
will be set to ``DELAYTIMER_MAX``. The value returned by
|
|
|
|
``timer_getoverrun()`` will apply to the most recent expiration signal
|
|
|
|
delivery or acceptance for the timer. If no expiration signal has been
|
|
|
|
delivered for the timer, or if the *Realtime Signals Extension* is not
|
|
|
|
supported, the return value of ``timer_getoverrun()`` is unspecified.
|
|
|
|
|
|
|
|
**NOTE:** This interface is not currently implemented in NuttX.
|
|
|
|
|
|
|
|
:param timerid: Specifies pre-thread timer, previously created by the
|
|
|
|
call to ``timer_create()``, whose overrun count will be returned.
|
|
|
|
|
|
|
|
:return: If the ``timer_getoverrun()`` function succeeds, it
|
|
|
|
will return the timer expiration overrun count as explained above.
|
|
|
|
``timer_getoverrun()`` will fail if:
|
|
|
|
|
|
|
|
- ``EINVAL``. The ``timerid`` argument does not correspond to an ID
|
|
|
|
returned by ``timer_create()`` but not yet deleted by
|
|
|
|
``timer_delete()``.
|
|
|
|
|
|
|
|
**POSIX Compatibility:** Comparable to the POSIX interface of the same
|
|
|
|
name. Differences from the full POSIX implementation include:
|
|
|
|
|
|
|
|
- This interface is not currently implemented by NuttX.
|
|
|
|
|
|
|
|
**Assumptions/Limitations:**
|
|
|
|
|
|
|
|
**POSIX Compatibility:** Comparable to the POSIX interface of the same
|
|
|
|
name.
|
|
|
|
|
|
|
|
.. c:function:: int gettimeofday(struct timeval *tp, void *tzp);
|
|
|
|
|
|
|
|
This implementation of ``gettimeofday()`` is simply a
|
|
|
|
thin wrapper around :c:func:`clock_gettime`. It simply
|
|
|
|
calls ``clock_gettime()`` using the ``CLOCK_REALTIME`` timer and
|
|
|
|
converts the result to the required ``struct timeval``.
|
|
|
|
|
|
|
|
:param tp: The current time will be returned to this user provided
|
|
|
|
location.
|
|
|
|
:param tzp: A reference to the timezone -- *IGNORED*.
|
|
|
|
|
|
|
|
:return: See :c:func:`clock_gettime`.
|
2020-09-14 12:35:34 +02:00
|
|
|
|
|
|
|
.. c:function:: hrtime_t gethrtime(void);
|
|
|
|
|
|
|
|
This implementation of ``gethrtime()`` is simply a
|
|
|
|
thin wrapper around :c:func:`clock_gettime`. It simply
|
|
|
|
calls ``clock_gettime()`` using the ``CLOCK_REALTIME`` or ``CLOCK_MONOTONIC``,
|
|
|
|
and converts the result to the required hrtime_t.
|
|
|
|
|
|
|
|
:return: current system time in ns
|