blob: bbb34af6ff9a283e50c6ea2bb583f0ac3f05a1d3 [file] [log] [blame]
/*
* Amazon FreeRTOS POSIX V1.1.0
* Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
* this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
* the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
* http://aws.amazon.com/freertos
* http://www.FreeRTOS.org
*/
/**
* @file time.h
* @brief Time types.
*
* http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/time.h.html
*/
#ifndef _FREERTOS_POSIX_TIME_H_
#define _FREERTOS_POSIX_TIME_H_
/* FreeRTOS+POSIX includes. */
#include "FreeRTOS_POSIX/sys/types.h"
#include "FreeRTOS_POSIX/signal.h"
/**
* @name Unit conversion constants.
*/
/**@{ */
#define MICROSECONDS_PER_SECOND ( 1000000LL ) /**< Microseconds per second. */
#define NANOSECONDS_PER_SECOND ( 1000000000LL ) /**< Nanoseconds per second. */
#define NANOSECONDS_PER_TICK ( NANOSECONDS_PER_SECOND / configTICK_RATE_HZ ) /**< Nanoseconds per FreeRTOS tick. */
/**@} */
/**
* @name Clock identifiers.
*/
/**@{ */
#define CLOCK_REALTIME 0 /**< The identifier of the system-wide clock measuring real time. */
#define CLOCK_MONOTONIC 1 /**< The identifier for the system-wide monotonic clock.*/
/**@} */
/**
* @name A number used to convert the value returned by the clock() function into seconds.
*/
/**@{ */
#define CLOCKS_PER_SEC ( ( clock_t ) configTICK_RATE_HZ )
/**@} */
/**
* @name Flag indicating time is absolute.
*
* For functions taking timer objects, this refers to the clock associated with the timer.
*/
/**@{ */
#define TIMER_ABSTIME 0x01
/**@} */
#if !defined( posixconfigENABLE_TIMESPEC ) || ( posixconfigENABLE_TIMESPEC == 1 )
/**
* @brief represents an elapsed time
*/
struct timespec
{
time_t tv_sec; /**< Seconds. */
long tv_nsec; /**< Nanoseconds. */
};
#endif
#if !defined( posixconfigENABLE_ITIMERSPEC ) || ( posixconfigENABLE_ITIMERSPEC == 1 )
/**
* @brief timer
*/
struct itimerspec
{
struct timespec it_interval; /**< Timer period. */
struct timespec it_value; /**< Timer expiration. */
};
#endif
/**
* @brief Report CPU time used.
*
* http://pubs.opengroup.org/onlinepubs/9699919799/functions/clock.html
*
* @return The number of FreeRTOS ticks since the scheduler
* was started minus the ticks spent in the idle task.
*
* @note This function does NOT report the number of ticks spent by the calling thread.
*/
clock_t clock( void );
/**
* @brief Access a process CPU-time clock.
*
* http://pubs.opengroup.org/onlinepubs/9699919799/functions/clock_getcpuclockid.html
*
* @retval EPERM
*
* @note This function is currently unsupported.
*
*/
int clock_getcpuclockid( pid_t pid,
clockid_t * clock_id );
/**
* @brief Returns the resolution of a clock.
*
* http://pubs.opengroup.org/onlinepubs/9699919799/functions/clock_getres.html
*
* @note clock_id is ignored
* @note This function stores the resolution of the FreeRTOS tick count in the object res points to.
*
* @retval 0 - Upon successful execution
*/
int clock_getres( clockid_t clock_id,
struct timespec * res );
/**
* @brief Returns the current value for the specified clock, clock_id.
*
* http://pubs.opengroup.org/onlinepubs/9699919799/functions/clock_gettime.html
*
* @note clock_id is ignored
* @note this function does not check for overflows of time_t.
*
* @retval 0 - Upon successful completion.
*/
int clock_gettime( clockid_t clock_id,
struct timespec * tp );
/**
* @brief High resolution sleep with specifiable clock.
*
* http://pubs.opengroup.org/onlinepubs/9699919799/functions/clock_nanosleep.html
*
* @note clock_id is ignored, as this function uses the FreeRTOS tick count as its clock.
* @note flags is ignored, if INCLUDE_vTaskDelayUntil is 0. i.e. the FreeRTOS function vTaskDelayUntil isn't available.
* @note rmtp is also ignored, as signals are not implemented.
*
* @retval 0 - Upon successful completion.
* @retval EINVAL - The rqtp argument specified a nanosecond value less than zero or greater than or equal to 1000 million.
*/
int clock_nanosleep( clockid_t clock_id,
int flags,
const struct timespec * rqtp,
struct timespec * rmtp );
/**
* @brief Sets the time for the specified clock.
*
* http://pubs.opengroup.org/onlinepubs/9699919799/functions/clock_settime.html
*
* @retval -1 with errno set to EPERM.
*
* @note This function is currently unsupported, as FreeRTOS does not provide a function to modify the tick count.
*/
int clock_settime( clockid_t clock_id,
const struct timespec * tp );
/**
* @brief High resolution sleep.
*
* http://pubs.opengroup.org/onlinepubs/9699919799/functions/nanosleep.html
*
* @note rmtp is ignored, as signals are not implemented.
*
* @retval 0 - Upon successful completion.
* @retval -1 - The rqtp argument is invalid OR the rqtp argument specified a nanosecond value less than zero or greater than or equal to 1000 million.
*
*/
int nanosleep( const struct timespec * rqtp,
struct timespec * rmtp );
/**
* @brief Create a per-process timer.
*
* http://pubs.opengroup.org/onlinepubs/9699919799/functions/timer_create.html
*
* @note clock_id is ignored, as this function used the FreeRTOS tick count as its clock.
* @note evp.sigev_notify must be set to SIGEV_THREAD, since signals are currently not supported.
*
* @retval 0 - Upon successful completion, with location referenced by timerid updated.
* @retval -1 - If an error occurs. errno is also set.
*
* @sideeffect Possible errno values
* <br>
* ENOTSUP - If evp is NULL OR evp->sigen_notify == SIGEV_SIGNAL.
* <br>
* EAGAIN - The system lacks sufficient signal queuing resources to honor the request.
*/
int timer_create( clockid_t clockid,
struct sigevent * evp,
timer_t * timerid );
/**
* @brief Delete a per-process timer.
*
* http://pubs.opengroup.org/onlinepubs/9699919799/functions/timer_delete.html
*
* @retval 0 - Upon successful completion.
*/
int timer_delete( timer_t timerid );
/**
* @brief Get the timer overrun count.
*
* http://pubs.opengroup.org/onlinepubs/9699919799/functions/timer_getoverrun.html
*
* @retval 0 - Always return 0, since signals are not supported.
*/
int timer_getoverrun( timer_t timerid );
/**
* @brief Get the amount of time until the timer expires.
*
* http://pubs.opengroup.org/onlinepubs/9699919799/functions/timer_gettime.html
*
* @retval 0 - Upon successful completion.
*/
int timer_gettime( timer_t timerid,
struct itimerspec * value );
/**
* @brief Set the time until the next expiration of the timer.
*
* http://pubs.opengroup.org/onlinepubs/9699919799/functions/timer_settime.html
*
* @retval 0 - Upon successful completion.
* @retval -1 - An error occurred, errno is also set.
*
* @sideeffect Possible errno values
* <br>
* 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.
*/
int timer_settime( timer_t timerid,
int flags,
const struct itimerspec * value,
struct itimerspec * ovalue );
#endif /* ifndef _FREERTOS_POSIX_TIME_H_ */