/**
@mainpage Overview
@brief 
The Portable Operating System Interface (POSIX) is a family of standards specified by the IEEE Computer Society for maintaining compatibility between operating systems. With FreeRTOS+POSIX, an existing POSIX compliant application can be easily ported to FreeRTOS ecosystem, and thus leveraging the entire AWS IoT service stack.<br><br>

FreeRTOS+POSIX partially implements IEEE Std 1003.1-2017 Edition The Open Group Technical Standard Base Specifications, Issue 7. It currently supports:<br>

- errno.h
- fcntl.h
- mqueue.h
- pthread.h
- sched.h
- semaphore.h
- signal.h
- sys/types.h
- time.h
- unistd.h

Please see each above header file for detailed FreeRTOS+POSIX implementation of POSIX.

To adopt FreeRTOS+POSIX in your project, these porting related header files are needed.
| FreeRTOS platform specific POSIX configuration | High Level Description |
| :--------------------------------------------- | :--------------------- |
| FreeRTOS_POSIX.h.                              | This header file brings in dependencies required by FreeRTOS+POSIX. This file must be included before all other FreeRTOS+POSIX includes. |
| FreeRTOS_POSIX_portable_default.h              | Defaults for port-specific configuration of FreeRTOS+POSIX. |
| FreeRTOS_POSIX_portable.h                      | Port-specific configuration overwrite of FreeRTOS+POSIX. As an example, /lib/FreeRTOS-Plus-POSIX/include/portable/pc/windows/FreeRTOS_POSIX_portable.h, Windows simulator uses the defaults, thus does not need to overwrite anything. |
*/

 /**
 * @paramstructs_group{posix}
 * @paramstructs_brief{posix,POSIX}
 */

/**
 * @handles_group{posix}
 * @handles_brief{posix library}
 */


/**
@config_page{posix}
@config_brief{posix library}

@section posixconfigENABLE_CLOCK_T
@brief Set this to `1` defines clock_t.

Third party code may already define this handle. Set to `1` to avoid redefinition.

@configpossible `0` or `1` <br>
@configdefault `1`

@section posixconfigENABLE_CLOCKID_T
@brief Set this to `1` defines clockid_t.

Third party code may already define this handle. Set to `1` to avoid redefinition.

@configpossible `0` or `1` <br>
@configdefault `1`

@section posixconfigENABLE_MODE_T
@brief Set this to `1` defines mode_t.

Third party code may already define this handle. Set to `1` to avoid redefinition.

@configpossible `0` or `1` <br>
@configdefault `1`

@section posixconfigENABLE_PID_T
@brief Set this to `1` defines pid_t.

Third party code may already define this handle. Set to `1` to avoid redefinition.

@configpossible `0` or `1` <br>
@configdefault `1`

@section posixconfigENABLE_PTHREAD_ATTR_T
@brief Set this to `1` defines pthread_attr_t.

Third party code may already define this handle. Set to `1` to avoid redefinition.

@configpossible `0` or `1` <br>
@configdefault `1`

@section posixconfigENABLE_PTHREAD_BARRIER_T
@brief Set this to `1` defines pthread_barrier_t.

Third party code may already define this handle. Set to `1` to avoid redefinition.

@configpossible `0` or `1` <br>
@configdefault `1`

@section posixconfigENABLE_PTHREAD_COND_T
@brief Set this to `1` defines pthread_cond_t.

Third party code may already define this handle. Set to `1` to avoid redefinition.

@configpossible `0` or `1` <br>
@configdefault `1`

@section posixconfigENABLE_PTHREAD_CONDATTR_T
@brief Set this to `1` defines pthread_condattr_t.

Third party code may already define this handle. Set to `1` to avoid redefinition.

@configpossible `0` or `1` <br>
@configdefault `1`

@section posixconfigENABLE_PTHREAD_MUTEX_T
@brief Set this to `1` defines pthread_mutex_t.

Third party code may already define this handle. Set to `1` to avoid redefinition.

@configpossible `0` or `1` <br>
@configdefault `1`

@section posixconfigENABLE_PTHREAD_MUTEXATTR_T
@brief Set this to `1` defines pthread_mutexattr_t.

Third party code may already define this handle. Set to `1` to avoid redefinition.

@configpossible `0` or `1` <br>
@configdefault `1`

@section posixconfigENABLE_PTHREAD_T
@brief Set this to `1` defines pthread_t.

Third party code may already define this handle. Set to `1` to avoid redefinition.

@configpossible `0` or `1` <br>
@configdefault `1`

@section posixconfigENABLE_SSIZE_T
@brief Set this to `1` defines ssize_t.

Third party code may already define this handle. Set to `1` to avoid redefinition.

@configpossible `0` or `1` <br>
@configdefault `1`

@section posixconfigENABLE_TIME_T
@brief Set this to `1` defines time_t.

Third party code may already define this handle. Set to `1` to avoid redefinition.

@configpossible `0` or `1` <br>
@configdefault `1`

@section posixconfigENABLE_TIMER_T
@brief Set this to `1` defines timer_t.

Third party code may already define this handle. Set to `1` to avoid redefinition.

@configpossible `0` or `1` <br>
@configdefault `1`

@section posixconfigENABLE_USECONDS_T
@brief Set this to `1` defines useconds_t.

Third party code may already define this handle. Set to `1` to avoid redefinition.

@configpossible `0` or `1` <br>
@configdefault `1`

@section posixconfigENABLE_OFF_T
@brief Set this to `1` defines off_t.

Third party code may already define this handle. Set to `1` to avoid redefinition.

@configpossible `0` or `1` <br>
@configdefault `1`

@section posixconfigENABLE_TIMESPEC
@brief Set this to `1` defines struct timespec.

Third party code may already define this handle. Set to `1` to avoid redefinition.

@configpossible `0` or `1` <br>
@configdefault `1`

@section posixconfigENABLE_ITIMERSPEC
@brief Set this to `1` defines struct itimerspec.

Third party code may already define this handle. Set to `1` to avoid redefinition.

@configpossible `0` or `1` <br>
@configdefault `1`
*/

/**
* @functions_page{posix,POSIX}
* @functions_brief{posix}
* - @function_name{mq_close}
* @function_brief{mq_close}
* - @function_name{mq_getattr}
* @function_brief{mq_getattr}
* - @function_name{mq_open}
* @function_brief{mq_open}
* - @function_name{mq_receive}
* @function_brief{mq_receive}
* - @function_name{mq_send}
* @function_brief{mq_send}
* - @function_name{mq_timedreceive}
* @function_brief{mq_timedreceive}
* - @function_name{mq_timedsend}
* @function_brief{mq_timedsend}
* - @function_name{mq_unlink}
* @function_brief{mq_unlink}
* - @function_name{pthread_attr_destroy}
* @function_brief{pthread_attr_destroy}
* - @function_name{pthread_attr_getdetachstate}
* @function_brief{pthread_attr_getdetachstate}
* - @function_name{pthread_attr_getschedparam}
* @function_brief{pthread_attr_getschedparam}
* - @function_name{pthread_attr_getstacksize}
* @function_brief{pthread_attr_getstacksize}
* - @function_name{pthread_attr_init}
* @function_brief{pthread_attr_init}
* - @function_name{pthread_attr_setdetachstate}
* @function_brief{pthread_attr_setdetachstate}
* - @function_name{pthread_attr_setschedparam}
* @function_brief{pthread_attr_setschedparam}
* - @function_name{pthread_attr_setschedpolicy}
* @function_brief{pthread_attr_setschedpolicy}
* - @function_name{pthread_attr_setstacksize}
* @function_brief{pthread_attr_setstacksize}
* - @function_name{pthread_barrier_destroy}
* @function_brief{pthread_barrier_destroy}
* - @function_name{pthread_barrier_init}
* @function_brief{pthread_barrier_init}
* - @function_name{pthread_barrier_wait}
* @function_brief{pthread_barrier_wait}
* - @function_name{pthread_create}
* @function_brief{pthread_create}
* - @function_name{pthread_cond_broadcast}
* @function_brief{pthread_cond_broadcast}
* - @function_name{pthread_cond_destroy}
* @function_brief{pthread_cond_destroy}
* - @function_name{pthread_cond_init}
* @function_brief{pthread_cond_init}
* - @function_name{pthread_cond_signal}
* @function_brief{pthread_cond_signal}
* - @function_name{pthread_cond_timedwait}
* @function_brief{pthread_cond_timedwait}
* - @function_name{pthread_cond_wait}
* @function_brief{pthread_cond_wait}
* - @function_name{pthread_equal}
* @function_brief{pthread_equal}
* - @function_name{pthread_exit}
* @function_brief{pthread_exit}
* - @function_name{pthread_getschedparam}
* @function_brief{pthread_getschedparam}
* - @function_name{pthread_join}
* @function_brief{pthread_join}
* - @function_name{pthread_mutex_destroy}
* @function_brief{pthread_mutex_destroy}
* - @function_name{pthread_mutex_init}
* @function_brief{pthread_mutex_init}
* - @function_name{pthread_mutex_lock}
* @function_brief{pthread_mutex_lock}
* - @function_name{pthread_mutex_timedlock}
* @function_brief{pthread_mutex_timedlock}
* - @function_name{pthread_mutex_trylock}
* @function_brief{pthread_mutex_trylock}
* - @function_name{pthread_mutex_unlock}
* @function_brief{pthread_mutex_unlock}
* - @function_name{pthread_mutexattr_destroy}
* @function_brief{pthread_mutexattr_destroy}
* - @function_name{pthread_mutexattr_gettype}
* @function_brief{pthread_mutexattr_gettype}
* - @function_name{pthread_cond_timedwait}
* @function_brief{pthread_cond_timedwait}
* - @function_name{pthread_mutexattr_init}
* @function_brief{pthread_mutexattr_init}
* - @function_name{pthread_mutexattr_settype}
* @function_brief{pthread_mutexattr_settype}
* - @function_name{pthread_self}
* @function_brief{pthread_self}
* - @function_name{pthread_setschedparam}
* @function_brief{pthread_setschedparam}
* - @function_name{sched_get_priority_max}
* @function_brief{sched_get_priority_max}
* - @function_name{sched_get_priority_min}
* @function_brief{sched_get_priority_min}
* - @function_name{sched_yield}
* @function_brief{sched_yield}
* - @function_name{sem_destroy}
* @function_brief{sem_destroy}
* - @function_name{sem_getvalue}
* @function_brief{sem_getvalue}
* - @function_name{sem_init}
* @function_brief{sem_init}
* - @function_name{sem_post}
* @function_brief{sem_post}
* - @function_name{sem_timedwait}
* @function_brief{sem_timedwait}
* - @function_name{sem_trywait}
* @function_brief{sem_trywait}
* - @function_name{sem_wait}
* @function_brief{sem_wait}
* - @function_name{clock}
* @function_brief{clock}
* - @function_name{clock_getcpuclockid}
* @function_brief{clock_getcpuclockid}
* - @function_name{clock_getres}
* @function_brief{clock_getres}
* - @function_name{clock_gettime}
* @function_brief{clock_gettime}
* - @function_name{clock_nanosleep}
* @function_brief{clock_nanosleep}
* - @function_name{clock_settime}
* @function_brief{clock_settime}
* - @function_name{nanosleep}
* @function_brief{nanosleep}
* - @function_name{timer_create}
* @function_brief{timer_create}
* - @function_name{timer_delete}
* @function_brief{timer_delete}
* - @function_name{timer_getoverrun}
* @function_brief{timer_getoverrun}
* - @function_name{timer_gettime}
* @function_brief{timer_gettime}
* - @function_name{timer_settime}
* @function_brief{timer_settime}
* - @function_name{sleep}
* @function_brief{sleep}
* - @function_name{usleep}
* @function_brief{usleep}
* - @function_name{UTILS_strnlen}
* @function_brief{UTILS_strnlen}
* - @function_name{UTILS_AbsoluteTimespecToDeltaTicks}
* @function_brief{UTILS_AbsoluteTimespecToDeltaTicks}
* - @function_name{UTILS_TimespecToTicks}
* @function_brief{UTILS_TimespecToTicks}
* - @function_name{UTILS_NanosecondsToTimespec}
* @function_brief{UTILS_NanosecondsToTimespec}
* - @function_name{UTILS_TimespecAdd}
* @function_brief{UTILS_TimespecAdd}
* - @function_name{UTILS_TimespecAddNanoseconds}
* @function_brief{UTILS_TimespecAddNanoseconds}
* - @function_name{UTILS_TimespecSubtract}
* @function_brief{UTILS_TimespecSubtract}
* - @function_name{UTILS_TimespecCompare}
* @function_brief{UTILS_TimespecCompare}
* - @function_name{UTILS_ValidateTimespec}
* @function_brief{UTILS_ValidateTimespec}
*/