2020-07-21 00:18:26 +02:00
|
|
|
OS Data Structures
|
|
|
|
==================
|
|
|
|
|
|
|
|
Scalar Types
|
|
|
|
************
|
|
|
|
|
|
|
|
Many of the types used to communicate with NuttX are simple scalar
|
|
|
|
types. These types are used to provide architecture independence of the
|
|
|
|
OS from the application. The scalar types used at the NuttX interface
|
|
|
|
include:
|
|
|
|
|
|
|
|
.. c:type:: pid_t
|
|
|
|
.. c:type:: size_t
|
|
|
|
.. c:type:: sigset_t
|
|
|
|
.. c:type:: time_t
|
|
|
|
|
|
|
|
Hidden Interface Structures
|
|
|
|
***************************
|
|
|
|
|
|
|
|
Several of the types used to interface with NuttX are structures that
|
|
|
|
are intended to be hidden from the application. From the standpoint of
|
|
|
|
the application, these structures (and structure pointers) should be
|
|
|
|
treated as simple handles to reference OS resources. These hidden
|
|
|
|
structures include:
|
|
|
|
|
|
|
|
.. c:struct:: tcb_s
|
|
|
|
.. c:type:: mqd_t
|
|
|
|
.. c:type:: sem_t
|
|
|
|
.. c:type:: pthread_key_t
|
|
|
|
|
|
|
|
In order to maintain portability, applications should not reference
|
|
|
|
specific elements within these hidden structures. These hidden
|
|
|
|
structures will not be described further in this user's manual.
|
|
|
|
|
|
|
|
Access to the ``errno`` Variable
|
|
|
|
********************************
|
|
|
|
|
|
|
|
A pointer to the thread-specific ``errno`` value is available through a
|
|
|
|
function call:
|
|
|
|
|
2020-10-18 18:48:44 +02:00
|
|
|
.. c:function:: int *__errno(void)
|
|
|
|
|
2020-07-21 00:18:26 +02:00
|
|
|
``__errno()`` returns a pointer to the thread-specific
|
|
|
|
``errno`` value. Note that the symbol ``errno`` is defined to be
|
|
|
|
``__errno()`` so that the usual access by referencing the symbol
|
|
|
|
``errno`` will work as expected.
|
|
|
|
|
|
|
|
.. code-block:: c
|
|
|
|
|
|
|
|
#include <errno.h>
|
|
|
|
#define errno *__errno()
|
|
|
|
int *__errno(void);
|
|
|
|
|
|
|
|
There is a unique, private ``errno`` value for each NuttX task. However,
|
|
|
|
the implementation of ``errno`` differs somewhat from the use of
|
|
|
|
``errno`` in most multi-threaded process environments: In NuttX, each
|
|
|
|
pthread will also have its own private copy of ``errno`` and the
|
|
|
|
``errno`` will not be shared between pthreads. This is, perhaps,
|
|
|
|
non-standard but promotes better thread independence.
|
|
|
|
|
|
|
|
:return: A pointer to the thread-specific ``errno`` value.
|
|
|
|
|
|
|
|
User Interface Structures
|
|
|
|
*************************
|
|
|
|
|
|
|
|
.. c:type:: int (*main_t)(int argc, char *argv[])
|
|
|
|
|
|
|
|
:c:type:`main_t` defines the type of a task entry point. :c:type:`main_t` is declared in
|
2020-10-18 18:48:44 +02:00
|
|
|
``sys/types.h``.
|
2020-07-21 00:18:26 +02:00
|
|
|
|
|
|
|
.. c:struct:: sched_param
|
|
|
|
|
|
|
|
This structure is used to pass scheduling priorities to and from NuttX:
|
|
|
|
|
|
|
|
.. code-block:: c
|
|
|
|
|
|
|
|
struct sched_param
|
|
|
|
{
|
|
|
|
int sched_priority;
|
|
|
|
};
|
|
|
|
|
|
|
|
.. c:struct:: timespec
|
|
|
|
|
|
|
|
This structure is used to pass timing information between the NuttX and
|
|
|
|
a user application:
|
|
|
|
|
|
|
|
.. code-block:: c
|
|
|
|
|
|
|
|
struct timespec
|
|
|
|
{
|
|
|
|
time_t tv_sec; /* Seconds */
|
|
|
|
long tv_nsec; /* Nanoseconds */
|
|
|
|
};
|
|
|
|
|
|
|
|
.. c:struct:: mq_attr
|
|
|
|
|
|
|
|
This structure is used to communicate message queue attributes between
|
|
|
|
NuttX and a MoBY application:
|
|
|
|
|
|
|
|
.. code-block:: c
|
|
|
|
|
|
|
|
struct mq_attr {
|
|
|
|
size_t mq_maxmsg; /* Max number of messages in queue */
|
|
|
|
size_t mq_msgsize; /* Max message size */
|
|
|
|
unsigned mq_flags; /* Queue flags */
|
|
|
|
size_t mq_curmsgs; /* Number of messages currently in queue */
|
|
|
|
};
|
|
|
|
|
2020-10-20 10:40:45 +02:00
|
|
|
.. note that this gives a warning due to https://github.com/sphinx-doc/sphinx/issues/7819 https://github.com/sphinx-doc/sphinx/pull/8313
|
2020-08-31 02:35:31 +02:00
|
|
|
|
2020-07-21 00:18:26 +02:00
|
|
|
.. c:struct:: sigaction
|
|
|
|
|
|
|
|
The following structure defines the action to take for given signal:
|
|
|
|
|
|
|
|
.. code-block:: c
|
|
|
|
|
|
|
|
struct sigaction
|
|
|
|
{
|
|
|
|
union
|
|
|
|
{
|
|
|
|
void (*_sa_handler)(int);
|
|
|
|
void (*_sa_sigaction)(int, siginfo_t *, void *);
|
|
|
|
} sa_u;
|
|
|
|
sigset_t sa_mask;
|
|
|
|
int sa_flags;
|
|
|
|
};
|
|
|
|
#define sa_handler sa_u._sa_handler
|
|
|
|
#define sa_sigaction sa_u._sa_sigaction
|
|
|
|
|
|
|
|
.. c:struct:: siginfo
|
|
|
|
.. c:type:: siginfo_t
|
|
|
|
|
|
|
|
The following types is used to pass parameters to/from signal handlers:
|
|
|
|
|
|
|
|
.. code-block:: c
|
|
|
|
|
|
|
|
typedef struct siginfo
|
|
|
|
{
|
|
|
|
int si_signo;
|
|
|
|
int si_code;
|
|
|
|
union sigval si_value;
|
|
|
|
} siginfo_t;
|
|
|
|
|
|
|
|
.. c:union:: sigval
|
|
|
|
|
|
|
|
This defines the type of the struct siginfo si_value field and is used
|
|
|
|
to pass parameters with signals.
|
|
|
|
|
|
|
|
.. code-block:: c
|
|
|
|
|
|
|
|
union sigval
|
|
|
|
{
|
|
|
|
int sival_int;
|
|
|
|
void *sival_ptr;
|
|
|
|
};
|
|
|
|
|
|
|
|
.. c:struct:: sigevent
|
|
|
|
|
|
|
|
The following is used to attach a signal to a message queue to notify a
|
|
|
|
task when a message is available on a queue.
|
|
|
|
|
|
|
|
.. code-block:: c
|
|
|
|
|
|
|
|
struct sigevent
|
|
|
|
{
|
|
|
|
int sigev_signo;
|
|
|
|
union sigval sigev_value;
|
|
|
|
int sigev_notify;
|
|
|
|
};
|
|
|
|
|