mirror of
https://github.com/apache/nuttx.git
synced 2026-10-11 00:00:24 +00:00
The documentation grew one page at a time, so the tree follows the
history of who wrote what and not the shape of NuttX. Scheduling is
spread over three places, a driver page can sit above the subsystem
that owns it, and the front page lists everything at the same level.
That is a lot to face when all you want to know is where the scheduler
lives.
This change files every page under the code it describes. It is a move,
not a rewrite: outside the ten pages named below, every page keeps the
text that is already in master, and no page's text is deleted.
What it does:
* Groups the table of contents into nine chapters.
* Moves the OS subsystems under os/: scheduling, memory, drivers,
filesystem, networking, IPC, interrupts, libs, time.
* Renames the platform pages to the names the source tree uses, and
derives their tags from the tree instead of by hand.
* Splits guides/ by subject.
* Adds Documentation/redirects.py, with a rule for every page that left
its old path, so old URLs keep working. The redirect page also carries
a link's #anchor across to the new page.
Ten pages have text that is new or rewritten. Nine of them are the
landing page of a chapter, which has to exist for the new structure:
index the front page
os/index OS Design
os/scheduling/index Scheduling
os/interrupts/index Interrupts
os/ipc/index IPC
os/time/index Time and timers
about/index About
developing/index Developing NuttX
ReleaseNotes/index Release notes
The tenth is os/libs/libbuiltin, the only page here with technical
content: libs/libbuiltin/ had no page at all. Five SVG diagrams come
with these pages, hand-written XML with no editor metadata.
Nothing outside Documentation/ is touched.
How it was checked:
* Sphinx builds with -W: no warnings, and no document left outside a
toctree.
* A script, offered in the PR, proves the narrow claim this rests on.
For every page outside the ten named above it erases what a move
touches -- link target, path, tag line, toctree block, table border --
from the whole old text and the whole new text, and requires the two
to be byte for byte identical. It also requires every sentence of a
deleted page to turn up somewhere, and every page that left its old
path to have a redirect, from a URL that existed, to where its content
went. It exits non-zero and names the page if any of that is not true,
and it tests added pages too, so forgetting to declare one cannot make
it pass.
* An independent audit checked 133 factual claims on these ten pages
against the tree, one shell command per claim: 130 confirmed, 1
refuted and fixed here, 2 not checkable.
* tools/checkpatch.sh is clean over the range.
The diff is large because moving a page changes every link that points
to it. Most of it is pure renames, and board pages that gained one tag
line.
Assisted-by: Claude:claude-opus-5
96 lines
4.6 KiB
ReStructuredText
96 lines
4.6 KiB
ReStructuredText
=========================================
|
|
Application OS vs. Internal OS Interfaces
|
|
=========================================
|
|
|
|
NuttX provides a standard, portable OS interface for use by
|
|
applications. This standard interface is controlled by the
|
|
specifications proved at `OpenGroup.org <http://opengroup.org>`__.
|
|
These application interfaces, in general, should not be used
|
|
directly by logic executing within the OS. The reason for this is
|
|
that there are certain properties of the standard application
|
|
interfaces that make them unsuitable for use within the OS These
|
|
properties include:
|
|
|
|
#. **Use of the per-thread** ``errno`` **variable**: Handling of
|
|
return values, particularly, in the case of returned error
|
|
indications. Most legacy POSIX OS interface return information
|
|
via a *per-thread* ``errno``. There must be no alteration of
|
|
the ``errno`` value that must be stable from the point of view
|
|
of the application. So, as a general rule, internal OS logic
|
|
must never modify the ``errno`` and particularly not by the
|
|
inappropriate use of application OS interfaces within OS
|
|
itself.
|
|
|
|
Within the OS, functions do not return error information via
|
|
the ``errno`` variable. Instead, the majority of internal OS
|
|
function return error information as an integer value: Returned
|
|
values greater than or equal to zero are success values;
|
|
returned values less than zero indicate failures. Failures are
|
|
reported by returning a negated ``errno`` value from
|
|
``include/errno.h``,
|
|
|
|
#. **Cancellation Points**: Many of the application OS interfaces
|
|
are *cancellation points*, i.e., when the task is operating in
|
|
*deferred cancellation* state, it cannot be deleted or
|
|
cancelled until it calls an application OS interface that is a
|
|
cancellation point.
|
|
|
|
The POSIX specification is very specific about this, specific
|
|
both in identifying which application OS interfaces are
|
|
cancellation points and specific in the fact that it is
|
|
prohibited for any OS operation other than those listed in the
|
|
specification to generate cancellation points. If internal OS
|
|
logic were to reuse application OS interfaces directly then it
|
|
could very easily violate this POSIX requirement by incorrectly
|
|
generating cancellation points on inappropriate OS operations
|
|
and could result in very difficult to analyze application
|
|
failures.
|
|
|
|
#. **Use of per-task Resources**: Many resources are only valid in
|
|
the task group context in which a thread operates. Above we
|
|
mentioned one: ``errno`` is only valid for the thread that is
|
|
currently executing. So, for example, the ``errno`` at the time
|
|
of a call is a completely different variable than, say, the
|
|
``errno`` while running in a work queue task.
|
|
|
|
File descriptors are an even better example: An open file on
|
|
file descriptor 5 on task A is *not* the same open file as
|
|
might be used on file descriptor 5 on task B.
|
|
|
|
As a result, internal OS logic may not use application OS
|
|
interfaces that use file descriptors or any other *per-task*
|
|
resource.
|
|
|
|
Within NuttX, this is handled by supporting equivalent internal OS
|
|
interfaces that do not break the above rules. These internal
|
|
interfaces are intended for use *only* within the OS and should
|
|
not be used by application logic. Some examples include:
|
|
|
|
- ``nxsem_wait()``: functionally
|
|
equivalent to the standard application interface
|
|
``sem_wait()``. However, ``nxsem_wait()`` will not modify the
|
|
errno value and will not cause a cancellation point. (see
|
|
``include/nuttx/semaphore.h`` for other internal OS interfaces
|
|
for semaphores).
|
|
|
|
- ``nxmq_send()``: functionally equivalent
|
|
to the standard application interface ``mq_send()``. However,
|
|
``nxmq_send()`` will not modify the errno value and will not
|
|
cause a cancellation point (see ``include/nuttx/mqueue.h`` for
|
|
other internal OS interfaces for POSIX message queues).
|
|
|
|
- ``file_read()``: functionally equivalent
|
|
to the standard application interface ``read()``. However,
|
|
``file_read()`` will not modify the errno value, will not cause
|
|
a cancellation point, and uses a special internal data
|
|
structure in place of the file descriptor (see
|
|
``include/nuttx/fs/fs.h`` for other internal OS interfaces for
|
|
VFS functions).
|
|
|
|
- ``psock_recvfrom()``: functionally
|
|
equivalent to the standard application interface
|
|
``recvfrom()``. However, ``psock_recvfrom()`` will not modify
|
|
the errno value, will not cause a cancellation point, and uses
|
|
a special internal data structure in place of the socket
|
|
descriptor (see ``include/nuttx/net/net.h`` for other internal
|
|
OS interfaces for sockets).
|