984bfae831
Remove leading/trailing blank lines in .c, .h, .py, .rst, .yml, and .yaml files. Will avoid failures with the new CI test in https://github.com/zephyrproject-rtos/ci-tools/pull/112, though it only checks changed files. Move the 'target-notes' target in boards/xtensa/odroid_go/doc/index.rst to get rid of the trailing blank line there. It was probably misplaced. Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
433 lines
9.3 KiB
ReStructuredText
433 lines
9.3 KiB
ReStructuredText
POSIX Support
|
|
#############
|
|
|
|
The Portable Operating System Interface (POSIX) is a family of standards
|
|
specified by the IEEE Computer Society for maintaining compatibility between
|
|
operating systems. Zephyr implements a subset of the embedded profiles PSE51
|
|
and PSE52, and BSD Sockets API.
|
|
|
|
With the POSIX support available in Zephyr, an existing POSIX compliant
|
|
application can be ported to run on the Zephyr kernel, and therefore leverage
|
|
Zephyr features and functionality. Additionally, a library designed for use with
|
|
POSIX threading compatible operating systems can be ported to Zephyr kernel
|
|
based applications with minimal or no changes.
|
|
|
|
.. figure:: posix.svg
|
|
:align: center
|
|
:alt: POSIX Support in Zephyr
|
|
|
|
POSIX support in Zephyr
|
|
|
|
The POSIX API subset is an increasingly popular OSAL (operating system
|
|
abstraction layer) for IoT and embedded applications, as can be seen in
|
|
Zephyr, AWS:FreeRTOS, TI-RTOS, and NuttX.
|
|
|
|
Benefits of POSIX support in Zephyr include:
|
|
|
|
- Offering a familiar API to non-embedded programmers, especially from Linux
|
|
- Enabling reuse (portability) of existing libraries based on POSIX APIs
|
|
- Providing an efficient API subset appropriate for small (MCU) embedded systems
|
|
|
|
|
|
System Overview
|
|
===============
|
|
|
|
Units of Functionality
|
|
++++++++++++++++++++++
|
|
|
|
The system profile is defined in terms of component profiles that specify Units
|
|
of Functionality that can be combined to realize the application platform. A Unit
|
|
of Functionality is a defined set of services which can be implemented. If
|
|
implemented, the standard prescribes that all services in the Unit must
|
|
be implemented.
|
|
|
|
A Minimal Realtime System Profile implementation must support the
|
|
following Units of Functionality as defined in IEEE Std. 1003.1 (also referred to
|
|
as POSIX.1-2017).
|
|
|
|
|
|
.. csv-table:: Units of Functionality
|
|
:header: Requirements, Supported, Remarks
|
|
:widths: 50,10,60
|
|
|
|
|
|
POSIX_C_LANG_JUMP,
|
|
POSIX_C_LANG_SUPPORT,+
|
|
POSIX_DEVICE_IO,
|
|
POSIX_FILE_LOCKING,
|
|
POSIX_SIGNALS,
|
|
POSIX_SINGLE_PROCESS,
|
|
POSIX_THREADS_BASE,+
|
|
XSI_THREAD_MUTEX_EXT,+
|
|
XSI_THREADS_EXT,+
|
|
|
|
|
|
Option Requirements
|
|
++++++++++++++++++++
|
|
|
|
An implementation supporting the Minimal Realtime System
|
|
Profile must support the POSIX.1 Option Requirements which are defined in the
|
|
standard. Options Requirements are used for further sub-profiling within the
|
|
units of functionality: they further define the functional behavior of the
|
|
system service (normally adding extra functionality). Depending on the profile
|
|
to which the POSIX implementation complies,parameters and/or the precise
|
|
functionality of certain services may differ.
|
|
|
|
The following list shows the option requirements that are implemented in
|
|
Zephyr.
|
|
|
|
|
|
.. csv-table:: Option Requirements
|
|
:header: Requirements, Supported
|
|
:widths: 50,10
|
|
|
|
_POSIX_CLOCK_SELECTION,
|
|
_POSIX_FSYNC,
|
|
_POSIX_MEMLOCK,
|
|
_POSIX_MEMLOCK_RANGE,
|
|
_POSIX_MONOTONIC_CLOCK,
|
|
_POSIX_NO_TRUNC,
|
|
_POSIX_REALTIME_SIGNALS,
|
|
_POSIX_SEMAPHORES,+
|
|
_POSIX_SHARED_MEMORY_OBJECTS,
|
|
_POSIX_SYNCHRONIZED_IO,
|
|
_POSIX_THREAD_ATTR_STACKADDR,
|
|
_POSIX_THREAD_ATTR_STACKSIZE,
|
|
_POSIX_THREAD_CPUTIME,
|
|
_POSIX_THREAD_PRIO_INHERIT,+
|
|
_POSIX_THREAD_PRIO_PROTECT,
|
|
_POSIX_THREAD_PRIORITY_SCHEDULING,+
|
|
_POSIX_THREAD_SPORADIC_SERVER,
|
|
_POSIX_TIMEOUTS,
|
|
_POSIX_TIMERS,
|
|
_POSIX2_C_DEV,
|
|
_POSIX2_SW_DEV,
|
|
|
|
|
|
|
|
Units of Functionality
|
|
======================
|
|
|
|
This section describes the Units of Functionality (fixed sets of interfaces)
|
|
which are implemented (partially or completely) in Zephyr. Please refer to the
|
|
standard for a full description of each listed interface.
|
|
|
|
POSIX_THREADS_BASE
|
|
+++++++++++++++++++
|
|
|
|
The basic assumption in this profile is that the system
|
|
consists of a single (implicit) process with multiple threads. Therefore, the
|
|
standard requires all basic thread services, except those related to
|
|
multiple processes.
|
|
|
|
|
|
.. csv-table:: POSIX_THREADS_BASE
|
|
:header: API, Supported
|
|
:widths: 50,10
|
|
|
|
pthread_atfork(),
|
|
pthread_attr_destroy(),+
|
|
pthread_attr_getdetachstate(),+
|
|
pthread_attr_getschedparam(),+
|
|
pthread_attr_init(),+
|
|
pthread_attr_setdetachstate(),+
|
|
pthread_attr_setschedparam(),+
|
|
pthread_cancel(),+
|
|
pthread_cleanup_pop(),
|
|
pthread_cleanup_push(),
|
|
pthread_cond_broadcast(),+
|
|
pthread_cond_destroy(),
|
|
pthread_cond_init(),+
|
|
pthread_cond_signal(),+
|
|
pthread_cond_timedwait(),+
|
|
pthread_cond_wait(),+
|
|
pthread_condattr_destroy(),
|
|
pthread_condattr_init(),
|
|
pthread_create(),+
|
|
pthread_detach(),+
|
|
pthread_equal(),
|
|
pthread_exit(),+
|
|
pthread_getspecific(),+
|
|
pthread_join(),+
|
|
pthread_key_create(),+
|
|
pthread_key_delete(),+
|
|
pthread_kill(),
|
|
pthread_mutex_destroy(),+
|
|
pthread_mutex_init(),+
|
|
pthread_mutex_lock(),+
|
|
pthread_mutex_trylock(),+
|
|
pthread_mutex_unlock(),+
|
|
pthread_mutexattr_destroy(),
|
|
pthread_mutexattr_init(),
|
|
pthread_once(),+
|
|
pthread_self(),+
|
|
pthread_setcalcelstate(),
|
|
pthread_setcanceltype(),
|
|
pthread_setspecific(),+
|
|
pthread_sigmask(),
|
|
pthread_testcancel(),
|
|
|
|
|
|
|
|
XSI_THREAD_EXT
|
|
++++++++++++++
|
|
|
|
The XSI_THREADS_EXT Unit of Functionality is required because it provides
|
|
functions to control a thread's stack. This is considered useful for any
|
|
real-time application.
|
|
|
|
This table lists service support status in Zephyr:
|
|
|
|
.. csv-table:: XSI_THREAD_EXT
|
|
:header: API, Supported
|
|
:widths: 50,10
|
|
|
|
pthread_attr_getguardsize(),
|
|
pthread_attr_getstack(),+
|
|
pthread_attr_setguardsize(),
|
|
pthread_attr_setstack(),+
|
|
pthread_getconcurrency(),
|
|
pthread_setconcurrency()
|
|
|
|
|
|
XSI_THREAD_MUTEX_EXT
|
|
++++++++++++++++++++
|
|
|
|
The XSI_THREAD_MUTEX_EXT Unit of Functionality is required because it has
|
|
options for controlling the behavior of mutexes under erroneous application use.
|
|
|
|
|
|
This table lists service support status in Zephyr:
|
|
|
|
.. csv-table:: XSI_THREAD_MUTEX_EXT
|
|
:header: API, Supported
|
|
:widths: 50,10
|
|
|
|
pthread_mutexattr_gettype(),+
|
|
pthread_mutexattr_settype(),+
|
|
|
|
|
|
POSIX_C_LANG_SUPPORT
|
|
++++++++++++++++++++
|
|
|
|
The POSIX_C_LANG_SUPPORT Unit of Functionality contains the general ISO C
|
|
Library.
|
|
|
|
This is implemented as part of the minimal C library available in Zephyr.
|
|
|
|
|
|
.. csv-table:: POSIX_C_LANG_SUPPORT
|
|
:header: API, Supported
|
|
:widths: 50,10
|
|
|
|
abs(),+
|
|
asctime(),
|
|
asctime_r(),
|
|
atof(),
|
|
atoi(),+
|
|
atol(),
|
|
atoll(),
|
|
bsearch(),+
|
|
calloc(),+
|
|
ctime(),
|
|
ctime_r(),
|
|
difftime(),
|
|
div(),
|
|
feclearexcept(),
|
|
fegetenv(),
|
|
fegetexceptflag(),
|
|
fegetround(),
|
|
feholdexcept(),
|
|
feraiseexcept(),
|
|
fesetenv(),
|
|
fesetexceptflag(),
|
|
fesetround(),
|
|
fetestexcept(),
|
|
feupdateenv(),
|
|
free(),+
|
|
gmtime(),+
|
|
gmtime_r(),+
|
|
imaxabs(),
|
|
imaxdiv(),
|
|
isalnum(),+
|
|
isalpha(),+
|
|
isblank(),
|
|
iscntrl(),
|
|
isdigit(),+
|
|
isgraph(),+
|
|
islower(),
|
|
isprint(),+
|
|
ispunct(),
|
|
isspace(),+
|
|
isupper(),+
|
|
isxdigit(),+
|
|
labs(),
|
|
ldiv(),
|
|
llabs(),
|
|
lldiv(),
|
|
localeconv(),
|
|
localtime(),+
|
|
localtime_r(),
|
|
malloc(),+
|
|
memchr(),+
|
|
memcmp(),+
|
|
memcpy(),+
|
|
memmove(),+
|
|
memset(),+
|
|
mktime(),+
|
|
qsort(),
|
|
rand(),+
|
|
rand_r(),
|
|
realloc(),+
|
|
setlocale(),
|
|
snprintf(),+
|
|
sprintf(),+
|
|
srand(),
|
|
canf(),
|
|
strcat(),+
|
|
strchr(),+
|
|
strcmp(),+
|
|
strcoll(),
|
|
strcpy(),+
|
|
trcspn(),
|
|
strerror(),
|
|
strerror_r(),
|
|
strftime(),
|
|
strlen(),+
|
|
trncat(),+
|
|
strncmp(),+
|
|
strncpy(),+
|
|
strpbrk(),
|
|
strrchr(),+
|
|
trspn(),
|
|
strstr(),+
|
|
strtod(),
|
|
strtof(),
|
|
strtoimax(),
|
|
trtok(),
|
|
strtok_r(),
|
|
strtol(),+
|
|
strtold(),
|
|
strtoll(),
|
|
trtoul(),+
|
|
strtoull(),
|
|
strtoumax(),
|
|
strxfrm(),
|
|
time(),+
|
|
tolower(),+
|
|
toupper(),+
|
|
tzname,
|
|
tzset(),
|
|
va_arg(),
|
|
va_copy(),
|
|
va_end(),
|
|
va_start(),
|
|
vsnprintf(),+
|
|
vsprintf(),+
|
|
vsscanf(),
|
|
|
|
|
|
POSIX_SINGLE_PROCESS
|
|
+++++++++++++++++++++
|
|
|
|
The POSIX_SINGLE_PROCESS Unit of Functionality contains services for single
|
|
process applications.
|
|
|
|
.. csv-table:: POSIX_SINGLE_PROCESS
|
|
:header: API, Supported
|
|
:widths: 50,10
|
|
|
|
confstr(),
|
|
environ,
|
|
errno,
|
|
getenv(),
|
|
setenv(),
|
|
sysconf(),
|
|
uname(),
|
|
unsetenv()
|
|
|
|
|
|
POSIX_SIGNALS
|
|
+++++++++++++
|
|
|
|
Signal services are a basic mechanism within POSIX-based systems and are
|
|
required for error and event handling.
|
|
|
|
.. csv-table:: POSIX_SIGNALS
|
|
:header: API, Supported
|
|
:widths: 50,10
|
|
|
|
|
|
abort(),+
|
|
alarm(),
|
|
kill(),
|
|
pause(),
|
|
raise(),
|
|
sigaction(),
|
|
igaddset(),
|
|
sigdelset(),
|
|
sigemptyset(),
|
|
sigfillset(),
|
|
igismember(),
|
|
signal(),
|
|
sigpending(),
|
|
sigprocmask(),
|
|
igsuspend(),
|
|
sigwait()
|
|
|
|
|
|
POSIX_DEVICE_IO
|
|
+++++++++++++++
|
|
|
|
.. csv-table:: POSIX_DEVICE_IO
|
|
:header: API, Supported
|
|
:widths: 50,10
|
|
|
|
flockfile(),
|
|
ftrylockfile(),
|
|
funlockfile(),
|
|
getc_unlocked(),
|
|
getchar_unlocked(),
|
|
putc_unlocked(),
|
|
putchar_unlocked()
|
|
clearerr(),
|
|
close(),
|
|
fclose(),
|
|
fdopen(),
|
|
feof(),
|
|
ferror(),
|
|
fflush(),
|
|
fgetc(),
|
|
fgets(),
|
|
fileno(),
|
|
fopen(),
|
|
fprintf(),+
|
|
fputc(),+
|
|
fputs(),+
|
|
fread(),
|
|
freopen(),
|
|
fscanf(),
|
|
fwrite(),+
|
|
getc(),
|
|
getchar(),
|
|
gets(),
|
|
open(),+
|
|
perror(),
|
|
printf(),+
|
|
putc(),+
|
|
putchar(),
|
|
puts(),+
|
|
read(),+
|
|
scanf(),
|
|
setbuf(),
|
|
etvbuf(),
|
|
stderr,
|
|
stdin,
|
|
stdout,
|
|
ungetc(),
|
|
vfprintf(),+
|
|
vfscanf(),
|
|
vprintf(),+
|
|
vscanf(),
|
|
write(),
|