commit 80e7408a7161c9f9b01c8ba2ee1e8a04eaca5ef4
Author: patacongo Nuttx Operating System Porting Guide by Gregory Nutt Last Update: February 8, 2007 Overview
+ This document provides and overview of the Nuttx build and configuration
+ logic and provides hints for the incorporation of new processor/board archectures
+ into the build.
+
+ See also arch/README.txt.
+ General Philosophy.
+
+ The general directly layout for Nuttx is very similar to the directory structure
+of the Linux kernel -- at least at the most superficial layers.
+At the top level is the main makefile and a series of sub-directories identified
+below and discussed in the following paragraphs:
+User's Manual
+
+
+by
+
+Gregory Nutt
+
+Last Update: January 28, 2007
+
+This user's manual is divided into five sections:
+
+This section describes each C-callable interface to the Nuttx
+Operating System. The description of each interface is presented
+in the following format:
+
+Function Prototype: The C prototype of the interface function
+is provided.
+
+Description: The operation performed by the interface function
+is discussed.
+
+Input Parameters: All input parameters are listed along
+with brief descriptions of each input parameter.
+
+Returned Values: All possible values returned by the interface
+function are listed. Values returned as side-effects (through
+pointer input parameters or through global variables) will be
+addressed in the description of the interface function.
+
+Assumptions/Limitations: Any unusual assumptions made by
+the interface function or any non-obvious limitations to the use
+of the interface function will be indicated here.
+
+POSIX Compatibility: Any significant differences between the
+Nuttx interface and its corresponding POSIX interface will be noted
+here.
+
+NOTE: In order to achieve an independent name space for the Nuttx
+interface functions, differences in function names and types are
+to be expected and will not be identified as differences in these
+paragraphs.
+
+Tasks.
+Nuttx is a flat address OS. As such it does not support "processes"
+in the way that, say, Linux does.
+Nuttx only supports simple threads running within the same address space.
+However, the programming model makes a distinction between "tasks"
+and pthreads:
+
+File Descriptors and Streams.
+This applies, in particular, in the area of opened file descriptors and streams.
+When a task is started using the interfaces in this section, it will be created
+with at most three open files.
+
+If CONFIG_DEV_CONSOLE is defined, the first three file descriptors (corresponding
+to stdin, stdout, stderr) will be duplicated for the the new task.
+Since these file descriptors are duplicated, the child task can free close
+them or manipulate them in any way without effecting the parent task.
+File-related operations (open, close, etc.) within a task will have no effect
+on other tasks.
+Since the three file descriptors are duplicated, it is also possible to perform
+some level of redirection.
+
+pthreads, on the other hand, will always share file descriptors with the parent
+thread. In this case, file operations will have effect only all pthreads the
+were started from the same parent thread.
+
+
+Function Prototype:
+
+Description:
+ This function creates and activates a new task with a
+ specified priority and returns its system-assigned ID.
+ The entry address entry is the address of the "main"
+ function of the task.
+ This function will be called once the C environment has been set up.
+ The specified function will be called with four arguments.
+ Should the specified routine return, a call to exit() will automatically be made.
+
+ Note that four (and only four) arguments must be passed for the
+ spawned functions.
+
+ The newly created task does not inherity characteristics
+ from the parent task: The new task is started at the
+ default system priority and with the SCHED_FIFO scheduling
+ policy. These characteristcs may be modified after the new
+ task has been started.
+
+Input Parameters:
+
+ Returned Values:
+
+Assumptions/Limitations:
+
+POSIX Compatibility: This is a NON-POSIX interface.
+VxWorks provides the following similar interface:
+
+The Nuttx task_create() differs from VxWorks' taskSpawn() in the
+following ways:
+
+Function Prototype:
+
+Description:
+
+ This function initializes a Task Control Block (TCB)
+ in preparation for starting a new thread.
+
+ Unlike task_create(), task_init() does not activate the task.
+ This must be done by calling task_activate().
+
+Input Parameters:
+ Table of Contents
+
+
+1.0 Introduction
+
+
+2.0 Directory Structure
+
+
+.
+|-- Makefile
+|-- Documentation
+| `-- (documentation files)
+|-- arch
+| |-- (architecture)
+| | |-- Make.defs
+| | |-- defconfig
+| | |-- include
+| | |-- setenv.sh
+| | `-- src
+| `-- (other architectures)
+|-- drivers
+| |-- Makefile
+| `-- (driver source files)
+|-- examples
+| `-- (example)
+| |-- Makefile
+| `-- (example source files)
+|-- fs
+| |-- Makefile
+| `-- (fs source files)
+|-- include
+| |-- (standard header files)
+| |-- nuttx
+| | `-- (nuttx specific header files)
+| `- sys
+| | `-- (more standard header files)
+|-- lib
+| |-- Makefile
+| `-- (lib source files)
+|-- mm
+| |-- Makefile
+| `-- (mm source files)
+|-- sched
+| |-- Makefile
+| `-- (sched source files)
+`-- tools
+ |-- Makefile.mkconfig
+ |-- configure.sh
+ |-- mkconfig.c
+ |-- mkdeps.sh
+ `-- zipme
+
+
+2.1 Documentation
+2.2 arch
+2.3 drivers
+2.4 examples
+2.5 fs
+2.6 include
+2.7 lib
+2.8 mm
+2.9 sched
+2.10 tools
+
+
+3.0 Configuring and Building
+
+
+
+
+
diff --git a/Documentation/NuttxUserGuide.html b/Documentation/NuttxUserGuide.html
new file mode 100644
index 00000000000..c8e26278d34
--- /dev/null
+++ b/Documentation/NuttxUserGuide.html
@@ -0,0 +1,4105 @@
+
+
+
+1.0 Introduction
+
+
+
+
+
+
+
+2.0 OS Interfaces
+
+
+
+2.1 Task Control Interfaces
+
+
+
+2.1.1 task_create
+
+
+ #include <sched.h>
+ int task_create(
+ char *name,
+ int priority,
+ int stack_size,
+ main_t entry,
+ char *arg1, char *arg2, char *arg3, char *arg4);
+
+
+
+
+
+
+
+
+ int taskSpawn(
+ char *name,
+ int priority,
+ int options,
+ int stackSize,
+ FUNCPTR entryPt,
+ int arg1, int arg2, int arg3, int arg4, int arg5,
+ int arg6, int arg7, int arg8, int arg9, int arg10);
+
+
+
+
+
+2.1.2 task_init
+
+
+ #include <sched.h>
+ STATUS task_init(
+ _TCB *tcb,
+ char *name,
+ int priority,
+ uint32 *stack,
+ uint32 stack_size,
+ maint_t entry,
+ int arg1, int arg2, int arg3, int arg4);
+
+
+
+
+
+Returned Values: +
+OK, or ERROR if the task cannot be initialized.
+This function can only failure is it is unable to assign + a new, unique task ID to the TCB (errno is not set).
++Assumptions/Limitations: +
+POSIX Compatibility: This is a NON-POSIX interface. +VxWorks provides the following similar interface: +
+ STATUS taskInit( + WIND_TCB *pTcb, + char *name, + int priority, + int options, + uint32 *pStackBase, + int stackSize, + FUNCPTR entryPt, + int arg1, int arg2, int arg3, int arg4, int arg5, + int arg6, int arg7, int arg8, int arg9, int arg10); ++ +
+The Nuttx task_init() differs from VxWorks' taskInit() in the +following ways: +
+Function Prototype: +
+ #include <sched.h> + STATUS task_activate( _TCB *tcb ); ++ +
+Description: This function activates tasks created by task_init(). +Without activation, a task is ineligible for execution by the +scheduler. +
+Input Parameters: +
+Returned Values: +
+Assumptions/Limitations: +
+POSIX Compatibility: This is a NON-POSIX interface. +VxWorks provides the following similar interface: +
+ STATUS taskActivate( int tid ); ++ +
+The Nuttx task_activate() differs from VxWorks' taskActivate() in the +following ways: +
+Function Prototype: +
+ #include <sched.h> + STATUS task_delete( pid_t pid ); ++ +
+Description: This function causes a specified task to cease +to exist -- its stack and TCB will be deallocated. This function +is the companion to task_create(). +
+Input Parameters: +
+Returned Values: +
+Assumptions/Limitations: +
+task_delete() must be used with caution: If the task holds resources +(for example, allocated memory or semaphores needed by other tasks), then +task_delete() can strand those resources. +
+POSIX Compatibility: This is a NON-POSIX interface. +VxWorks provides the following similar interface: +
+ STATUS taskDelete( int tid ); ++ +
+The Nuttx task_delete() differs from VxWorks' taskDelete() in +the following ways: +
+Function Prototype: +
+ #include <sched.h> + void exit( int code ); + + #include <nuttx/unistd.h> + void _exit( int code ); ++ +
+Description: This function causes the calling task to cease +to exist -- its stack and TCB will be deallocated. exit differs from +_exit in that it flushs streams, closes file descriptors and will +execute any function registered with atexit(). +
+Input Parameters: +
+Returned Values: None. + +
+Assumptions/Limitations: + +
+POSIX Compatibility: This is equivalent to the ANSI interface: +
+ void exit( int code ); ++And the unix interface: +
+ void _exit( int code ); ++ +
+The Nuttx exit() differs from ANSI exit() in +the following ways: +
+Function Prototype: +
+ #include <sched.h> + STATUS task_restart( pid_t pid ); ++ +
+Description: This function "restarts" a task. +The task is first terminated and then reinitialized with same +ID, priority, original entry point, stack size, and parameters +it had when it was first started. +
+Input Parameters: +
+Returned Values: +
+Assumptions/Limitations: +
+POSIX Compatibility: This is a NON-POSIX interface. +VxWorks provides the following similar interface: +
+ STATUS taskRestart (int tid); ++ +
+The Nuttx task_restart() differs from VxWorks' taskRestart() in +the following ways: +
+Function Prototype: +
+ #include <unistd.h> + pid_t getpid( void ); ++ +
+Description: This function returns the task ID of the +calling task. The task ID will be invalid if called at the interrupt +level. +
+Input Parameters: None. +
+Returned Values: +
+Assumptions/Limitations: +
+POSIX Compatibility: +Compatible with the POSIX interface of the same name. + +
+Nuttx performs strict priority scheduling: Tasks of higher +priority have exclusive access to the CPU until they become blocked. +At that time, the CPU is available to tasks of lower priority. +Tasks of equal priority are scheduled FIFO. +
+The OS interfaces described in the following paragraphs provide +a POSIX- compliant interface to the Nuttx scheduler. However, these +POSIX interfaces assume a greater range of scheduling options +than those provided by the Nuttx scheduler. As a result, many of +these POSIX interfaces are little more than stubs. + +
+Function Prototype: +
+ #include <sched.h> + int sched_setparam( pid_t pid, const struct sched_param *param ); ++ +
+Description: This function sets the priority of the task +specified by pid input parameter. +
+NOTE: Setting a task's priority to the same value has the similar +effect to sched_yield() -- The task will be moved to after all +other tasks with the same priority. +
+Input Parameters: +
+Returned Values: +
+Assumptions/Limitations: +
+ POSIX Compatibility: Comparable to the POSIX +interface of the same name. +Differences from the full POSIX implementation include: +
+Function Prototype: +
+ #include <sched.h> + int sched_getparam (pid_t pid, struct sched_param *param); ++ +
+Description: This function gets the scheduling priority +of the task specified by pid. +
+Input Parameters: +
+Returned Values: +
+Assumptions/Limitations: +
+ POSIX Compatibility: Comparable to the POSIX +interface of the same name. + +
+Function Prototype: +
+ #include <sched.h> + int sched_setscheduler (pid_t pid, int policy, const struct sched_param *param); ++
+ Description: + sched_setscheduler() sets both the scheduling policy + and the priority for the task identified by pid. + If pid equals zero, the scheduler of the calling + thread will be set. + The parameter 'param' holds the priority of the thread under the new policy. +
++Input Parameters: +
+ Returned Values: + On success, sched_setscheduler() returns OK (zero). On + error, ERROR (-1) is returned, and errno is set appropriately: +
++Assumptions/Limitations: +
+ POSIX Compatibility: Comparable to the POSIX +interface of the same name. + +
+Function Prototype: +
+ #include <sched.h> + int sched_getscheduler (pid_t pid); ++
+ Description: + sched_getscheduler() returns the scheduling policy + currently applied to the process identified by pid. If + pid equals zero, the policy of the calling process will + be retrieved. + * + * Inputs: + * + * Return Value: + + This function returns the current scheduling +policy. +
+Input Parameters: +
+Returned Values: +
+Assumptions/Limitations: +
+ POSIX Compatibility: Comparable to the POSIX +interface of the same name. +Differences from the full POSIX implementation include: +
+Function Prototype: +
+ #include <sched.h> + int sched_yield( void ); ++ +
+Description: This function forces the calling task to give +up the CPU (only to other tasks at the same priority). +
+Input Parameters: None. +
+Returned Values: +
+Assumptions/Limitations: +
+ POSIX Compatibility: Comparable to the POSIX +interface of the same name. + +
+Function Prototype: +
+ #include <sched.h> + int sched_get_priority_max (int policy) ++ +
+Description: This function returns the value of the highest +possible task priority for a specified scheduling policy. +
+Input Parameters: +
+Returned Values: +
+Assumptions/Limitations: +
+ POSIX Compatibility: Comparable to the POSIX +interface of the same name. + +
+Function Prototype: +
+ #include <sched.h> + int sched_get_priority_min (int policy); ++ +
+Description: This function returns the value of the lowest +possible task priority for a specified scheduling policy. +
+Input Parameters: +
+Returned Values: +
+Assumptions/Limitations: +
+ POSIX Compatibility: Comparable to the POSIX +interface of the same name. + +
+Function Prototype: +
+ #include <sched.h> + int sched_get_rr_interval (pid_t pid, struct timespec *interval); ++ +
+ Description: + sched_rr_get_interval() writes the timeslice interval + for task identified by pid into the timespec structure + pointed to by interval. If pid is zero, the timeslice + for the calling process is written into 'interval. The + identified process should be running under the SCHED_RR + scheduling policy.' +
++ Input Parameters: +
++ Returned Values: + On success, sched_rr_get_interval() returns OK (0). On + error, ERROR (-1) is returned, and errno is set to: +
++ Assumptions/Limitations: +
+ POSIX Compatibility: Comparable to the POSIX + interface of the same name. +
+ ++Function Prototype: +
+ #include <sched.h> + STATUS sched_lock( void ); ++ +
+Description: This function disables context switching by +Disabling addition of new tasks to the ready-to-run task list. +The task that calls this function will be the only task that is +allowed to run until it either calls sched_unlock (the appropriate +number of times) or until it blocks itself. +
+Input Parameters: None. +
+Returned Values: +
+Assumptions/Limitations: +
+ POSIX Compatibility: This is a NON-POSIX interface. +VxWorks provides the comparable interface: +
+ STATUS taskLock( void ); ++ +
+Function Prototype: +
+ #include <sched.h> + STATUS sched_unlock( void ); ++ +
+Description: This function decrements the preemption lock +count. Typically this is paired with sched_lock() and concludes +a critical section of code. Preemption will not be unlocked until +sched_unlock() has been called as many times as sched_lock(). +When the lockCount is decremented to zero, any tasks that were +eligible to preempt the current task will execute. +
+Input Parameters: None. +
+Returned Values: +
+Assumptions/Limitations: +
+ POSIX Compatibility: This is a NON-POSIX interface. +VxWorks provides the comparable interface: +
+ STATUS taskUnlock( void ); ++ +
+Function Prototype: +
+ #include <sched.h> + sint32 sched_lockcount( void ) ++ +
+Description: This function returns the current value of +the lockCount. If zero, preemption is enabled; if non-zero, this +value indicates the number of times that sched_lock() has been called +on this thread of execution. +
+Input Parameters: None. +
+Returned Values: +
+Assumptions/Limitations: +
+ POSIX Compatibility: None. +
+The Nuttx supports POSIX named message queues for intertask communication. +Any task may send or receive messages on named message queues. +Interrupt handlers may send messages via named message queues. + +
+Function Prototype: +
+ #include <mqueue.h> + mqd_t mq_open( const char *mqName, int oflags, ... ); ++ +
+Description: This function establish a connection between +a named message queue and the calling task. After a successful +call of mq_open(), the task can reference the message queue using +the address returned by the call. The message queue remains usable +until it is closed by a successful call to mq_close(). +
+Input Parameters: +
+Returned Values: +
+Assumptions/Limitations: +
+ POSIX Compatibility: Comparable to the POSIX interface +of the same name. +Differences from the full POSIX implementation include: +
+Function Prototype: +
+ #include <mqueue.h> + int mq_close( mqd_t mqdes ); ++ +
+Description: This function is used to indicate that the +calling task is finished with the specified message queued mqdes. +The mq_close() deallocates any system resources allocated by the +system for use by this task for its message queue. +
+If the calling task has attached a notification request to the message +queue via this mqdes (see mq_notify()), this attachment will be +removed and the message queue is available for another task to attach +for notification. +
+Input Parameters: +
+Returned Values: +
+Assumptions/Limitations: +
+
+ POSIX Compatibility: Comparable to the POSIX interface +of the same name. + +
+Function Prototype: +
+ #include <mqueue.h> + int mq_unlink( const char *mqName ); ++ +
+Description: This function removes the message queue named +by "mqName." If one or more tasks have the message queue +open when mq_unlink() is called, removal of the message queue +is postponed until all references to the message queue have been +closed. +
+Input Parameters: +
+Returned Values: None. +
+Assumptions/Limitations: +
+ POSIX Compatibility: Comparable to the POSIX +interface of the same name. + +
+Function Prototype: +
+ #include <mqueue.h> + int mq_send( mqd_t mqdes, const void *msg, size_t msgLen, int msgPrio ); ++ +
+Description: This function adds the specified message (msg) +to the message queue (mqdes). The "msgLen" parameter +specifies the length of the message in bytes pointed to by "msg." +This length must not exceed the maximum message length from the +mq_getattr(). +
+If the message queue is not full, mq_send() will in the message +in the message queue at the position indicated by the "msgPrio" +argument. Messages with higher priority will be inserted before +lower priority messages. The value of "msgPrio" must +not exceed MQ_PRIO_MAX. +
+If the specified message queue is full and O_NONBLOCK is not +set in the message queue, then mq_send() will block until space +becomes available to the queue the message. +
+If the message queue is full and osNON_BLOCK is set, the message +is not queued and ERROR is returned. +
+Input Parameters: +
+Returned Values: None. +
+Assumptions/Limitations: +
+ POSIX Compatibility: Comparable to the POSIX +interface of the same name. +Differences from the full POSIX implementation include: +
+Function Prototype: +
+ #include <mqueue.h> + int mq_receive( mqd_t mqdes, void *msg, size_t msgLen, int *msgPrio ); ++ +
+Description: This function receives the oldest of the highest +priority messages from the message queue specified by "mqdes." +If the size of the buffer in bytes (msgLen) is less than the "mq_msgsize" +attribute of the message queue, mq_receive will return an error. +Otherwise, the select message is removed from the queue and copied +to "msg." +
+If the message queue is empty and O_NONBLOCK was not set, mq_receive() +will block until a message is added to the message queue. If more +than one task is waiting to receive a message, only the task with +the highest priority that has waited the longest will be unblocked. +
+If the queue is empty and O_NONBLOCK is set, ERROR will be +returned. +
+Input Parameters: +
+Returned Values: +
+Assumptions/Limitations: +
+ POSIX Compatibility: Comparable to the POSIX +interface of the same name. +Differences from the full POSIX implementation include: +
+Function Prototype: +
+ #include <mqueue.h> + int mq_notify( mqd_t mqdes, const struct sigevent *notification ); ++ +
+Description: If the "notification" input parameter +is not NULL, this function connects the task with the message queue such +that the specified signal will be sent to the task whenever the message +changes from empty to non-empty. One notification can be attached +to a message queue. +
+If "notification" is NULL, the attached notification +is detached (if it was held by the calling task) and the queue +is available to attach another notification. +
+When the notification is sent to the registered task, its registration +will be removed. The message queue will then be available for +registration. +
+Input Parameters: +
+Returned Values: None. +
+Assumptions/Limitations: +
+ POSIX Compatibility: Comparable to the POSIX interface +of the same name. +Differences from the full POSIX implementation include: +
+Function Prototype: +
+ #include <mqueue.h> + int mq_setattr( mqd_t mqdes, const struct mq_attr *mqStat, + struct mq_attr *oldMqStat); ++ +
+Description: This function sets the attributes associated +with the specified message queue "mqdes." Only the "O_NONBLOCK" +bit of the "mq_flags" can be changed. +
+If "oldMqStat" is non-null, mq_setattr() will store +the previous message queue attributes at that location (just as +would have been returned by mq_getattr()). +
+Input Parameters: +
+Returned Values: +
+Assumptions/Limitations: +
+ POSIX Compatibility: Comparable to the POSIX +interface of the same name. + +
+Function Prototype: +
+ #include <mqueue.h> + int mq_getattr( mqd_t mqdes, struct mq_attr *mqStat); ++ +
+Description: This functions gets status information and +attributes associated with the specified message queue. +
+Input Parameters: +
+Returned Values: +
+Assumptions/Limitations: +
+ POSIX Compatibility: Comparable to the POSIX +interface of the same name. + +
+Semaphores. Semaphores are the basis for +synchronization and mutual exclusion in Nuttx. Nuttx supports +POSIX semaphores. +
+Semaphores are the preferred mechanism for gaining exclusive access to a +resource. sched_lock() and sched_unlock() can also be used for this purpose. +However, sched_lock() and sched_unlock() have other undesirable side-affects +in the operation of the system: sched_lock() also prevents higher-priority +tasks from running that do not depend upon the semaphore-managed resource +and, as a result, can adversely affect system response times. +
+Priority Inversion. Proper use of semaphores avoids the issues of +sched_lock(). However, consider the following example: +
+Some operating systems avoid priority inversion by automatically +increasing the priority of the low-priority Task C (the operable +buzz-word for this behavior is mutex semaphores). The Nuttx does not +support this behavior. As a consequence, it is left to the designer to +provide implementations that will not suffer from priority inversion. +The designer may, as examples: +
+ +
+Function Prototype: +
+ #include <semaphore.h> + int sem_init ( sem_t *sem, int pshared, unsigned int value ); ++ +
+Description: This function initializes the UN-NAMED semaphore +sem. Following a successful call to sem_init(), the semaphore +may be used in subsequent calls to sem_wait(), sem_post(), and +sem_trywait(). The semaphore remains usable until it is destroyed. +
+Only sem itself may be used for performing synchronization. The +result of referring to copies of sem in calls to sem_wait(), +sem_trywait(), sem_post(), and sem_destroy(), is +not defined. +
+Input Parameters: +
+Returned Values: +
+Assumptions/Limitations: +
+ POSIX Compatibility: Comparable to the POSIX +interface of the same name. +Differences from the full POSIX implementation include: +
+Function Prototype: +
+ #include <semaphore.h> + int sem_destroy ( sem_t *sem ); ++ +
+Description: This function is used to destroy the un-named semaphore +indicated by sem. Only a semaphore that was created using +sem_init() may be destroyed using sem_destroy(). The effect +of calling sem_destroy() with a named semaphore is undefined. The +effect of subsequent use of the semaphore sem is undefined until +sem is re-initialized by another call to sem_init(). +
+The effect of destroying a semaphore upon which other tasks are currently +blocked is undefined. +
+Input Parameters: +
+Returned Values: +
+Assumptions/Limitations: +
+ POSIX Compatibility: Comparable to the POSIX +interface of the same name. + +
+Function Prototype: +
+ #include <semaphore.h> + sem_t *sem_open ( const char *name, int oflag, ...); ++ +
+Description: This function establishes a connection between +named semaphores and a task. Following a call to sem_open() with +the semaphore name, the task may reference the semaphore associated +with name using the address returned by this call. The semaphore +may be used in subsequent calls to sem_wait(), sem_trywait(), +and sem_post(). The semaphore remains usable until the semaphore +is closed by a successful call to sem_close(). +
+If a task makes multiple calls to sem_open() with the same name, +then the same semaphore address is returned (provided there have +been no calls to sem_unlink()). +
+Input Parameters: +
+Returned Values: +
+Assumptions/Limitations: +
+ POSIX Compatibility: Comparable to the POSIX +interface of the same name. +Differences from the full POSIX implementation include: +
+Function Prototype: +
+ #include <semaphore.h> + int sem_close ( sem_t *sem ); ++ +
+Description: This function is called to indicate that the +calling task is finished with the specified named semaphore, sem. +The sem_close() deallocates any system resources allocated by +the system for this named semaphore. +
+If the semaphore has not been removed with a call to sem_unlink(), +then sem_close() has no effect on the named semaphore. However, +when the named semaphore has been fully unlinked, the semaphore +will vanish when the last task closes it. +
+Care must be taken to avoid risking the deletion of a semaphore +that another calling task has already locked. +
+Input Parameters: +
+Returned Values: +
+Assumptions/Limitations: +
+ POSIX Compatibility: Comparable to the POSIX +interface of the same name. + +
+Function Prototype: +
+ #include <semaphore.h> + int sem_unlink ( const char *name ); ++ +
+Description: This function will remove the semaphore named by the +input name parameter. If one or more tasks have the semaphore named by +name oepn when sem_unlink() is called, destruction of the semaphore will +be postponed until all references have been destroyed by calls to +sem_close(). +
+Input Parameters: +
+Returned Values: +
+Assumptions/Limitations: +
+ POSIX Compatibility: Comparable to the POSIX +interface of the same name. +Differences from the full POSIX implementation include: +
+Function Prototype: +
+ #include <semaphore.h> + int sem_wait ( sem_t *sem ); ++ +
+Description: This function attempts to lock the semaphore +referenced by sem. If the semaphore as already locked by another +task, the calling task will not return until it either successfully acquires +the lock or the call is interrupted by a signal. +
+Input Parameters: +
+Returned Values: +
+If sem_wait returns -1 (ERROR) then the cause of the failure +will be indicated by the thread-specific errno value (a pointer +to this value can be obtained using get_errno_ptr()). The following +lists the possible values for errno: +
+
+Assumptions/Limitations: +
+ POSIX Compatibility: Comparable to the POSIX +interface of the same name. + +
+Function Prototype: +
+ #include <semaphore.h> + int sem_trywait ( sem_t *sem ); ++ +
+Description: This function locks the specified semaphore +only if the semaphore is currently not locked. In any event, the call +returns without blocking. +
+Input Parameters: +
+Returned Values: +
+
+ +
+Assumptions/Limitations: +
+ POSIX Compatibility: Comparable to the POSIX +interface of the same name. + +
+Function Prototype: +
+ #include <semaphore.h> + int sem_post ( sem_t *sem ); ++ +
+Description: When a task has finished with a semaphore, +it will call sem_post(). This function unlocks the semaphore referenced +by sem by performing the semaphore unlock operation. +
+If the semaphore value resulting from this operation is positive, then +no tasks were blocked waiting for the semaphore to become unlocked; +The semaphore value is simply incremented. +
+If the value of the semaphore resulting from this operation is zero, then +on of the tasks blocked waiting for the semaphore will be allowed to +return successfully from its call to sem_wait(). +
+NOTE: sem_post() may be called from an interrupt handler. +
+Input Parameters: +
+Returned Values: +
+Assumptions/Limitations: This function cannot be called +from an interrupt handler. It assumes the currently executing +task is the one that is performing the unlock. +
+ POSIX Compatibility: Comparable to the POSIX +interface of the same name. + +
+Function Prototype: +
+ #include <semaphore.h> + int sem_getvalue ( sem_t *sem, int *sval ); ++ +
+Description: This function updates the location referenced +by sval argument to have the value of the semaphore referenced +by sem without effecting the state of the semaphore. The updated +value represents the actual semaphore value that occurred at some +unspecified time during the call, but may not reflect the actual +value of the semaphore when it is returned to the calling task. +
+If sem is locked, the value return by sem_getvalue() will either +be zero or a negative number whose absolute value represents the +number of tasks waiting for the semaphore. +
+Input Parameters: +
+Returned Values: +
+Assumptions/Limitations: +
+ POSIX Compatibility: Comparable to the POSIX +interface of the same name. + +
+The Nuttx provides a general watchdog timer facility. This +facility allows the Nuttx user to specify a watchdog timer function +that will run after a specified delay. The watchdog timer function +will run in the context of the timer interrupt handler. Because +of this, a limited number of Nuttx interfaces are available to +the watchdog timer function. However, the watchdog timer function +may use mq_send(), and sigqueue() to communicate with Nuttx tasks. + +
+Function Prototype: +
+ #include <wdog.h> + WDOG_ID wd_create (void); ++ +
+Description: The wd_create function will create a watchdog +by allocating the appropriate resources for the watchdog. +
+Input Parameters: None. +
+Returned Values: +
+Assumptions/Limitations: +
+ POSIX Compatibility: This is a NON-POSIX interface. +VxWorks provides the following comparable interface: +
+ WDOG_ID wdCreate (void); ++ +
+Differences from the VxWorks interface include: +
+Function Prototype: +
+ #include <wdog.h> + STATUS wd_delete (WDOG_ID wdId); ++ +
+Description: The wd_delete function will deallocate a +watchdog. The watchdog will be removed from the timer queue if +has been started. +
+Input Parameters: +
+Returned Values: +
+Assumptions/Limitations: It is the responsibility of the +caller to assure that the watchdog is inactive before deleting +it. +
+ POSIX Compatibility: This is a NON-POSIX interface. +VxWorks provides the following comparable interface: +
+ STATUS wdDelete (WDOG_ID wdId); ++ +
+Differences from the VxWorks interface include: +
+Function Prototype: +
+ #include <wdog.h> + STATUS wd_start( WDOG_ID wdId, int delay, wdentry_t wdentry, + int parm1, int parm2, int parm3, int parm4 ); ++ +
+Description: This function adds a watchdog to the timer +queue. The specified watchdog function will be called from the +interrupt level after the specified number of ticks has elapsed. +Watchdog timers may be started from the interrupt level. +
+Watchdog times execute in the context of the timer interrupt handler, but +with the PIC/PID address environment that was in place when wd_start() +was called. +
+Watchdog timers execute only once. +
+To replace either the timeout delay or the function to be executed, +call wd_start again with the same wdId; only the most recent +wd_start() on a given watchdog ID has any effect. +
+Input Parameters: +
+Returned Values: +
+Assumptions/Limitations: The watchdog routine runs in the +context of the timer interrupt handler and is subject to all ISR +restrictions. +
+ POSIX Compatibility: This is a NON-POSIX interface. +VxWorks provides the following comparable interface: +
+ STATUS wdStart (WDOG_ID wdId, int delay, FUNCPTR wdentry, int parameter); ++ +
+Differences from the VxWorks interface include: +
+Function Prototype: +
+ #include <wdog.h> + STATUS wd_cancel (WDOG_ID wdId); ++ +
+Description: This function cancels a currently running +watchdog timer. Watchdog timers may be canceled from the interrupt +level. +
+Input Parameters: +
+Returned Values: +
+Assumptions/Limitations: +
+ POSIX Compatibility: This is a NON-POSIX interface. +VxWorks provides the following comparable interface: +
+ STATUS wdCancel (WDOG_ID wdId); ++ +
+The Nuttx provides signal interfaces for tasks. Signals are +used to alter the flow control of tasks by communicating asynchronous +events within or between task contexts. Any task or interrupt +handler can post (or send) a signal to a particular task. The +task being signaled will execute task-specified signal handler +function the next time that the task has priority. +The signal handler is a user-supplied function that is bound to +a specific signal and performs whatever actions are necessary +whenever the signal is received. +
+Signal handlers execute in the context of the task that registered +the signal handler. +
+There are no predefined actions for any signal. +The default action for all signals (i.e., when no signal handler has +been supplied by the user) is to ignore the signal. +
+Tasks may also suspend themselves and wait until a signal is received. + +
+Function Prototype: +
+ #include <signal.h> + int sigemptyset(sigset_t *set); ++ +
+Description: This function initializes the signal set specified +by set such that all signals are excluded. +
+Input Parameters: +
+Returned Values: +
+Assumptions/Limitations: +
+ POSIX Compatibility: Comparable to the POSIX +interface of the same name. + +
+Function Prototype: +
+ #include <signal.h> + int sigfillset(sigset_t *set); ++ +
+Description: This function initializes the signal set specified +by set such that all signals are included. +
+Input Parameters: +
+Returned Values: +
+Assumptions/Limitations: +
+ POSIX Compatibility: Comparable to the POSIX +interface of the same name. + +
+Function Prototype: +
+ #include <signal.h> + int sigaddset(sigset_t *set, int signo); ++ +
+Description: This function adds the signal specified by +signo to the signal set specified by set. +
+Input Parameters: +
+Returned Values: +
+Assumptions/Limitations: +
+ POSIX Compatibility: Comparable to the POSIX +interface of the same name. + +
+Function Prototype: +
+ #include <signal.h> + int sigdelset(sigset_t *set, int signo); ++ +
+Description: This function deletes the signal specified +by signo from the signal set specified by set. +
+Input Parameters: +
+Returned Values: +
+Assumptions/Limitations: +
+ POSIX Compatibility: Comparable to the POSIX +interface of the same name. + +
+Function Prototype: +
+ #include <signal.h> + int sigismember(const sigset_t *set, int signo); ++ +
+Description: This function tests whether the signal specified +by signo is a member of the set specified by set. +
+Input Parameters: +
+Returned Values: +
+Assumptions/Limitations: +
+ POSIX Compatibility: Comparable to the POSIX +interface of the same name. + +
+Function Prototype: +
+ #include <signal.h> + int sigaction( int signo, const struct sigaction *act, + struct sigaction *oact ); ++ +
+Description: This function allows the calling task to +examine and/or specify the action to be associated with a specific +signal. +
+The structure sigaction, used to describe an action to be taken, is defined +to include the following members: +
+If the argument act is not NULL, it points to a structure specifying the +action to be associated with the specified signal. If the argument oact +is not NULL, the action previously associated with the signal is stored +in the location pointed to by the argument oact. If the argument act is +NULL, signal handling is unchanged by this function call; thus, the call +can be used to enquire about the current handling of a given signal. +
+When a signal is caught by a signal-catching function installed by the +sigaction() function, a new signal mask is calculated and installed for +the duration of the signal-catching function. This mask is formed by taking +the union of the current signal mask and the value of the sa_mask for the +signal being delivered, and then including the signal being delivered. If +and when the signal handler returns, the original signal mask is restored. +
+Signal catching functions execute in the same address environment as the +task that called sigaction() to install the signal-catching function. +
+Once an action is installed for a specific signal, it remains installed +until another action is explicitly requested by another call to +sigaction(). +
+Input Parameters: +
+Returned Values: +
+Assumptions/Limitations: +
+ POSIX Compatibility: Comparable to the POSIX +interface of the same name. +Differences from the POSIX implementation include: +
+Function Prototype: +
+ #include <signal.h> + int sigprocmask(int how, const sigset_t *set, sigset_t *oset); ++ +
+Description: This function allows the calling task to +examine and/or change its signal mask. If the set is not NULL, +then it points to a set of signals to be used to change the currently +blocked set. The value of how indicates the manner in which the +set is changed. +
+If there are any pending unblocked signals after the call to sigprocmask(), +those signals will be delivered before sigprocmask() returns. +
+If sigprocmask() fails, the signal mask of the task is not changed. +
+Input Parameters: +
+Returned Values: +
+Assumptions/Limitations: +
+ POSIX Compatibility: Comparable to the POSIX +interface of the same name. + +
+Function Prototype: +
+ #include <signal.h> + int sigpending( sigset_t *set ); ++ +
+Description: This function stores the returns the set of +signals that are blocked for delivery and that are pending for +the calling task in the space pointed to by set. +
+If the task receiving a signal has the signal blocked via its +sigprocmask, the signal will pend until it is unmasked. Only one pending +signal (for a given signo) is retained by the system. This is consistent +with POSIX which states: "If a subsequent occurrence of a pending +signal is generated, it is implementation defined as to whether the signal +is delivered more than once." +
+Input Parameters: +
+Returned Values: +
+Assumptions/Limitations: +
+ POSIX Compatibility: Comparable to the POSIX +interface of the same name. + +
+Function Prototype: +
+ #include <signal.h> + int sigsuspend( const sigset_t *set ); ++ +
+Description: The sigsuspend() function replaces the signal mask +with the set of signals pointed to by the argument set and then suspends +the task until delivery of a signal to the task. +
+If the effect of the set argument is to unblock a pending signal, then +no wait is performed. +
+The original signal mask is restored when sigsuspend() returns. +
+Waiting for an empty signal set stops a task without freeing any +resources (a very bad idea). +
+Input Parameters: +
+Returned Values: +
+Assumptions/Limitations: +
+ POSIX Compatibility: Comparable to the POSIX +interface of the same name. +Differences from the POSIX specification include: +
+Function Prototype: +
+ #include <signal.h> + int sigwaitinfo(const sigset_t *set, struct siginfo *info); ++ +
+Description: This function is equivalent to sigtimedwait() +with a NULL timeout parameter. (see below). +
+Input Parameters: +
+Returned Values: +
+Assumptions/Limitations: +
+ POSIX Compatibility: Comparable to the POSIX +interface of the same name. + +
+Function Prototype: +
+ #include <signal.h> + int sigtimedwait( const sigset_t *set, struct siginfo *info, + const struct timespec *timeout ); ++ +
+Description: This function selects the pending signal set +specified by the argument set. If multiple signals are pending in set, +it will remove and return the lowest numbered one. If no signals in set +are pending at the time of the call, the calling task will be suspended +until one of the signals in set becomes pending OR until the task +interrupted by an unblocked signal OR until the time interval specified by +timeout (if any), has expired. If timeout is NULL, then the timeout interval +is forever. +
+If the info argument is non-NULL, the selected signal number is +stored in the si_signo member and the cause of the signal is store +in the si_code member. The content of si_value is only meaningful +if the signal was generated by sigqueue(). The following values +for si_code are defined in signal.h: +
+Input Parameters: +
+Returned Values: +
+Assumptions/Limitations: +
+ POSIX Compatibility: Comparable to the POSIX +interface of the same name. +Differences from the POSIX interface include: +
+Function Prototype: +
+ #include <signal.h> + int sigqueue (int tid, int signo, const union sigval value); ++ +
+Description: This function sends the signal specified by +signo with the signal parameter value to the task specified +by tid. +
+If the receiving task has the signal blocked via its sigprocmask, +the signal will pend until it is unmasked. Only one pending signal +(for a given signo) is retained by the system. This is consistent with +POSIX which states: "If a subsequent occurrence of a pending signal +is generated, it is implementation defined as to whether the signal +is delivered more than once." +
+Input Parameters: +
+Returned Values: +
+Assumptions/Limitations: +
+ POSIX Compatibility: Comparable to the POSIX +interface of the same name. +Differences from the POSIX interface include: +
+
+Function Prototype: +
+
+ #include <pthread.h> + int pthread_attr_init(pthread_attr_t *attr); ++
+Description: +Initializes a thread attributes object (attr) with default values +for all of the individual attributes used by the implementation. +
+Input Parameters: +
+
+Returned Values: +
+If successful, the xxx() function will return +zero (OK). Otherwise, an error number will be +returned to indicate the error: +
+
+POSIX Compatibility: Comparable to the POSIX +interface of the same name. +
+
+Function Prototype: +
+
+ #include <pthread.h> + int pthread_attr_destroy(pthread_attr_t *attr); ++
+Description: +An attributes object can be deleted when it is no longer needed. +
+Input Parameters: +
+
+Returned Values: +
+If successful, the xxx() function will return +zero (OK). Otherwise, an error number will be +returned to indicate the error: +
+
+POSIX Compatibility: Comparable to the POSIX +interface of the same name. +
+
+Function Prototype: +
+
+ #include <pthread.h> + int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy); ++
+Description: +
+Input Parameters: +
+
+Returned Values: +
+If successful, the xxx() function will return +zero (OK). Otherwise, an error number will be +returned to indicate the error: +
+
+POSIX Compatibility: Comparable to the POSIX +interface of the same name. + +
+Function Prototype: +
+
+ #include <pthread.h> + int pthread_attr_getschedpolicy(pthread_attr_t *attr, int *policy); ++
+Description: +
+Input Parameters: +
+
+Returned Values: +
+If successful, the xxx() function will return +zero (OK). Otherwise, an error number will be +returned to indicate the error: +
+
+POSIX Compatibility: Comparable to the POSIX +interface of the same name. + +
+Function Prototype: +
+
+ #include <pthread.h> + int pthread_attr_setschedparam(pthread_attr_t *attr, + const struct sched_param *param); ++
+Description: +
+Input Parameters: +
+
+Returned Values: +
+If successful, the xxx() function will return +zero (OK). Otherwise, an error number will be +returned to indicate the error: +
+
+POSIX Compatibility: Comparable to the POSIX +interface of the same name. + +
+Function Prototype: +
+
+ #include <pthread.h> + int pthread_attr_getschedparam(pthread_attr_t *attr, + struct sched_param *param); ++
+Description: +
+Input Parameters: +
+
+Returned Values: +
+If successful, the xxx() function will return +zero (OK). Otherwise, an error number will be +returned to indicate the error: +
+
+POSIX Compatibility: Comparable to the POSIX +interface of the same name. + +
+Function Prototype: +
+
+ #include <pthread.h> + int pthread_attr_setinheritsched(pthread_attr_t *attr, + int inheritsched); ++
+Description: +
+Input Parameters: +
+
+Returned Values: +
+If successful, the xxx() function will return +zero (OK). Otherwise, an error number will be +returned to indicate the error: +
+
+POSIX Compatibility: Comparable to the POSIX +interface of the same name. +
+
+Function Prototype: +
+
+ #include <pthread.h> + int pthread_attr_getinheritsched(const pthread_attr_t *attr, + int *inheritsched); ++
+Description: +
+Input Parameters: +
+
+Returned Values: +
+If successful, the xxx() function will return +zero (OK). Otherwise, an error number will be +returned to indicate the error: +
+
+POSIX Compatibility: Comparable to the POSIX +interface of the same name. + +
+Function Prototype: +
+
+ #include <pthread.h> + int pthread_attr_setstacksize(pthread_attr_t *attr, long stacksize); ++
+Description: +
+Input Parameters: +
+
+Returned Values: +
+If successful, the xxx() function will return +zero (OK). Otherwise, an error number will be +returned to indicate the error: +
+
+POSIX Compatibility: Comparable to the POSIX +interface of the same name. + +
+Function Prototype: +
+
+ #include <pthread.h> + int pthread_attr_getstacksize(pthread_attr_t *attr, long *stackaddr); ++
+Description: +
+Input Parameters: +
+
+Returned Values: +
+If successful, the xxx() function will return +zero (OK). Otherwise, an error number will be +returned to indicate the error: +
+
+POSIX Compatibility: Comparable to the POSIX +interface of the same name. + +
+Function Prototype: +
+
+ #include <pthread.h> + int pthread_create(pthread_t *thread, pthread_attr_t *attr, + pthread_startroutine_t startRoutine, + pthread_addr_t arg); ++
+Description: +To create a thread object and runnable thread, a routine +must be specified as the new thread's start routine. An +argument may be passed to this routine, as an untyped +address; an untyped address may also be returned as the +routine's value. An attributes object may be used to +specify details about the kind of thread being created. +
+Input Parameters: +
+
+Returned Values: +
+If successful, the xxx() function will return +zero (OK). Otherwise, an error number will be +returned to indicate the error: +
+
+POSIX Compatibility: Comparable to the POSIX +interface of the same name. + +
+Function Prototype: +
+
+ #include <pthread.h> + int pthread_detach(pthread_t thread); ++
+Description: +A thread object may be "detached" to specify that the +return value and completion status will not be requested. +
+Input Parameters: +
+
+Returned Values: +
+If successful, the xxx() function will return +zero (OK). Otherwise, an error number will be +returned to indicate the error: +
+
+POSIX Compatibility: Comparable to the POSIX +interface of the same name. + +
+Function Prototype: +
+
+ #include <pthread.h> + void pthread_exit(pthread_addr_t pvValue); ++
+Description: +A thread may terminate it's own execution. +
+Input Parameters: +
+
+Returned Values: +
+If successful, the xxx() function will return +zero (OK). Otherwise, an error number will be +returned to indicate the error: +
+
+POSIX Compatibility: Comparable to the POSIX +interface of the same name. + +
+Function Prototype: +
+
+ #include <pthread.h> + int pthread_cancel(pthread_t thread); ++
+Description: + +
The pthread_cancel() function shall request that thread +be canceled. The target thread's cancelability state determines +when the cancellation takes effect. When the +cancellation is acted on, thread shall be terminated.
+ +When cancelability is disabled, all cancels are held pending +in the target thread until the thread changes the cancelability. +When cancelability is deferred, all cancels are held pending in +the target thread until the thread changes the cancelability or +calls pthread_testcancel().
+ +Cancelability is asynchronous; all cancels are acted upon +immediately (when enable), interrupting the thread with its processing.
+ ++Input Parameters: +
+
+Returned Values: +
+If successful, the ptnread_cancel() function will return zero (OK). +Otherwise, an error number will be returned to indicate the error: +
+
+POSIX Compatibility: Comparable to the POSIX +interface of the same name. Except:
++Function Prototype: +
+
+ #include <pthread.h> + int pthread_setcancelstate(int state, int *oldstate); ++
+Description: +
The pthread_setcancelstate() function atomically +sets both the calling thread's cancelability state to the indicated +state and returns the previous cancelability state at the location +referenced by oldstate. +Legal values for state are PTHREAD_CANCEL_ENABLE and PTHREAD_CANCEL_DISABLE.<.li> + +
Any pending thread cancelation may occur at the time that the +cancelation state is set to PTHREAD_CANCEL_ENABLE.
+ +Input Parameters: ++
+Returned Values: +
+If successful, the pthread_setcancelstate() function will return +zero (OK). Otherwise, an error number will be returned to indicate the error: +
+
+POSIX Compatibility: Comparable to the POSIX +interface of the same name. + +
+Function Prototype: +
+
+ #include <pthread.h> + int pthread_setcancelstate(int state, int *oldstate); ++
+Description: +
+Input Parameters: +
+
+Returned Values: +
+If successful, the xxx() function will return +zero (OK). Otherwise, an error number will be +returned to indicate the error: +
+
+POSIX Compatibility: Comparable to the POSIX +interface of the same name. + +
+Function Prototype: +
+
+ #include <pthread.h> + int pthread_join(pthread_t thread, pthread_addr_t *ppvValue); ++
+Description: +A thread can await termination of another thread and retrieve +the return value of the thread. +
+Input Parameters: +
+
+Returned Values: +
+If successful, the xxx() function will return +zero (OK). Otherwise, an error number will be +returned to indicate the error: +
+
+POSIX Compatibility: Comparable to the POSIX +interface of the same name. + +
+Function Prototype: +
+
+ #include <pthread.h> + void pthread_yield(void); ++
+Description: +A thread may tell the scheduler that its processor can be +made available. +
+Input Parameters: +
+
+Returned Values: +
+If successful, the xxx() function will return +zero (OK). Otherwise, an error number will be +returned to indicate the error: +
+
+POSIX Compatibility: Comparable to the POSIX +interface of the same name. + +
+Function Prototype: +
+
+ #include <pthread.h> + pthread_t pthread_self(void); ++
+Description: +A thread may obtain a copy of its own thread handle. +
+Input Parameters: +
+
+Returned Values: +
+If successful, the xxx() function will return +zero (OK). Otherwise, an error number will be +returned to indicate the error: +
+
+POSIX Compatibility: Comparable to the POSIX +interface of the same name. + +
+Function Prototype: +
+
+ #include <pthread.h> + int pthread_getschedparam(pthread_t thread, int *policy, + struct sched_param *param); ++
+Description: +
+Input Parameters: +
+
+Returned Values: +
+If successful, the xxx() function will return +zero (OK). Otherwise, an error number will be +returned to indicate the error: +
+
+POSIX Compatibility: Comparable to the POSIX +interface of the same name. + +
+Function Prototype: +
+
+ #include <pthread.h> + int pthread_setschedparam(pthread_t thread, int policy, + const struct sched_param *param); ++
+Description: +
+Input Parameters: +
+
+Returned Values: +
+If successful, the xxx() function will return +zero (OK). Otherwise, an error number will be +returned to indicate the error: +
+
+POSIX Compatibility: Comparable to the POSIX +interface of the same name. + +
+Function Prototype: +
+
+ #include <pthread.h> + int pthread_key_create( pthread_key_t *key, void (*destructor)(void*) ) ++
+Description: +
+This function creates a thread-specific data key visible +to all threads in the system. Although the same key value +may be used by different threads, the values bound to +the key by pthread_setspecific() are maintained on a +per-thread basis and persist for the life of the calling +thread. +
+Upon key creation, the value NULL will be associated with +the the new key in all active threads. Upon thread +creation, the value NULL will be associated with all +defined keys in the new thread. +
+Input Parameters: +
+
+Returned Values: +
+If successful, the pthread_key_create() function will +store the newly created key value at *key and return +zero (OK). Otherwise, an error number will be +returned to indicate the error: +
+
+POSIX Compatibility: Comparable to the POSIX +interface of the same name. +
+Function Prototype: +
+
+ #include <pthread.h> + int pthread_setspecific( pthread_key_t key, void *value ) ++
+Description: +
+The pthread_setspecific() function associates a thread- +specific value with a key obtained via a previous call +to pthread_key_create(). Different threads may bind +different values to the same key. These values are +typically pointers to blocks of dynamically allocated +memory that have been reserved for use by the calling +thread. +
+The effect of calling pthread_setspecific() with a key value +not obtained from pthread_key_create() or after a key has been +deleted with pthread_key_delete() is undefined. +
+Input Parameters: +
+
+Returned Values: +
+If successful, pthread_setspecific() will return zero (OK). +Otherwise, an error number will be returned: +
+
+Assumptions/Limitations: +
+POSIX Compatibility: Comparable to the POSIX +interface of the same name. +
+Function Prototype: +
+
+ #include <pthread.h> + void *pthread_getspecific( pthread_key_t key ) ++
+Description: +
+The pthread_getspecific() function returns the value +currently bound to the specified key on behalf of the +calling thread. +
+The effect of calling pthread_getspecific() with a key value +not obtained from pthread_key_create() or after a key has been +deleted with pthread_key_delete() is undefined. +
+Input Parameters: +
+
+Returned Values: +
+The function pthread_getspecific() returns the thread- +specific data associated with the given key. If no +thread specific data is associated with the key, then +the value NULL is returned. +
+Assumptions/Limitations: +
+POSIX Compatibility: Comparable to the POSIX +interface of the same name. +
+Function Prototype: +
+
+ #include <pthread.h> + int pthread_key_delete( pthread_key_t key ) ++
+Description: +
+This POSIX function should delete a thread-specific data +key previously returned by pthread_key_create(). However, +this function does nothing in the present implementation. +
+Input Parameters: +
+
+Returned Values: +
+
+Assumptions/Limitations: +
+POSIX Compatibility: Comparable to the POSIX +interface of the same name. + +
+Function Prototype: +
+
+ #include <pthread.h> + int pthread_mutexattr_init(pthread_mutexattr_t *attr); ++
+Description: +
+Input Parameters: +
+
+Returned Values: +
+If successful, the xxx() function will return +zero (OK). Otherwise, an error number will be +returned to indicate the error: +
+
+POSIX Compatibility: Comparable to the POSIX +interface of the same name. + +
+Function Protoype: +
+
+ #include <pthread.h> + int pthread_mutexattr_destroy(pthread_mutexattr_t *attr); ++
+Description: +
+Input Parameters: +
+
+Returned Values: +
+If successful, the xxx() function will return +zero (OK). Otherwise, an error number will be +returned to indicate the error: +
+
+POSIX Compatibility: Comparable to the POSIX +interface of the same name. + +
+Function Prototype: +
+
+ #include <pthread.h> + int pthread_mutexattr_getpshared(pthread_mutexattr_t *attr, + int *pshared); ++
+Description: +
+Input Parameters: +
+
+Returned Values: +
+If successful, the xxx() function will return +zero (OK). Otherwise, an error number will be +returned to indicate the error: +
+
+POSIX Compatibility: Comparable to the POSIX +interface of the same name. + +
+Function Prototype: +
+
+ #include <pthread.h> + int pthread_mutexattr_setpshared(pthread_mutexattr_t *attr, + int pshared); ++
+Description: +
+Input Parameters: +
+
+Returned Values: +
+If successful, the xxx() function will return +zero (OK). Otherwise, an error number will be +returned to indicate the error: +
+
+POSIX Compatibility: Comparable to the POSIX +interface of the same name. + +
+Function Prototype: +
+
+ #include <pthread.h> + int pthread_mutex_init(pthread_mutex_t *mutex, + pthread_mutexattr_t *attr); ++
+Description: +
+Input Parameters: +
+
+Returned Values: +
+If successful, the xxx() function will return +zero (OK). Otherwise, an error number will be +returned to indicate the error: +
+
+POSIX Compatibility: Comparable to the POSIX +interface of the same name. + +
+Function Prototype: +
+
+ #include <pthread.h> + int pthread_mutex_destroy(pthread_mutex_t *mutex); ++
+Description: +
+Input Parameters: +
+
+Returned Values: +
+If successful, the xxx() function will return +zero (OK). Otherwise, an error number will be +returned to indicate the error: +
+
+POSIX Compatibility: Comparable to the POSIX +interface of the same name. + +
+Function Prototype: +
+
+ #include <pthread.h> + int pthread_mutex_lock(pthread_mutex_t *mutex); ++
+Description: +
+Input Parameters: +
+
+Returned Values: +
+If successful, the xxx() function will return +zero (OK). Otherwise, an error number will be +returned to indicate the error: +
+
+POSIX Compatibility: Comparable to the POSIX +interface of the same name. + +
+Function Prototype: +
+
+ #include <pthread.h> + int pthread_mutex_trylock(pthread_mutex_t *mutex); ++
+Description: +
+Input Parameters: +
+
+Returned Values: +
+If successful, the xxx() function will return +zero (OK). Otherwise, an error number will be +returned to indicate the error: +
+
+POSIX Compatibility: Comparable to the POSIX +interface of the same name. + +
+Function Prototype: +
+
+ #include <pthread.h> + int pthread_mutex_unlock(pthread_mutex_t *mutex); ++
+Description: +
+Input Parameters: +
+
+Returned Values: +
+If successful, the xxx() function will return +zero (OK). Otherwise, an error number will be +returned to indicate the error: +
+
+POSIX Compatibility: Comparable to the POSIX +interface of the same name. + +
+Function Prototype: +
+
+ #include <pthread.h> + int pthread_condattr_init(pthread_condattr_t *attr); ++
+Description: +
+Input Parameters: +
+
+Returned Values: +
+If successful, the xxx() function will return +zero (OK). Otherwise, an error number will be +returned to indicate the error: +
+
+POSIX Compatibility: Comparable to the POSIX +interface of the same name. + +
+Function Prototype: +
+
+ #include <pthread.h> + int pthread_condattr_destroy(pthread_condattr_t *attr); ++
+Description: +
+Input Parameters: +
+
+Returned Values: +
+If successful, the xxx() function will return +zero (OK). Otherwise, an error number will be +returned to indicate the error: +
+
+POSIX Compatibility: Comparable to the POSIX +interface of the same name. + +
+Function Prototype: +
+
+ #include <pthread.h> + int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *attr); ++
+Description: +
+Input Parameters: +
+
+Returned Values: +
+If successful, the xxx() function will return +zero (OK). Otherwise, an error number will be +returned to indicate the error: +
+
+POSIX Compatibility: Comparable to the POSIX +interface of the same name. + +
+Function Prototype: +
+
+ #include <pthread.h> + int pthread_cond_destroy(pthread_cond_t *cond); ++
+Description: +
+Input Parameters: +
+
+Returned Values: +
+If successful, the xxx() function will return +zero (OK). Otherwise, an error number will be +returned to indicate the error: +
+
+POSIX Compatibility: Comparable to the POSIX +interface of the same name. + +
+Function Prototype: +
+
+ #include <pthread.h> + int pthread_cond_broadcast(pthread_cond_t *cond); ++
+Description: +
+Input Parameters: +
+
+Returned Values: +
+If successful, the xxx() function will return +zero (OK). Otherwise, an error number will be +returned to indicate the error: +
+
+POSIX Compatibility: Comparable to the POSIX +interface of the same name. + +
+Function Prototype: +
+
+ #include <pthread.h> + int pthread_cond_signal(pthread_cond_t *dond); ++
+Description: +
+Input Parameters: +
+
+Returned Values: +
+If successful, the xxx() function will return +zero (OK). Otherwise, an error number will be +returned to indicate the error: +
+
+POSIX Compatibility: Comparable to the POSIX +interface of the same name. + +
+Function Prototype: +
+
+ #include <pthread.h> + int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex); ++
+Description: +
+Input Parameters: +
+
+Returned Values: +
+If successful, the xxx() function will return +zero (OK). Otherwise, an error number will be +returned to indicate the error: +
+
+POSIX Compatibility: Comparable to the POSIX +interface of the same name. + +
+Function Prototype: +
+
+ #include <pthread.h> + int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, + const struct timespec *abstime); ++
+Description: +
+Input Parameters: +
+
+Returned Values: +
+If successful, the xxx() function will return +zero (OK). Otherwise, an error number will be +returned to indicate the error: +
+
+POSIX Compatibility: Comparable to the POSIX +interface of the same name. + +
+
+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: +
+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: +
+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. +
+ +
+A pointer to the thread-specific errno. value is available through a +function call: +
+Function Prototype: +
+
int *get_errno_ptr( void )+
+Description: osGetErrnorPtr() returns a pointer to +the thread-specific errno value. +
+This differs somewhat from the use for errno in a multi-threaded process environment: +Each pthread will have its own private copy of errno and the errno will not be shared +between pthreads. +
+Input Parameters: None +
+Returned Values: +
+
+ +
+
+main_t defines the type of a task entry point. main_t is declared +in sys/types.h as: +
+ typedef int (*main_t)(int argc, char *argv[]); ++ +
+This structure is used to pass scheduling priorities to and from +Nuttx; +
+ struct sched_param
+ {
+ int sched_priority;
+ };
+
+
++This structure is used to pass timing information between the +Nuttx and a user application: +
+ struct timespec
+ {
+ time_t tv_sec; /* Seconds */
+ long tv_nsec; /* Nanoseconds */
+ };
+
+
++This structure is used to communicate message queue attributes +between Nuttx and a MoBY application: +
+ 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 */
+ };
+
+
++The following structure defines the action to take for given signal: +
+ struct sigaction {
+ union {
+ saHandType *_sa_handler;
+ saVxHandType *_sa_sigaction;
+ } sa_u;
+ sigset_t sa_mask;
+ int sa_flags;
+ };
+ #define sa_handler sa_u._sa_handler
+ #define sa_sigaction sa_u._sa_sigaction
+
+
++where: +
+ typedef void saHandType( int signo ); + typedef void saVxHandType( int signo, siginfo_t *info, void *context ); ++ +
+The following types is used to pass parameters to/from signal +handlers: +
+ typedef struct siginfo
+ {
+ int si_signo;
+ int si_code;
+ union sigval si_value;
+ } siginfo_t;
+
+
++This defines the type of the struct siginfo si_value field and +is used to pass parameters with signals. +
+ union sigval
+ {
+ int sival_int;
+ void *sival_ptr;
+ };
+
+
++The following is used to attach a signal to a message queue to +notify a task when a message is available on a queue. +
+ struct sigevent
+ {
+ int sigev_signo;
+ union sigval sigev_value;
+ int sigev_notify;
+ };
+
++This section documents know problems with Nuttx at the time +of this writing. +
+
+Priority: LOW. If a task is blocked a waiting for a message +queue to become non-empty, it will be re-started anyway. +
+Priority: LOW. + + +