blob: 39926e5961672b7dc90f74c11c1ec6dea7b31e32 [file] [log] [blame]
<!--
Documentation/_templates/layout.html
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership. The
ASF licenses this file to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance with the
License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
License for the specific language governing permissions and limitations
under the License.
-->
<!DOCTYPE html>
<html class="writer-html5" lang="en" >
<head>
<meta charset="utf-8" /><meta name="generator" content="Docutils 0.18.1: http://docutils.sourceforge.net/" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Architecture-Specific Code &mdash; NuttX latest documentation</title>
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="../../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../_static/copybutton.css" type="text/css" />
<link rel="stylesheet" href="../../_static/tabs.css" type="text/css" />
<link rel="stylesheet" href="../../_static/custom.css" type="text/css" />
<link rel="shortcut icon" href="../../_static/favicon.ico"/>
<!--[if lt IE 9]>
<script src="../../_static/js/html5shiv.min.js"></script>
<![endif]-->
<script src="../../_static/jquery.js"></script>
<script src="../../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script data-url_root="../../" id="documentation_options" src="../../_static/documentation_options.js"></script>
<script src="../../_static/doctools.js"></script>
<script src="../../_static/sphinx_highlight.js"></script>
<script src="../../_static/clipboard.min.js"></script>
<script src="../../_static/copybutton.js"></script>
<script src="../../_static/js/theme.js"></script>
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
<link rel="next" title="Boards Support" href="../boards.html" />
<link rel="prev" title="/tools Host Tools" href="../tools/index.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="../../index.html" class="icon icon-home"> NuttX
</a>
<!-- this version selector is quite ugly, should be probably replaced by something
more modern -->
<div class="version-selector">
<select onchange="javascript:location.href = this.value;">
<option value="../../../latest" selected="selected">latest</option>
<option value="../../../10.0.0" >10.0.0</option>
<option value="../../../10.0.1" >10.0.1</option>
<option value="../../../10.1.0" >10.1.0</option>
<option value="../../../10.2.0" >10.2.0</option>
<option value="../../../10.3.0" >10.3.0</option>
<option value="../../../11.0.0" >11.0.0</option>
<option value="../../../12.0.0" >12.0.0</option>
<option value="../../../12.1.0" >12.1.0</option>
<option value="../../../12.2.0" >12.2.0</option>
<option value="../../../12.2.1" >12.2.1</option>
<option value="../../../12.3.0" >12.3.0</option>
<option value="../../../12.4.0" >12.4.0</option>
<option value="../../../12.5.0" >12.5.0</option>
<option value="../../../12.5.1" >12.5.1</option>
</select>
</div>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" aria-label="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
<p class="caption" role="heading"><span class="caption-text">Table of Contents</span></p>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../../index.html">Home</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../introduction/index.html">Introduction</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../quickstart/index.html">Getting Started</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../contributing/index.html">Contributing</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../introduction/inviolables.html">The Inviolable Principles of NuttX</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../platforms/index.html">Supported Platforms</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="../index.html">OS Components</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="../binfmt.html">Binary Loader</a></li>
<li class="toctree-l2"><a class="reference internal" href="../drivers/index.html">Device Drivers</a></li>
<li class="toctree-l2"><a class="reference internal" href="../nxflat.html">NXFLAT</a></li>
<li class="toctree-l2"><a class="reference internal" href="../nxgraphics/index.html">NX Graphics Subsystem</a></li>
<li class="toctree-l2"><a class="reference internal" href="../paging.html">On-Demand Paging</a></li>
<li class="toctree-l2"><a class="reference internal" href="../audio/index.html">Audio Subsystem</a></li>
<li class="toctree-l2"><a class="reference internal" href="../filesystem/index.html">NuttX File System</a></li>
<li class="toctree-l2"><a class="reference internal" href="../libs/index.html">NuttX libraries</a></li>
<li class="toctree-l2"><a class="reference internal" href="../net/index.html">Network Support</a></li>
<li class="toctree-l2"><a class="reference internal" href="../mm/index.html">Memory Management</a></li>
<li class="toctree-l2"><a class="reference internal" href="../syscall.html">Syscall Layer</a></li>
<li class="toctree-l2"><a class="reference internal" href="../tools/index.html"><code class="docutils literal notranslate"><span class="pre">/tools</span></code> Host Tools</a></li>
<li class="toctree-l2 current"><a class="current reference internal" href="#">Architecture-Specific Code</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#directory-structure-in-arch">Directory Structure in <code class="docutils literal notranslate"><span class="pre">arch/</span></code></a></li>
<li class="toctree-l3"><a class="reference internal" href="#summary-of-files">Summary of Files</a></li>
<li class="toctree-l3"><a class="reference internal" href="#supported-architectures">Supported Architectures</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../boards.html">Boards Support</a></li>
<li class="toctree-l2"><a class="reference internal" href="../cmake.html">CMake Support</a></li>
<li class="toctree-l2"><a class="reference internal" href="../openamp.html">OpenAMP Support</a></li>
<li class="toctree-l2"><a class="reference internal" href="../video.html">Video Subsystem</a></li>
<li class="toctree-l2"><a class="reference internal" href="../crypto.html">Crypto API Subsystem</a></li>
<li class="toctree-l2"><a class="reference internal" href="../wireless.html">Wireless Subsystem</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../../applications/index.html">Applications</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../implementation/index.html">Implementation Details</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../reference/index.html">API Reference</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../faq/index.html">FAQ</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/index.html">Guides</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../glossary.html">Glossary</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" >
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../../index.html">NuttX</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="Page navigation">
<ul class="wy-breadcrumbs">
<li><a href="../../index.html" class="icon icon-home" aria-label="Home"></a></li>
<li class="breadcrumb-item"><a href="../index.html">OS Components</a></li>
<li class="breadcrumb-item active">Architecture-Specific Code</li>
<li class="wy-breadcrumbs-aside">
<a href="../../_sources/components/arch/index.rst.txt" rel="nofollow"> View page source</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<section id="architecture-specific-code">
<h1>Architecture-Specific Code<a class="headerlink" href="#architecture-specific-code" title="Permalink to this heading"></a></h1>
<p>The NuttX configuration consists of:</p>
<ul>
<li><p>Processor architecture specific files. These are the files contained
in the <code class="docutils literal notranslate"><span class="pre">arch/&lt;arch-name&gt;/</span></code> directory discussed in this file.</p></li>
<li><p>Chip/SoC specific files. Each processor architecture is embedded in
chip or System-on-a-Chip (SoC) architecture. The full chip
architecture includes the processor architecture plus chip-specific
interrupt logic, general purpose I/O (GPIO) logic, and specialized,
internal peripherals (such as UARTs, USB, etc.).</p>
<p>These chip-specific files are contained within chip-specific
sub-directories in the <code class="docutils literal notranslate"><span class="pre">arch/&lt;arch-name&gt;/</span></code> directory and are selected
via the CONFIG_ARCH_name selection</p>
</li>
<li><p>Board specific files. In order to be usable, the chip must be
contained in a board environment. The board configuration defines
additional properties of the board including such things as peripheral
LEDs, external peripherals (such as network, USB, etc.).</p>
<p>These board-specific configuration files can be found in the
<code class="docutils literal notranslate"><span class="pre">boards/&lt;arch&gt;/&lt;chip&gt;/&lt;board&gt;</span></code> sub-directories.</p>
</li>
</ul>
<p>This file will address the processor architecture specific files that
are contained in the <code class="docutils literal notranslate"><span class="pre">arch/&lt;arch-name&gt;/</span></code> directory. The file
include/nuttx/arch.h identifies all of the APIs that must be provided by
this architecture specific logic. (It also includes
<code class="docutils literal notranslate"><span class="pre">arch/&lt;arch-name&gt;/arch.h</span></code> as described below).</p>
<section id="directory-structure-in-arch">
<h2>Directory Structure in <code class="docutils literal notranslate"><span class="pre">arch/</span></code><a class="headerlink" href="#directory-structure-in-arch" title="Permalink to this heading"></a></h2>
<p>The <code class="docutils literal notranslate"><span class="pre">arch/</span></code> directory contains architecture-specific logic. The complete
board port is defined by the architecture-specific code in this
directory plus the board-specific configurations in the <code class="docutils literal notranslate"><span class="pre">boards/</span></code>
directory. Each architecture must provide a subdirectory &lt;arch-name&gt;
under <code class="docutils literal notranslate"><span class="pre">arch/</span></code> with the following characteristics:</p>
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>&lt;arch-name&gt;/
|-- include/
| |--&lt;chip-name&gt;/
| | `-- (chip-specific header files)
| |--&lt;other-chips&gt;/
| |-- arch.h
| |-- irq.h
| |-- syscall.h
| `-- types.h
`-- src/
|--&lt;chip-name&gt;/
| `-- (chip-specific source files)
|--&lt;other-chips&gt;/
|-- Makefile
`-- (architecture-specific source files)
</pre></div>
</div>
</section>
<section id="summary-of-files">
<h2>Summary of Files<a class="headerlink" href="#summary-of-files" title="Permalink to this heading"></a></h2>
<p><code class="docutils literal notranslate"><span class="pre">include/&lt;chip-name&gt;/</span></code></p>
<blockquote>
<div><p>This sub-directory contains chip-specific header files.</p>
</div></blockquote>
<p><code class="docutils literal notranslate"><span class="pre">include/arch.h</span></code></p>
<blockquote>
<div><p>This is a hook for any architecture specific definitions that may be
needed by the system. It is included by <code class="docutils literal notranslate"><span class="pre">include/nuttx/arch.h</span></code></p>
</div></blockquote>
<p><code class="docutils literal notranslate"><span class="pre">include/types.h</span></code></p>
<blockquote>
<div><p>This provides architecture/toolchain-specific definitions for standard
types. This file should typedef: <code class="docutils literal notranslate"><span class="pre">_int8_t</span></code>, <code class="docutils literal notranslate"><span class="pre">_uint8_t</span></code>, <code class="docutils literal notranslate"><span class="pre">_int16_t</span></code>,
<code class="docutils literal notranslate"><span class="pre">_uint16_t</span></code>, <code class="docutils literal notranslate"><span class="pre">_int32_t</span></code>, <code class="docutils literal notranslate"><span class="pre">_uint32_t</span></code></p>
<p>and if the architecture supports 64-bit integers: <code class="docutils literal notranslate"><span class="pre">_int24_t</span></code>, <code class="docutils literal notranslate"><span class="pre">_uint24_t</span></code>,
<code class="docutils literal notranslate"><span class="pre">_int64_t</span></code>, <code class="docutils literal notranslate"><span class="pre">_uint64_t</span></code></p>
<p>NOTE that these type names have a leading underscore character. This
file will be included (indirectly) by <code class="docutils literal notranslate"><span class="pre">include/stdint.h</span></code> and typedef’ed
to the final name without the underscore character. This roundabout
way of doings things allows the stdint.h to be removed from the
<code class="docutils literal notranslate"><span class="pre">include/</span></code> directory in the event that the user prefers to use the
definitions provided by their toolchain header files.</p>
</div></blockquote>
<p><code class="docutils literal notranslate"><span class="pre">irqstate_t</span></code></p>
<blockquote>
<div><p>Must be defined to the size required to hold the interrupt
enable/disable state.</p>
<p>This file will be included by <code class="docutils literal notranslate"><span class="pre">include/sys/types.h</span></code> and be made
available to all files.</p>
</div></blockquote>
<p><code class="docutils literal notranslate"><span class="pre">include/irq.h</span></code></p>
<blockquote>
<div><p>This file needs to define some architecture-specific functions
(usually inline if the compiler supports inlining) and structures.
These include:</p>
</div></blockquote>
<p><code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">xcptcontext</span></code></p>
<blockquote>
<div><p>This structure represents the saved context ofa thread.</p>
</div></blockquote>
<p><code class="docutils literal notranslate"><span class="pre">irqstate_t</span> <span class="pre">up_irq_save(void)</span></code></p>
<blockquote>
<div><p>Used to disable all interrupts.</p>
</div></blockquote>
<p><code class="docutils literal notranslate"><span class="pre">void</span> <span class="pre">up_irq_restore(irqstate_t</span> <span class="pre">flags)</span></code></p>
<blockquote>
<div><p>Used to restore interrupt enables to the same state as before <code class="docutils literal notranslate"><span class="pre">up_irq_save</span></code>
was called.</p>
<p>NOTE: These interfaces are not available to application code but can
only be used within the operating system code. And, in general, these
functions should <strong>never</strong> be called directly, not unless you know
absolutely well what you are doing. Rather you should typically use
the wrapper functions <code class="docutils literal notranslate"><span class="pre">enter_critical_section()</span></code> and
<code class="docutils literal notranslate"><span class="pre">leave_critical_section()</span></code> as prototyped in <code class="docutils literal notranslate"><span class="pre">include/nuttx/irq.h</span></code>.</p>
<p>This file must also define NR_IRQS, the total number of IRQs supported
by the board.</p>
</div></blockquote>
<ul>
<li><p><code class="docutils literal notranslate"><span class="pre">include/syscall.h</span></code>: This file needs to define some
architecture specific functions (usually inline if the compiler
supports inlining) to support software interrupts or
<em>syscall</em>s that can be used all from user-mode applications
into kernel-mode NuttX functions. This file must always be
provided to prevent compilation errors. However, it need only
contain valid function declarations if the architecture
supports the <code class="docutils literal notranslate"><span class="pre">CONFIG_BUILD_PROTECTED</span></code> or
<code class="docutils literal notranslate"><span class="pre">CONFIG_BUILD_KERNEL</span></code>configurations.</p>
<p>See <a class="reference internal" href="../syscall.html"><span class="doc">Syscall Layer</span></a> for details.</p>
</li>
</ul>
<p><code class="docutils literal notranslate"><span class="pre">src/&lt;chip-name&gt;/</span></code></p>
<blockquote>
<div><p>This sub-directory contains chip-specific source files.</p>
</div></blockquote>
<p><code class="docutils literal notranslate"><span class="pre">src/Makefile</span></code></p>
<blockquote>
<div><p>This makefile will be executed to build the targets src/libup.a and
src/up_head.o. The up_head.o file holds the entry point into the
system (power-on reset entry point, for example). It will be used in
the final link with libup.a and other system archives to generate the
final executable.</p>
</div></blockquote>
</section>
<section id="supported-architectures">
<h2>Supported Architectures<a class="headerlink" href="#supported-architectures" title="Permalink to this heading"></a></h2>
<p>The list of supported architectures can be found in <a class="reference internal" href="../../platforms/index.html#platforms"><span class="std std-ref">Supported Platforms</span></a>.</p>
</section>
</section>
</div>
</div>
<footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
<a href="../tools/index.html" class="btn btn-neutral float-left" title="/tools Host Tools" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
<a href="../boards.html" class="btn btn-neutral float-right" title="Boards Support" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
</div>
<hr/>
<div role="contentinfo">
<p>&#169; Copyright 2023, The Apache Software Foundation.</p>
</div>
</footer>
</div>
</div>
</section>
</div>
<script>
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>