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
74 lines
3.4 KiB
ReStructuredText
74 lines
3.4 KiB
ReStructuredText
==============================================
|
|
APIs Exported by Board-Specific Logic to NuttX
|
|
==============================================
|
|
|
|
Exported board-specific interfaces are prototyped in the header
|
|
file ``include/nuttx/board.h``. There are many interfaces exported
|
|
from board- to architecture-specific logic. But there are only a
|
|
few exported from board-specific logic to common NuttX logic.
|
|
Those few of those related to initialization will be discussed in
|
|
this paragraph. There are others, like those used by
|
|
```boardctl()`` <#boardctl>`__ that will be discussed in other
|
|
paragraphs.
|
|
|
|
All of the board-specific interfaces used by the NuttX OS logic
|
|
are for controlled board initialization. There are three points in
|
|
time where you can insert custom, board-specific initialization
|
|
logic:
|
|
|
|
First, ``<arch>_board_initialize()``: This function is *not*
|
|
called from the common OS logic, but rather from the
|
|
architecture-specific power on reset logic. This is used only for
|
|
initialization of very low-level things like configuration of GPIO
|
|
pins, power settings, DRAM initialization, etc. The OS has not
|
|
been initialized at this point, so you cannot allocate memory or
|
|
initialize device drivers.
|
|
|
|
The other two board initialization *hooks* are called from the OS
|
|
start-up logic and are described in the following paragraphs:
|
|
|
|
.. c:function:: void board_early_initialize(void)
|
|
|
|
The next level of initialization is performed by a call to
|
|
``up_initialize()`` (in
|
|
``arch/<arch>/src/common/up_initialize.c``). The OS has been
|
|
initialized at this point and it is okay to initialize drivers in
|
|
this phase. ``up_initialize()`` is *not* a board-specific
|
|
interface, but rather an architecture-specific, board-independent
|
|
interface.
|
|
|
|
But at this same point in time, the OS will also call a
|
|
board-specific initialization function named
|
|
``board_early_initialize()`` if
|
|
``CONFIG_BOARD_EARLY_INITIALIZE=y`` is selected in the
|
|
configuration. The context in which ``board_early_initialize()``
|
|
executes is suitable for early initialization of most, simple
|
|
device drivers and is a logical, board-specific extension of
|
|
up_initialize().
|
|
|
|
``board_early_initialize()`` runs on the startup, initialization
|
|
thread. Some initialization operations cannot be performed on the
|
|
start-up, initialization thread. That is because the
|
|
initialization thread cannot wait for event. Waiting may be
|
|
required, for example, to mount a file system or or initialize a
|
|
device such as an SD card. For this reason, such driver initialize
|
|
must be deferred to ``board_late_initialize()``.
|
|
|
|
.. c:function:: void board_late_initialize(void)
|
|
|
|
And, finally, just before the user application code starts. If
|
|
``CONFIG_BOARD_LATE_INITIALIZE=y`` is selected in the
|
|
configuration, then an final, additional initialization call will
|
|
be performed in the boot-up sequence to a function called
|
|
``board_late_initialize()``. ``board_late_initialize()`` will be
|
|
called well after ``up_initialize()`` and
|
|
``board_early_initialize()`` are called.
|
|
``board_late_initialize()`` will be called just before the main
|
|
application task is started. This additional initialization phase
|
|
may be used, for example, to initialize more complex,
|
|
board-specific device drivers.
|
|
|
|
Waiting for events, use of I2C, SPI, etc are permissible in the
|
|
context of board_late_initialize(). That is because
|
|
``board_late_initialize()`` will run on a temporary, internal
|
|
kernel thread.
|