You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by gi...@apache.org on 2024/11/11 00:43:45 UTC
(nuttx-website) branch asf-site updated: Publishing web: b0df2aeab6e41e7f7f2ff29ca7dee29d2f62f031 docs: 5e8f1eefb086fd6cb1a59453a4c350d4fd5e734c
This is an automated email from the ASF dual-hosted git repository.
github-bot pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/nuttx-website.git
The following commit(s) were added to refs/heads/asf-site by this push:
new 524564f8a Publishing web: b0df2aeab6e41e7f7f2ff29ca7dee29d2f62f031 docs: 5e8f1eefb086fd6cb1a59453a4c350d4fd5e734c
524564f8a is described below
commit 524564f8adbfe5678e7839d3879564c80259cb21
Author: Alin Jerpelea <al...@sony.com>
AuthorDate: Mon Nov 11 00:26:33 2024 +0000
Publishing web: b0df2aeab6e41e7f7f2ff29ca7dee29d2f62f031 docs: 5e8f1eefb086fd6cb1a59453a4c350d4fd5e734c
---
content/docs/10.0.0/index.html | 2 +-
content/docs/10.0.1/index.html | 2 +-
content/docs/10.1.0/index.html | 2 +-
content/docs/10.2.0/index.html | 2 +-
content/docs/10.3.0/index.html | 2 +-
content/docs/11.0.0/index.html | 2 +-
content/docs/12.0.0/index.html | 2 +-
content/docs/12.0.0/searchindex.js | 2 +-
content/docs/12.1.0/index.html | 2 +-
content/docs/12.1.0/searchindex.js | 2 +-
content/docs/12.2.0/index.html | 2 +-
content/docs/12.2.0/searchindex.js | 2 +-
content/docs/12.2.1/index.html | 2 +-
content/docs/12.2.1/searchindex.js | 2 +-
content/docs/12.3.0/index.html | 2 +-
content/docs/12.3.0/searchindex.js | 2 +-
content/docs/12.4.0/index.html | 2 +-
content/docs/12.4.0/searchindex.js | 2 +-
content/docs/12.5.0/index.html | 2 +-
content/docs/12.5.0/searchindex.js | 2 +-
content/docs/12.5.1/index.html | 2 +-
content/docs/12.5.1/searchindex.js | 2 +-
content/docs/12.6.0/index.html | 2 +-
content/docs/12.6.0/searchindex.js | 2 +-
content/docs/12.7.0/index.html | 2 +-
content/docs/12.7.0/searchindex.js | 2 +-
content/docs/latest/_images/GraphicsInterfaces.png | Bin 0 -> 82985 bytes
.../latest/_images/nxwm_theading_model_page_0.png | Bin 0 -> 314995 bytes
.../latest/_images/nxwm_theading_model_page_1.png | Bin 0 -> 172777 bytes
.../latest/_images/nxwm_theading_model_page_2.png | Bin 0 -> 121021 bytes
.../latest/_images/nxwm_theading_model_page_3.png | Bin 0 -> 157603 bytes
.../latest/_images/nxwm_theading_model_page_4.png | Bin 0 -> 252166 bytes
.../components/net/delay_act_and_tcp_perf.rst.txt | 195 +++++++
.../latest/_sources/components/net/index.rst.txt | 2 +
.../components/net/tcp_network_perf.rst.txt | 193 +++++++
.../nxgraphics/framebuffer_char_driver.rst.txt | 383 +++++++++++++
.../_sources/components/nxgraphics/index.rst.txt | 2 +
.../components/nxgraphics/nxwm_threading.rst.txt | 13 +
content/docs/latest/components/index.html | 2 +
content/docs/latest/components/mm/index.html | 4 +-
.../components/net/delay_act_and_tcp_perf.html | 412 ++++++++++++++
content/docs/latest/components/net/index.html | 4 +
content/docs/latest/components/net/ipfilter.html | 2 +
content/docs/latest/components/net/nat.html | 2 +
content/docs/latest/components/net/netdev.html | 2 +
content/docs/latest/components/net/netdriver.html | 2 +
.../docs/latest/components/net/netguardsize.html | 2 +
content/docs/latest/components/net/netlink.html | 2 +
content/docs/latest/components/net/pkt.html | 2 +
content/docs/latest/components/net/sixlowpan.html | 2 +
content/docs/latest/components/net/slip.html | 2 +
content/docs/latest/components/net/socketcan.html | 2 +
.../latest/components/net/tcp_network_perf.html | 405 ++++++++++++++
.../latest/components/net/wqueuedeadlocks.html | 6 +-
.../latest/components/nxgraphics/appendix.html | 2 +
.../nxgraphics/framebuffer_char_driver.html | 590 +++++++++++++++++++++
.../docs/latest/components/nxgraphics/index.html | 15 +
content/docs/latest/components/nxgraphics/nx.html | 2 +
.../latest/components/nxgraphics/nxcursor.html | 6 +-
.../docs/latest/components/nxgraphics/nxfonts.html | 2 +
.../docs/latest/components/nxgraphics/nxgl.html | 2 +
.../docs/latest/components/nxgraphics/nxtk.html | 2 +
.../{sample.html => nxwm_threading.html} | 51 +-
.../docs/latest/components/nxgraphics/sample.html | 6 +-
content/docs/latest/index.html | 2 +-
content/docs/latest/objects.inv | Bin 128587 -> 129331 bytes
content/docs/latest/searchindex.js | 2 +-
content/feed.xml | 4 +-
68 files changed, 2310 insertions(+), 69 deletions(-)
diff --git a/content/docs/10.0.0/index.html b/content/docs/10.0.0/index.html
index d194dba2f..e4663b6b6 100644
--- a/content/docs/10.0.0/index.html
+++ b/content/docs/10.0.0/index.html
@@ -207,7 +207,7 @@ by following these <a class="reference internal" href="contributing/documentatio
<div class="section" id="nuttx-documentation">
<h1>NuttX Documentation<a class="headerlink" href="#nuttx-documentation" title="Permalink to this headline">¶</a></h1>
<p>NuttX is a real-time operating system (RTOS) with an emphasis on standards compliance and small footprint. Scalable from 8-bit to 32-bit microcontroller environments, the primary governing standards in NuttX are Posix and ANSI standards. Additional standard APIs from Unix and other common RTOS’s (such as VxWorks) are adopted for functionality not available under these standards, or for functionality that is not appropriate for deeply-embedded environments (such as fork()).</p>
-<p>Last Updated: 10 November 24 at 00:13</p>
+<p>Last Updated: 11 November 24 at 00:13</p>
<div class="toctree-wrapper compound">
<p class="caption"><span class="caption-text">Table of Contents</span></p>
<ul class="current">
diff --git a/content/docs/10.0.1/index.html b/content/docs/10.0.1/index.html
index dd9be4233..b1d4adeb4 100644
--- a/content/docs/10.0.1/index.html
+++ b/content/docs/10.0.1/index.html
@@ -239,7 +239,7 @@ by following these <a class="reference internal" href="contributing/documentatio
<div class="section" id="nuttx-documentation">
<h1>NuttX Documentation<a class="headerlink" href="#nuttx-documentation" title="Permalink to this headline">¶</a></h1>
<p>NuttX is a real-time operating system (RTOS) with an emphasis on standards compliance and small footprint. Scalable from 8-bit to 32-bit microcontroller environments, the primary governing standards in NuttX are Posix and ANSI standards. Additional standard APIs from Unix and other common RTOS’s (such as VxWorks) are adopted for functionality not available under these standards, or for functionality that is not appropriate for deeply-embedded environments (such as fork()).</p>
-<p>Last Updated: 10 November 24 at 00:13</p>
+<p>Last Updated: 11 November 24 at 00:13</p>
<div class="toctree-wrapper compound">
<p class="caption"><span class="caption-text">Table of Contents</span></p>
<ul class="current">
diff --git a/content/docs/10.1.0/index.html b/content/docs/10.1.0/index.html
index 03d32dc64..5023a5b48 100644
--- a/content/docs/10.1.0/index.html
+++ b/content/docs/10.1.0/index.html
@@ -239,7 +239,7 @@ by following these <a class="reference internal" href="contributing/documentatio
<div class="section" id="nuttx-documentation">
<h1>NuttX Documentation<a class="headerlink" href="#nuttx-documentation" title="Permalink to this headline">¶</a></h1>
<p>NuttX is a real-time operating system (RTOS) with an emphasis on standards compliance and small footprint. Scalable from 8-bit to 64-bit microcontroller environments, the primary governing standards in NuttX are POSIX and ANSI standards. Additional standard APIs from Unix and other common RTOS’s (such as VxWorks) are adopted for functionality not available under these standards, or for functionality that is not appropriate for deeply-embedded environments (such as fork()).</p>
-<p>Last Updated: 10 November 24 at 00:14</p>
+<p>Last Updated: 11 November 24 at 00:13</p>
<div class="toctree-wrapper compound">
<p class="caption"><span class="caption-text">Table of Contents</span></p>
<ul class="current">
diff --git a/content/docs/10.2.0/index.html b/content/docs/10.2.0/index.html
index e19db16cf..e7a8ae177 100644
--- a/content/docs/10.2.0/index.html
+++ b/content/docs/10.2.0/index.html
@@ -240,7 +240,7 @@ by following these <a class="reference internal" href="contributing/documentatio
<div class="section" id="nuttx-documentation">
<h1>NuttX Documentation<a class="headerlink" href="#nuttx-documentation" title="Permalink to this headline">¶</a></h1>
<p>NuttX is a real-time operating system (RTOS) with an emphasis on standards compliance and small footprint. Scalable from 8-bit to 64-bit microcontroller environments, the primary governing standards in NuttX are POSIX and ANSI standards. Additional standard APIs from Unix and other common RTOS’s (such as VxWorks) are adopted for functionality not available under these standards, or for functionality that is not appropriate for deeply-embedded environments (such as fork()).</p>
-<p>Last Updated: 10 November 24 at 00:14</p>
+<p>Last Updated: 11 November 24 at 00:14</p>
<div class="toctree-wrapper compound">
<p class="caption"><span class="caption-text">Table of Contents</span></p>
<ul class="current">
diff --git a/content/docs/10.3.0/index.html b/content/docs/10.3.0/index.html
index e19db16cf..e7a8ae177 100644
--- a/content/docs/10.3.0/index.html
+++ b/content/docs/10.3.0/index.html
@@ -240,7 +240,7 @@ by following these <a class="reference internal" href="contributing/documentatio
<div class="section" id="nuttx-documentation">
<h1>NuttX Documentation<a class="headerlink" href="#nuttx-documentation" title="Permalink to this headline">¶</a></h1>
<p>NuttX is a real-time operating system (RTOS) with an emphasis on standards compliance and small footprint. Scalable from 8-bit to 64-bit microcontroller environments, the primary governing standards in NuttX are POSIX and ANSI standards. Additional standard APIs from Unix and other common RTOS’s (such as VxWorks) are adopted for functionality not available under these standards, or for functionality that is not appropriate for deeply-embedded environments (such as fork()).</p>
-<p>Last Updated: 10 November 24 at 00:14</p>
+<p>Last Updated: 11 November 24 at 00:14</p>
<div class="toctree-wrapper compound">
<p class="caption"><span class="caption-text">Table of Contents</span></p>
<ul class="current">
diff --git a/content/docs/11.0.0/index.html b/content/docs/11.0.0/index.html
index 9b25a8408..e7a8ae177 100644
--- a/content/docs/11.0.0/index.html
+++ b/content/docs/11.0.0/index.html
@@ -240,7 +240,7 @@ by following these <a class="reference internal" href="contributing/documentatio
<div class="section" id="nuttx-documentation">
<h1>NuttX Documentation<a class="headerlink" href="#nuttx-documentation" title="Permalink to this headline">¶</a></h1>
<p>NuttX is a real-time operating system (RTOS) with an emphasis on standards compliance and small footprint. Scalable from 8-bit to 64-bit microcontroller environments, the primary governing standards in NuttX are POSIX and ANSI standards. Additional standard APIs from Unix and other common RTOS’s (such as VxWorks) are adopted for functionality not available under these standards, or for functionality that is not appropriate for deeply-embedded environments (such as fork()).</p>
-<p>Last Updated: 10 November 24 at 00:15</p>
+<p>Last Updated: 11 November 24 at 00:14</p>
<div class="toctree-wrapper compound">
<p class="caption"><span class="caption-text">Table of Contents</span></p>
<ul class="current">
diff --git a/content/docs/12.0.0/index.html b/content/docs/12.0.0/index.html
index dc7001bf8..5e2a7d467 100644
--- a/content/docs/12.0.0/index.html
+++ b/content/docs/12.0.0/index.html
@@ -165,7 +165,7 @@ by following these <a class="reference internal" href="contributing/documentatio
<section id="nuttx-documentation">
<h1>NuttX Documentation<a class="headerlink" href="#nuttx-documentation" title="Permalink to this headline"></a></h1>
<p>NuttX is a real-time operating system (RTOS) with an emphasis on standards compliance and small footprint. Scalable from 8-bit to 64-bit microcontroller environments, the primary governing standards in NuttX are POSIX and ANSI standards. Additional standard APIs from Unix and other common RTOS’s (such as VxWorks) are adopted for functionality not available under these standards, or for functionality that is not appropriate for deeply-embedded environments (such as fork()).</p>
-<p>Last Updated: 10 November 24 at 00:15</p>
+<p>Last Updated: 11 November 24 at 00:15</p>
<div class="toctree-wrapper compound">
<p class="caption" role="heading"><span class="caption-text">Table of Contents</span></p>
<ul class="current">
diff --git a/content/docs/12.0.0/searchindex.js b/content/docs/12.0.0/searchindex.js
index b2da0a46c..38aa7fcd3 100644
--- a/content/docs/12.0.0/searchindex.js
+++ b/content/docs/12.0.0/searchindex.js
@@ -1 +1 @@
-Search.setIndex({docnames:["applications/index","applications/nsh/builtin","applications/nsh/commands","applications/nsh/config","applications/nsh/customizing","applications/nsh/index","applications/nsh/installation","applications/nsh/login","applications/nsh/nsh","components/binfmt","components/drivers/block/index","components/drivers/character/analog","components/drivers/character/can","components/drivers/character/foc","components/drivers/character/index","components/drivers/character [...]
\ No newline at end of file
+Search.setIndex({docnames:["applications/index","applications/nsh/builtin","applications/nsh/commands","applications/nsh/config","applications/nsh/customizing","applications/nsh/index","applications/nsh/installation","applications/nsh/login","applications/nsh/nsh","components/binfmt","components/drivers/block/index","components/drivers/character/analog","components/drivers/character/can","components/drivers/character/foc","components/drivers/character/index","components/drivers/character [...]
\ No newline at end of file
diff --git a/content/docs/12.1.0/index.html b/content/docs/12.1.0/index.html
index 0679a408d..5cd9ee72b 100644
--- a/content/docs/12.1.0/index.html
+++ b/content/docs/12.1.0/index.html
@@ -165,7 +165,7 @@ by following these <a class="reference internal" href="contributing/documentatio
<section id="nuttx-documentation">
<h1>NuttX Documentation<a class="headerlink" href="#nuttx-documentation" title="Permalink to this headline"></a></h1>
<p>NuttX is a real-time operating system (RTOS) with an emphasis on standards compliance and small footprint. Scalable from 8-bit to 64-bit microcontroller environments, the primary governing standards in NuttX are POSIX and ANSI standards. Additional standard APIs from Unix and other common RTOS’s (such as VxWorks) are adopted for functionality not available under these standards, or for functionality that is not appropriate for deeply-embedded environments (such as fork()).</p>
-<p>Last Updated: 10 November 24 at 00:15</p>
+<p>Last Updated: 11 November 24 at 00:15</p>
<div class="toctree-wrapper compound">
<p class="caption" role="heading"><span class="caption-text">Table of Contents</span></p>
<ul class="current">
diff --git a/content/docs/12.1.0/searchindex.js b/content/docs/12.1.0/searchindex.js
index 9e467ae6b..88d363ffc 100644
--- a/content/docs/12.1.0/searchindex.js
+++ b/content/docs/12.1.0/searchindex.js
@@ -1 +1 @@
-Search.setIndex({docnames:["applications/index","applications/nsh/builtin","applications/nsh/commands","applications/nsh/config","applications/nsh/customizing","applications/nsh/index","applications/nsh/installation","applications/nsh/login","applications/nsh/nsh","components/binfmt","components/drivers/block/index","components/drivers/character/analog","components/drivers/character/can","components/drivers/character/foc","components/drivers/character/index","components/drivers/character [...]
\ No newline at end of file
+Search.setIndex({docnames:["applications/index","applications/nsh/builtin","applications/nsh/commands","applications/nsh/config","applications/nsh/customizing","applications/nsh/index","applications/nsh/installation","applications/nsh/login","applications/nsh/nsh","components/binfmt","components/drivers/block/index","components/drivers/character/analog","components/drivers/character/can","components/drivers/character/foc","components/drivers/character/index","components/drivers/character [...]
\ No newline at end of file
diff --git a/content/docs/12.2.0/index.html b/content/docs/12.2.0/index.html
index d8d8eb1dd..7088de0d1 100644
--- a/content/docs/12.2.0/index.html
+++ b/content/docs/12.2.0/index.html
@@ -166,7 +166,7 @@ by following these <a class="reference internal" href="contributing/documentatio
<section id="nuttx-documentation">
<h1>NuttX Documentation<a class="headerlink" href="#nuttx-documentation" title="Permalink to this heading"></a></h1>
<p>NuttX is a real-time operating system (RTOS) with an emphasis on standards compliance and small footprint. Scalable from 8-bit to 64-bit microcontroller environments, the primary governing standards in NuttX are POSIX and ANSI standards. Additional standard APIs from Unix and other common RTOS’s (such as VxWorks) are adopted for functionality not available under these standards, or for functionality that is not appropriate for deeply-embedded environments (such as fork()).</p>
-<p>Last Updated: 10 November 24 at 00:16</p>
+<p>Last Updated: 11 November 24 at 00:15</p>
<div class="toctree-wrapper compound">
<p class="caption" role="heading"><span class="caption-text">Table of Contents</span></p>
<ul class="current">
diff --git a/content/docs/12.2.0/searchindex.js b/content/docs/12.2.0/searchindex.js
index 2a1636a5e..844b781b3 100644
--- a/content/docs/12.2.0/searchindex.js
+++ b/content/docs/12.2.0/searchindex.js
@@ -1 +1 @@
-Search.setIndex({"docnames": ["applications/index", "applications/nsh/builtin", "applications/nsh/commands", "applications/nsh/config", "applications/nsh/customizing", "applications/nsh/index", "applications/nsh/installation", "applications/nsh/login", "applications/nsh/nsh", "applications/nxdiag/config", "applications/nxdiag/index", "applications/wapi/commands", "applications/wapi/index", "applications/wapi/wireless", "components/binfmt", "components/drivers/block/index", "components/dr [...]
\ No newline at end of file
+Search.setIndex({"docnames": ["applications/index", "applications/nsh/builtin", "applications/nsh/commands", "applications/nsh/config", "applications/nsh/customizing", "applications/nsh/index", "applications/nsh/installation", "applications/nsh/login", "applications/nsh/nsh", "applications/nxdiag/config", "applications/nxdiag/index", "applications/wapi/commands", "applications/wapi/index", "applications/wapi/wireless", "components/binfmt", "components/drivers/block/index", "components/dr [...]
\ No newline at end of file
diff --git a/content/docs/12.2.1/index.html b/content/docs/12.2.1/index.html
index d8d8eb1dd..b68678cd7 100644
--- a/content/docs/12.2.1/index.html
+++ b/content/docs/12.2.1/index.html
@@ -166,7 +166,7 @@ by following these <a class="reference internal" href="contributing/documentatio
<section id="nuttx-documentation">
<h1>NuttX Documentation<a class="headerlink" href="#nuttx-documentation" title="Permalink to this heading"></a></h1>
<p>NuttX is a real-time operating system (RTOS) with an emphasis on standards compliance and small footprint. Scalable from 8-bit to 64-bit microcontroller environments, the primary governing standards in NuttX are POSIX and ANSI standards. Additional standard APIs from Unix and other common RTOS’s (such as VxWorks) are adopted for functionality not available under these standards, or for functionality that is not appropriate for deeply-embedded environments (such as fork()).</p>
-<p>Last Updated: 10 November 24 at 00:16</p>
+<p>Last Updated: 11 November 24 at 00:16</p>
<div class="toctree-wrapper compound">
<p class="caption" role="heading"><span class="caption-text">Table of Contents</span></p>
<ul class="current">
diff --git a/content/docs/12.2.1/searchindex.js b/content/docs/12.2.1/searchindex.js
index 486eb89a8..ad021c154 100644
--- a/content/docs/12.2.1/searchindex.js
+++ b/content/docs/12.2.1/searchindex.js
@@ -1 +1 @@
-Search.setIndex({"docnames": ["applications/index", "applications/nsh/builtin", "applications/nsh/commands", "applications/nsh/config", "applications/nsh/customizing", "applications/nsh/index", "applications/nsh/installation", "applications/nsh/login", "applications/nsh/nsh", "applications/nxdiag/config", "applications/nxdiag/index", "applications/wapi/commands", "applications/wapi/index", "applications/wapi/wireless", "components/binfmt", "components/drivers/block/index", "components/dr [...]
\ No newline at end of file
+Search.setIndex({"docnames": ["applications/index", "applications/nsh/builtin", "applications/nsh/commands", "applications/nsh/config", "applications/nsh/customizing", "applications/nsh/index", "applications/nsh/installation", "applications/nsh/login", "applications/nsh/nsh", "applications/nxdiag/config", "applications/nxdiag/index", "applications/wapi/commands", "applications/wapi/index", "applications/wapi/wireless", "components/binfmt", "components/drivers/block/index", "components/dr [...]
\ No newline at end of file
diff --git a/content/docs/12.3.0/index.html b/content/docs/12.3.0/index.html
index 407d029c8..a44d0e4b4 100644
--- a/content/docs/12.3.0/index.html
+++ b/content/docs/12.3.0/index.html
@@ -166,7 +166,7 @@ by following these <a class="reference internal" href="contributing/documentatio
<section id="nuttx-documentation">
<h1>NuttX Documentation<a class="headerlink" href="#nuttx-documentation" title="Permalink to this heading"></a></h1>
<p>NuttX is a real-time operating system (RTOS) with an emphasis on standards compliance and small footprint. Scalable from 8-bit to 64-bit microcontroller environments, the primary governing standards in NuttX are POSIX and ANSI standards. Additional standard APIs from Unix and other common RTOS’s (such as VxWorks) are adopted for functionality not available under these standards, or for functionality that is not appropriate for deeply-embedded environments (such as fork()).</p>
-<p>Last Updated: 10 November 24 at 00:17</p>
+<p>Last Updated: 11 November 24 at 00:16</p>
<div class="toctree-wrapper compound">
<p class="caption" role="heading"><span class="caption-text">Table of Contents</span></p>
<ul class="current">
diff --git a/content/docs/12.3.0/searchindex.js b/content/docs/12.3.0/searchindex.js
index 4726460bd..d959dec10 100644
--- a/content/docs/12.3.0/searchindex.js
+++ b/content/docs/12.3.0/searchindex.js
@@ -1 +1 @@
-Search.setIndex({"docnames": ["applications/index", "applications/nsh/builtin", "applications/nsh/commands", "applications/nsh/config", "applications/nsh/customizing", "applications/nsh/index", "applications/nsh/installation", "applications/nsh/login", "applications/nsh/nsh", "applications/nxdiag/config", "applications/nxdiag/index", "applications/wapi/commands", "applications/wapi/index", "applications/wapi/wireless", "components/binfmt", "components/drivers/block/index", "components/dr [...]
\ No newline at end of file
+Search.setIndex({"docnames": ["applications/index", "applications/nsh/builtin", "applications/nsh/commands", "applications/nsh/config", "applications/nsh/customizing", "applications/nsh/index", "applications/nsh/installation", "applications/nsh/login", "applications/nsh/nsh", "applications/nxdiag/config", "applications/nxdiag/index", "applications/wapi/commands", "applications/wapi/index", "applications/wapi/wireless", "components/binfmt", "components/drivers/block/index", "components/dr [...]
\ No newline at end of file
diff --git a/content/docs/12.4.0/index.html b/content/docs/12.4.0/index.html
index 44f0913a5..93b920dfd 100644
--- a/content/docs/12.4.0/index.html
+++ b/content/docs/12.4.0/index.html
@@ -173,7 +173,7 @@ standards. Additional standard APIs from Unix and other common RTOS’s (such as
VxWorks) are adopted for functionality not available under these standards, or
for functionality that is not appropriate for deeply-embedded environments (such
as fork()).</p>
-<p>Last Updated: 10 November 24 at 00:17</p>
+<p>Last Updated: 11 November 24 at 00:17</p>
<div class="toctree-wrapper compound">
<p class="caption" role="heading"><span class="caption-text">Table of Contents</span></p>
<ul class="current">
diff --git a/content/docs/12.4.0/searchindex.js b/content/docs/12.4.0/searchindex.js
index 18a236752..b5a9b423a 100644
--- a/content/docs/12.4.0/searchindex.js
+++ b/content/docs/12.4.0/searchindex.js
@@ -1 +1 @@
-Search.setIndex({"docnames": ["applications/audioutils/fmsynt/index", "applications/audioutils/index", "applications/audioutils/mml_parser/index", "applications/audioutils/nxaudio/index", "applications/benchmarks/coremark/index", "applications/benchmarks/index", "applications/boot/index", "applications/boot/mcuboot/index", "applications/boot/miniboot/index", "applications/canutils/candump/index", "applications/canutils/canlib/index", "applications/canutils/cansend/index", "applications/c [...]
\ No newline at end of file
+Search.setIndex({"docnames": ["applications/audioutils/fmsynt/index", "applications/audioutils/index", "applications/audioutils/mml_parser/index", "applications/audioutils/nxaudio/index", "applications/benchmarks/coremark/index", "applications/benchmarks/index", "applications/boot/index", "applications/boot/mcuboot/index", "applications/boot/miniboot/index", "applications/canutils/candump/index", "applications/canutils/canlib/index", "applications/canutils/cansend/index", "applications/c [...]
\ No newline at end of file
diff --git a/content/docs/12.5.0/index.html b/content/docs/12.5.0/index.html
index 5a3eb335d..47327fc4d 100644
--- a/content/docs/12.5.0/index.html
+++ b/content/docs/12.5.0/index.html
@@ -173,7 +173,7 @@ standards. Additional standard APIs from Unix and other common RTOS’s (such as
VxWorks) are adopted for functionality not available under these standards, or
for functionality that is not appropriate for deeply-embedded environments (such
as fork()).</p>
-<p>Last Updated: 10 November 24 at 00:19</p>
+<p>Last Updated: 11 November 24 at 00:18</p>
<div class="toctree-wrapper compound">
<p class="caption" role="heading"><span class="caption-text">Table of Contents</span></p>
<ul class="current">
diff --git a/content/docs/12.5.0/searchindex.js b/content/docs/12.5.0/searchindex.js
index fb4994f01..08bdfbf6f 100644
--- a/content/docs/12.5.0/searchindex.js
+++ b/content/docs/12.5.0/searchindex.js
@@ -1 +1 @@
-Search.setIndex({"docnames": ["applications/audioutils/fmsynt/index", "applications/audioutils/index", "applications/audioutils/mml_parser/index", "applications/audioutils/nxaudio/index", "applications/benchmarks/coremark/index", "applications/benchmarks/index", "applications/boot/index", "applications/boot/mcuboot/index", "applications/boot/miniboot/index", "applications/canutils/candump/index", "applications/canutils/canlib/index", "applications/canutils/cansend/index", "applications/c [...]
\ No newline at end of file
+Search.setIndex({"docnames": ["applications/audioutils/fmsynt/index", "applications/audioutils/index", "applications/audioutils/mml_parser/index", "applications/audioutils/nxaudio/index", "applications/benchmarks/coremark/index", "applications/benchmarks/index", "applications/boot/index", "applications/boot/mcuboot/index", "applications/boot/miniboot/index", "applications/canutils/candump/index", "applications/canutils/canlib/index", "applications/canutils/cansend/index", "applications/c [...]
\ No newline at end of file
diff --git a/content/docs/12.5.1/index.html b/content/docs/12.5.1/index.html
index 0596a5c1b..cf42990f2 100644
--- a/content/docs/12.5.1/index.html
+++ b/content/docs/12.5.1/index.html
@@ -173,7 +173,7 @@ standards. Additional standard APIs from Unix and other common RTOS’s (such as
VxWorks) are adopted for functionality not available under these standards, or
for functionality that is not appropriate for deeply-embedded environments (such
as fork()).</p>
-<p>Last Updated: 10 November 24 at 00:20</p>
+<p>Last Updated: 11 November 24 at 00:20</p>
<div class="toctree-wrapper compound">
<p class="caption" role="heading"><span class="caption-text">Table of Contents</span></p>
<ul class="current">
diff --git a/content/docs/12.5.1/searchindex.js b/content/docs/12.5.1/searchindex.js
index f66ceb49e..b4e168624 100644
--- a/content/docs/12.5.1/searchindex.js
+++ b/content/docs/12.5.1/searchindex.js
@@ -1 +1 @@
-Search.setIndex({"docnames": ["applications/audioutils/fmsynt/index", "applications/audioutils/index", "applications/audioutils/mml_parser/index", "applications/audioutils/nxaudio/index", "applications/benchmarks/coremark/index", "applications/benchmarks/index", "applications/boot/index", "applications/boot/mcuboot/index", "applications/boot/miniboot/index", "applications/canutils/candump/index", "applications/canutils/canlib/index", "applications/canutils/cansend/index", "applications/c [...]
\ No newline at end of file
+Search.setIndex({"docnames": ["applications/audioutils/fmsynt/index", "applications/audioutils/index", "applications/audioutils/mml_parser/index", "applications/audioutils/nxaudio/index", "applications/benchmarks/coremark/index", "applications/benchmarks/index", "applications/boot/index", "applications/boot/mcuboot/index", "applications/boot/miniboot/index", "applications/canutils/candump/index", "applications/canutils/canlib/index", "applications/canutils/cansend/index", "applications/c [...]
\ No newline at end of file
diff --git a/content/docs/12.6.0/index.html b/content/docs/12.6.0/index.html
index e68ca73b5..715b1923e 100644
--- a/content/docs/12.6.0/index.html
+++ b/content/docs/12.6.0/index.html
@@ -174,7 +174,7 @@ standards. Additional standard APIs from Unix and other common RTOS’s (such as
VxWorks) are adopted for functionality not available under these standards, or
for functionality that is not appropriate for deeply-embedded environments (such
as fork()).</p>
-<p>Last Updated: 10 November 24 at 00:21</p>
+<p>Last Updated: 11 November 24 at 00:21</p>
<div class="toctree-wrapper compound">
<p class="caption" role="heading"><span class="caption-text">Table of Contents</span></p>
<ul class="current">
diff --git a/content/docs/12.6.0/searchindex.js b/content/docs/12.6.0/searchindex.js
index 52a3d8b7d..2082c73c3 100644
--- a/content/docs/12.6.0/searchindex.js
+++ b/content/docs/12.6.0/searchindex.js
@@ -1 +1 @@
-Search.setIndex({"docnames": ["applications/audioutils/fmsynt/index", "applications/audioutils/index", "applications/audioutils/mml_parser/index", "applications/audioutils/nxaudio/index", "applications/benchmarks/cachespeed/index", "applications/benchmarks/coremark-pro/index", "applications/benchmarks/coremark/index", "applications/benchmarks/dhrystone/index", "applications/benchmarks/fio/index", "applications/benchmarks/index", "applications/benchmarks/iozone/index", "applications/bench [...]
\ No newline at end of file
+Search.setIndex({"docnames": ["applications/audioutils/fmsynt/index", "applications/audioutils/index", "applications/audioutils/mml_parser/index", "applications/audioutils/nxaudio/index", "applications/benchmarks/cachespeed/index", "applications/benchmarks/coremark-pro/index", "applications/benchmarks/coremark/index", "applications/benchmarks/dhrystone/index", "applications/benchmarks/fio/index", "applications/benchmarks/index", "applications/benchmarks/iozone/index", "applications/bench [...]
\ No newline at end of file
diff --git a/content/docs/12.7.0/index.html b/content/docs/12.7.0/index.html
index 988bda881..8036b9e26 100644
--- a/content/docs/12.7.0/index.html
+++ b/content/docs/12.7.0/index.html
@@ -173,7 +173,7 @@ standards. Additional standard APIs from Unix and other common RTOS’s (such as
VxWorks) are adopted for functionality not available under these standards, or
for functionality that is not appropriate for deeply-embedded environments (such
as fork()).</p>
-<p>Last Updated: 10 November 24 at 00:23</p>
+<p>Last Updated: 11 November 24 at 00:22</p>
<div class="toctree-wrapper compound">
<p class="caption" role="heading"><span class="caption-text">Table of Contents</span></p>
<ul class="current">
diff --git a/content/docs/12.7.0/searchindex.js b/content/docs/12.7.0/searchindex.js
index 02eb3ea2a..8837c9925 100644
--- a/content/docs/12.7.0/searchindex.js
+++ b/content/docs/12.7.0/searchindex.js
@@ -1 +1 @@
-Search.setIndex({"docnames": ["applications/audioutils/fmsynt/index", "applications/audioutils/index", "applications/audioutils/mml_parser/index", "applications/audioutils/nxaudio/index", "applications/benchmarks/cachespeed/index", "applications/benchmarks/coremark-pro/index", "applications/benchmarks/coremark/index", "applications/benchmarks/dhrystone/index", "applications/benchmarks/fio/index", "applications/benchmarks/index", "applications/benchmarks/iozone/index", "applications/bench [...]
\ No newline at end of file
+Search.setIndex({"docnames": ["applications/audioutils/fmsynt/index", "applications/audioutils/index", "applications/audioutils/mml_parser/index", "applications/audioutils/nxaudio/index", "applications/benchmarks/cachespeed/index", "applications/benchmarks/coremark-pro/index", "applications/benchmarks/coremark/index", "applications/benchmarks/dhrystone/index", "applications/benchmarks/fio/index", "applications/benchmarks/index", "applications/benchmarks/iozone/index", "applications/bench [...]
\ No newline at end of file
diff --git a/content/docs/latest/_images/GraphicsInterfaces.png b/content/docs/latest/_images/GraphicsInterfaces.png
new file mode 100644
index 000000000..4fe1177b2
Binary files /dev/null and b/content/docs/latest/_images/GraphicsInterfaces.png differ
diff --git a/content/docs/latest/_images/nxwm_theading_model_page_0.png b/content/docs/latest/_images/nxwm_theading_model_page_0.png
new file mode 100644
index 000000000..eb95bc5a3
Binary files /dev/null and b/content/docs/latest/_images/nxwm_theading_model_page_0.png differ
diff --git a/content/docs/latest/_images/nxwm_theading_model_page_1.png b/content/docs/latest/_images/nxwm_theading_model_page_1.png
new file mode 100644
index 000000000..3e38e9b0d
Binary files /dev/null and b/content/docs/latest/_images/nxwm_theading_model_page_1.png differ
diff --git a/content/docs/latest/_images/nxwm_theading_model_page_2.png b/content/docs/latest/_images/nxwm_theading_model_page_2.png
new file mode 100644
index 000000000..8bde18ebf
Binary files /dev/null and b/content/docs/latest/_images/nxwm_theading_model_page_2.png differ
diff --git a/content/docs/latest/_images/nxwm_theading_model_page_3.png b/content/docs/latest/_images/nxwm_theading_model_page_3.png
new file mode 100644
index 000000000..80020f0e3
Binary files /dev/null and b/content/docs/latest/_images/nxwm_theading_model_page_3.png differ
diff --git a/content/docs/latest/_images/nxwm_theading_model_page_4.png b/content/docs/latest/_images/nxwm_theading_model_page_4.png
new file mode 100644
index 000000000..cbdc13290
Binary files /dev/null and b/content/docs/latest/_images/nxwm_theading_model_page_4.png differ
diff --git a/content/docs/latest/_sources/components/net/delay_act_and_tcp_perf.rst.txt b/content/docs/latest/_sources/components/net/delay_act_and_tcp_perf.rst.txt
new file mode 100644
index 000000000..50247b9a5
--- /dev/null
+++ b/content/docs/latest/_sources/components/net/delay_act_and_tcp_perf.rst.txt
@@ -0,0 +1,195 @@
+===============================
+Delayed ACK and TCP Performance
+===============================
+
+.. warning::
+ Migrated from:
+ https://cwiki.apache.org/confluence/display/NUTTX/Delayed+ACK+and+TCP+Performance
+
+uIP and NuttX
+=============
+
+The heart of the NuttX IP stack derived from Adam Dunkel's tiny `uIP
+stack <http://sourceforge.net/projects/uip-stack/>`_ back at version 1.0.
+The NuttX TCP/IP stack contains the uIP TCP state machine and
+some uIP "ways of doing things," but otherwise, there is
+now little in common between these two designs.
+
+**NOTE**: uIP is also built into Adam Dunkel's
+`Contiki <http://contiki.sourceforge.net/docs/2.6/a01793.html>`_
+operating system.
+
+uIP, Delayed ACKs, and Split Packets
+====================================
+
+In uIP, TCP packets are sent and ACK'ed one at a time.
+That is, after one TCP packet is sent, the next packet cannot
+be sent until the previous packet has been ACKed by the
+receiving side.
+The TCP protocol, of course, supports sending multiple packets
+which can be ACKed be the receiving time asynchronously.
+This one-packet-at-a-time logic is a simplification in the
+uIP design; because of this, uIP needs only a single packet
+buffer any you can use uIP in even the tiniest environments.
+This is a good thing for the objectives of uIP.
+
+Improvements in packet buffering is the essential improvement
+that you get if upgrade from Adam Dunkel's uIP to his
+`lwIP <http://savannah.nongnu.org/projects/lwip/>`_ stack.
+The price that you pay is in memory usage.
+
+This one-at-a-time packet transfer does create a performance
+problem for uIP:
+RFC 1122 states that a host may delay ACKing a packet for up
+to 500ms but must respond with an ACK to every second segment.
+In the baseline uIP, the effectively adds a one half second
+delay between the transfer of every packet to a recipient
+that employs this delayed ACK policy!
+
+uIP has an option to work around this:
+It has logic that can be enable to split each packet into half,
+sending half as much data in each packet.
+Sending more, smaller packets does not sound like a performance
+improvement.
+This tricks the recipient that follows RFC 1122 into receiving
+the two, smaller back-to-back packets and ACKing the second
+immediately.
+References: `uip-split.c <http://contiki.sourceforge.net/docs/2.6/a00427_source.html>`_
+and `uip-split.h <http://contiki.sourceforge.net/docs/2.6/a00428.html>`_.
+
+The NuttX TCP/IP Stack and Delay ACKs
+=====================================
+
+The NuttX, low-level TCP/IP stack does not have the
+limitations of the uIP TCP/IP stack.
+It can send numerous TCP/IP packets regardless of
+whether they have been ACKed or not.
+That is because in NuttX, the accounting for which
+packets have been ACKed and which have not has been
+moved to a higher level in the architecture.
+
+NuttX includes a standard, BSD socket interface on top
+of the low-level TCP/IP stack.
+It is in this higer-level, socket layer where the ACK
+accounting is done, specifically in the function
+`send() <http://pubs.opengroup.org/onlinepubs/009695399/functions/send.html>`_.
+If you send a large, multi-packet buffer via ``send()``,
+it will be broken up into individual packets and each
+packet will be sent as quickly as possible, with no
+concern for whether the previous packet has been ACKed or not.
+
+However, the NuttX ``send()`` function will not return to
+the caller until the final packet has been ACKed.
+It does this to assure that the callers data was sent
+successfully (or not).
+This behavior means that if an odd number of packets
+were sent, there could still be a delay after the final
+packet before ``send()`` receives the ACK and returns.
+
+So the NuttX approach is similar to the uIP way of doing
+things, but does add one more buffer, the user provided
+buffer to ``send()``, that can be used to improve TCP/IP
+performance (of course, this user provided buffer is
+also required by in order to be compliant with ``send()``""
+`specification <http://pubs.opengroup.org/onlinepubs/009695399/functions/send.html>`_.
+
+The NuttX Split Packet Configuration
+====================================
+
+But what happens if all of the user buffer is smaller than
+the MSS of one TCP packet?
+Suppose the MTU is 1500 and the user I/O buffer is only
+512 bytes?
+In this case, ``send()`` performance degenerates to the same
+behavior as uIP:
+An ACK is required for each packet before ``send()`` can
+return and before ``send()`` can be called again to send
+the next packet.
+
+And the fix? A fix has recently been contributed by
+Yan T that works in a similar way to uIP split
+packet logic:
+In ``send()``, the logic normally tries to send a full packet
+of data each time it has the opportunity to do so.
+However, if the configuration option ``CONFIG_NET_TCP_SPLIT=y``
+is defined, the behavior of ``send()`` will change in the
+following way:
+
+* ``send()`` will keep track of `even` and `odd` packets; `even`
+ packets being those that we do not expect to be ACKed
+ and `odd` packets being the those that we do expect to
+ be ACKed.
+* ``send()`` will then reduce the size of even packets as
+ necessary to assure that an even number of packets is
+ always sent. Every call to send will result in an even
+ number of packets being sent.
+
+This clever solution tricks the RFC 1122 recipient in the
+same way that uIP split logic does.
+So if you are working with hosts the following the RFC 1122
+ACKing behavior and you have MSS sizes that are larger that
+the average size of the user buffers, then your throughput
+can probably be greatly improved by enabling ``CONFIG_NET_TCP_SPLIT=y``
+
+NOTE: NuttX is `not` an RFC 1122 recipient; NuttX will ACK
+every TCP/IP packet that it receives.
+
+Write Buffering
+===============
+
+The best technical solution to the delayed ACK problem
+would be to support `write buffering`.
+Write buffering is enabled with ``CONFIG_NET_TCP_WRITE_BUFFERS``.
+If this option is selected, the NuttX networking layer will
+pre-allocate several write buffers at system initialization
+time. The sending a buffer of data then works like this:
+
+* ``send()`` (1) obtains a pre-allocated write buffer from a free
+ list, and then (2) simply copies the buffer of data that the
+ user wishes to send into the allocated write buffer. If no
+ write buffer is available, ``send()`` would have to block waiting
+ for free write buffer space.
+* ``send()`` then (3) adds the write buffer to a queue of outgoing
+ data for a TCP socket. Each open TCP socket has to support
+ such a queue. ``send()`` could then (4) return success to the
+ caller (even thought the transfer could still fail later).
+* Logic outside of the ``send()`` implementation manages the actual
+ transfer of data from the write buffer. When the Ethernet
+ driver is able to send a packet on the TCP connection, this
+ external logic (5) copies a packet of data from the write
+ buffer so that the Ethernet driver can perform the
+ transmission (a `zero-copy` implementation would be preferable).
+ Note that the data has to remain in the write buffer for now;
+ it may need to be re-transmitted.
+* This external logic would also manage the receipt TCP ACKs.
+ When TCP peer acknowledges the receipt of data, the
+ acknowledged portion of the data can the (6) finally
+ be deleted from the write buffer.
+
+The following options configure TCP write buffering:
+
+* ``CONFIG_NET_TCP_WRITE_BUFSIZE``: The size of one TCP write buffer.
+* ``CONFIG_NET_NTCP_WRITE_BUFFERS``: The number of TCP
+ write buffers (may be zero to disable TCP/IP write buffering)
+
+NuttX also supports TCP read-ahead buffering. This option
+is enabled with ``CONFIG_NET_TCP_READAHEAD``. TCP read-ahead
+buffer is necessary on TCP connections; otherwise data
+received while there is no ``recv()`` in place would be lost.
+For consistency, it would be best if such a TCP write
+buffer implementation worked in a manner similar to the
+existing TCP read-ahead buffering.
+
+The following lists the NuttX configuration options
+available to configure the TCP read-ahead buffering feature:
+
+* ``CONFIG_NET_TCP_READAHEAD_BUFSIZE``: The size of one TCP read-ahead buffer.
+* ``CONFIG_NET_NTCP_READAHEAD_BUFFERS``: The number of TCP
+ read-ahead buffers (may be zero to disable TCP/IP read-ahead buffering)
+
+A future enhancement is to combine the TCP write buffer
+management logic and the TCP read-ahead buffer management
+so that one common pool of buffers can be used for both
+functions (this would probably also require additional logic
+to `throttle` read-buffering so that received messages do not
+consume all of the buffers).
\ No newline at end of file
diff --git a/content/docs/latest/_sources/components/net/index.rst.txt b/content/docs/latest/_sources/components/net/index.rst.txt
index ebefe8d32..025966919 100644
--- a/content/docs/latest/_sources/components/net/index.rst.txt
+++ b/content/docs/latest/_sources/components/net/index.rst.txt
@@ -16,6 +16,8 @@ Network Support
netlink.rst
slip.rst
wqueuedeadlocks.rst
+ tcp_network_perf.rst
+ delay_act_and_tcp_perf.rst
``net`` Directory Structure ::
diff --git a/content/docs/latest/_sources/components/net/tcp_network_perf.rst.txt b/content/docs/latest/_sources/components/net/tcp_network_perf.rst.txt
new file mode 100644
index 000000000..33e89d8ef
--- /dev/null
+++ b/content/docs/latest/_sources/components/net/tcp_network_perf.rst.txt
@@ -0,0 +1,193 @@
+=======================
+TCP Network Performance
+=======================
+
+.. warning::
+ Migrated from:
+ https://cwiki.apache.org/confluence/display/NUTTX/TCP+Network+Performance
+
+
+(Abstracted and extended from a discussion from the NuttX Google group)
+
+Question
+========
+
+For some unknown reason, I am seeing poor TCP network performance.
+
+Answer
+======
+
+First let's talk about TCP send performance.
+
+Source of Performance Bottlenecks
+---------------------------------
+
+General TCP send performance is not determined by the TCP stack as much
+as it is by the network device driver. Bad network performance is due
+to time lost `BETWEEN` packet transfers. The packet transfers themselves
+go at the wire speed*. So if you want to improve performance on a
+given network, you have to reduce time lost between transfers.
+There is no other way.
+
+Ignoring Ethernet issues like collisions, back-off delays,
+inter-packet gaps (IPG), etc.
+
+The time between packets is limited primarily by the buffering
+design of the network driver. If you want to improve performance,
+then you must improve the buffering at the network driver.
+You need to support many full size (1500 byte) packet buffers.
+You must be able to query the network for new data to transfer,
+and queue those transfers in packet buffers. In order to reach
+peak performance, the network driver must have the next transfer
+buffered and ready-to-go before the previous transfer is finished
+to minimize the GAP between packet transfers.
+
+Different network devices also support more or less efficient
+interfaces: The worst performing support interfaces that can
+handle only one packet at a time, the best performing are able
+to retain linked lists of packet buffers in memory and perform
+scatter-gather DMA for a sequence of packets.
+
+In the NuttX TCP stack, you can also improve performance by
+enabling TCP write buffering. But the driver is the real key.
+
+It would be good to have a real in-depth analysis of the
+network stack performance to identify bottlenecks and
+generate ideas for performance improvement. No one has
+ever done that. If I were aware of any stack related
+performance issue, I would certainly address it.
+
+RFC 1122
+--------
+
+There is one important feature missing the NuttX TCP that
+can help when there is no write buffering: Without write
+buffering send() will not return until the transfer has
+been ACKed by the recipient. But under RFC 1122, the host
+need not ACK each packet immediately; the host may wait
+for 500 MS before ACKing. This combination can cause very
+slow performance when small, non-buffered transfers are
+made to an RFC 1122 client. However, the RFC 1122 must
+ACK at least every second (odd) packet so sequences of
+packets with write buffering enabled do not suffer from
+this problem.
+
+`Update: RFC 1122 support was added to the NuttX TCP
+stack with commit 66ef6d143a627738ad7f3ce1c065f9b1f3f303b0
+in December of 2019. That, however, that affects only
+received packet ACK behavior and has no impact on transmitted
+packet performance; write buffering is still recommended.`
+
+TCPBlaster
+----------
+
+I created a new test application at ``apps/examples/tcpblaster`` to
+measure TCP performance and collected some data for the
+configuration that happens to be on my desk. The `tcpblaster`
+test gives you the read and write transfer rates in ``Kb/sec``
+(I won't mention the numbers because I don't believe they
+would translate any other setup and, hence, would be
+misleading).
+
+There is a nifty `TCP Throughput Tool <https://www.switch.ch/network/tools/tcp_throughput/>`_
+that gives some theoretical upper limits on performance.
+The tool needs to know the ``MSS`` (which is the Ethernet
+packet size that you configured minus the size of the
+Ethernet header, 14), the round-trip time (``RTT``)in
+milliseconds (which you can
+get from the Linux host ping), and a loss constant (which
+I left at the default). With these values, I can determine
+that the throughput for the NuttX TCP stack is approximately
+at the theoretical limits. You should not be able to do
+better any better than that (actually, it performs above
+the theoretical limit, but I suppose that is why it is
+"theoretical").
+
+So, If you are unhappy with your network performance, the I
+suggest you run the `tcpblaster` test, use that data
+(along with the ``RTT`` from ping) with the
+`TCP Throughput Tool <https://www.switch.ch/network/tools/tcp_throughput/>`_.
+If you are still unhappy with the performance, don't go
+immediately pointing fingers at the stack (which everyone does).
+Instead, you should focus on optimizing your network
+configuration settings and reviewing the buffer handling
+of the Ethernet driver in you MCU.
+
+If you do discover any significant performance issues
+with the stack I will of course gladly help you resolve
+them. Or if you have ideas for improved performance,
+I would also be happy to hear those.
+
+What about Receive Performance?
+-------------------------------
+
+All of the above discussion concerns `transmit performance`,
+i.e., "How fast can we send data over the network?" The other
+side is receive performance. Receive performance is very
+different thing. In this case it is the remote peer who is
+in complete control of the rate at which packets appear on
+the network and, hence, responsible for all of the raw bit
+transfer rates.
+
+However, we might also redefine performance as the number of
+bytes that were `successfully` transferred. In order for the
+bytes to be successfully transferred they must be successfully
+received and processed on the NuttX target. If we fail in
+this if the packet is `lost` or `dropped`. A packet is lost if
+the network driver is not prepared to receive the packet when
+it was sent. A packet is dropped by the network if it is
+received but could not be processed either because there
+is some logical issue with the packet (not the case here)
+or if we have no space to buffer the newly received packet.
+
+If a TCP packet is lost or dropped, then the penalty is big:
+The packet will not be ACKed, the remote peer may send a
+few more out-of-sequence packets which will also be dropped.
+Eventually, the remote peer will time out and retransmit
+the data from the point of the lost packet.
+
+There is logic in the TCP protocol to help manage these data
+overruns. The TCP header includes a TCP `receive window` which
+tells the remote peer how much data the receiver is able to
+buffer. This value is sent in the ACK to each received
+packet. If well tuned, this receive window could possibly
+prevent packets from being lost due to the lack of
+read-ahead storage. This is a little better. The remote
+peer will hold off sending data instead of timing out and
+re-transmitting. But this is still a loss of performance;
+the gap between the transfer of packets caused by the hold-off
+will result in a reduced transfer rate.
+
+So the issues for good reception are buffering and processing
+time. Buffering again applies to handling within the driver
+but unlike the transmit performance, this is not typically
+the bottleneck. And there is also a NuttX configuration
+option that controls `read-ahead` buffering of TCP packets.
+The buffering in the driver must be optimized to avoid lost
+packets; the ` buffering can be tuned to minimize
+the number packets dropped because we have no space to buffer them.
+
+But the key to receive perform is management of processing
+delays. Small processing delays can occur in the network
+driver or in the TCP stack. But the major source of
+processing delay is the application which is the ultimate
+consumer of the incoming data. Imagine, for example,
+and FTP application that is receiving a file over a
+TCP and writing the file into FLASH memory. The primary
+bottleneck here will be the write to FLASH memory which
+is out of the control of software.
+
+We obtain optimal receive performance when the processing
+delays keep up with the rate of the incoming packets.
+If the processing data rate is even slightly slower
+then the receive data rate, then there will be a
+growing `backlog` of buffered, incoming data to be
+processed. If this backlog continues to grow then
+eventually our ability to buffer data will be exhausted,
+packets will be held off or dropped, and performance
+will deteriorate. In an environment where a high-end,
+remote peer is interacting with the low-end, embedded
+system, that remote peer can easily overrun the
+embedded system due to the embedded system's limited
+buffering space, its much lower processing capability,
+and its slower storage peripherals.
\ No newline at end of file
diff --git a/content/docs/latest/_sources/components/nxgraphics/framebuffer_char_driver.rst.txt b/content/docs/latest/_sources/components/nxgraphics/framebuffer_char_driver.rst.txt
new file mode 100644
index 000000000..a7afce5b1
--- /dev/null
+++ b/content/docs/latest/_sources/components/nxgraphics/framebuffer_char_driver.rst.txt
@@ -0,0 +1,383 @@
+============================
+Framebuffer Character Driver
+============================
+
+.. warning::
+ Migrated from:
+ https://cwiki.apache.org/confluence/display/NUTTX/Framebuffer+Character+Driver
+
+
+NX Graphics
+===========
+
+NuttX has supported higher level graphics for some time with
+the OS's :doc:`/components/nxgraphics/index` and application
+oriented :doc:`NxWidgets </applications/graphics/nxwidgets/index>` and the tiny
+window manager :doc:`NxWM </applications/graphics/nxwm/index>`.
+These are higher level in the sense that the primary
+graphical function is to support windowing and control
+of tools and toolbars within windows. These graphics
+tools often do not meet the needs
+of developers with very low end graphics and minimal display
+requirements.
+
+Figure 1
+========
+
+The framebuffer character driver, along with the option LCD
+framebuffer interface, is an optional lighter-weight graphics interface.
+
+.. image:: GraphicsInterfaces.png
+
+Framebuffer Character Driver details
+====================================
+
+A `framebuffer character driver` has been recently been added
+to bypass the complexity of `NX` and to provide a direct
+application interface to the framebuffer graphic device.
+The framebuffer buffer character devices, as with all
+character devices, provides the interface to the graphics
+device via stand POSIX VFS commands (``open()``, ``close()``,
+``read()``, ``write()``, ``seek()``, ...), through IOCTL commands,
+and for this driver via the ``mmap()`` function. These
+interfaces are described below,
+
+The framebuffer character driver is located in the NuttX
+source tree at ``drivers/video/fb.c``. It is enabled in the
+build with ``CONFIG_VIDEO_FB=y``. In order to register the
+framebuffer driver, you will need to include logic in the
+your board-specific start-up function that calls
+``fb_register()`` That code sequence might look something
+like:
+
+.. code-block:: c
+
+ #include <nuttx/video/fb.h>
+
+ #ifdef CONFIG_VIDEO_FB
+ /* Initialize and register the simulated framebuffer driver */
+
+ ret = fb_register(0, 0);
+ if (ret < 0)
+ {
+ syslog(LOG_ERR, "ERROR: fb_register() failed: %d\n", ret);
+ }
+ #endif
+
+The ``fb_register()`` function takes two parameters:
+
+* `display`. The display number for the case of boards
+ supporting multiple displays or for hardware that supports
+ multiple layers (each layer is consider a display). Typically zero.
+* `plane`. Identifies the color plane on hardware that supports
+ separate framebuffer "planes" for each color component.
+ Should be zero because no planar hardware is currently
+ supported by NuttX.
+
+``fb_register()`` will register the framebuffer character device
+at ``/dev/fb`` `N` where `N` is the display number if the devices
+supports only a single plane. If the hardware supports
+multiple color planes, then the device will be registered
+at ``/dev/fb`` `N-M` where `N` is the again display number but `M`
+is the display plane.
+
+There is a simple example at ``apps/examples/fb`` that provides
+an illustration of most of the following interfacing methods.
+
+POSIX Interfaces
+================
+
+The interaction with the framebuffer character driver via POSIX
+VFS interface calls is the same as for other character drivers.
+The only aspect that might require some additional discussion
+is the use of ``read()``, ``write()``, and ``seek()``.
+
+* ``read()`` returns data from the framebuffer memory and
+ updates the file position based on the number of bytes read.
+* ``write()`` puts data into the framebuffer memory and
+ also updates the file position.
+
+That file position is initially set to the position
+zero meaning the beginning of the framebuffer. It is
+advanced each time you ``read()`` from or ``write()`` to the
+framebuffer. Is also updated by ``seek()``:
+
+* ``seek()`` sets the file position to any desired
+ location within the framebuffer.
+
+The file position is in units of `bytes`. This can be
+confusing because other positional data may be in units
+`pixels`. Pixels have different `depth` in different displays,
+that is, different graphic hardware may support pixels with
+differing bits-per-pixel. The pixel depth can be obtained
+using one of the IOCTL commands listed below. Since the file
+position is in bytes, the bits-per-pixel must be taken account
+when using ``read()``, ``write()``, and ``seek()``. The usual conversion
+from pixels to bytes is:
+
+.. code-block:: C
+
+ start_byte = (start_pixel * bits_per_pixel) >> 3;
+ end_byte = (end_pixel * bits_per_pixel + 7) >> 3;
+
+While the framebuffer may be accessed with these POSIX interfaces,
+a more typical way of interacting with the framebuffer from an
+application would involve use of ``mmap()`` as described below.
+
+IOCTL Commands
+==============
+
+* ``FBIOGET_VIDEOINFO``. Get color plane info. Its argument is
+ pointer a writable instance of ``struct fb_videoinfo_s``:
+
+ .. code-block:: c
+
+ struct fb_videoinfo_s
+ {
+ uint8_t fmt; /* see FB_FMT_* */
+ fb_coord_t xres; /* Horizontal resolution in pixel columns */
+ fb_coord_t yres; /* Vertical resolution in pixel rows */
+ uint8_t nplanes; /* Number of color planes supported */
+ };
+
+* ``FBIOGET_PLANEINFO``. Get video plane info. It received
+ a pointer to a writable instance of ``struct fb_planeinfo_s`` as its argument:
+
+ .. code-block:: C
+
+ struct fb_planeinfo_s
+ {
+ FAR void *fbmem; /* Start of frame buffer memory */
+ uint32_t fblen; /* Length of frame buffer memory in bytes */
+ fb_coord_t stride; /* Length of a line in bytes */
+ uint8_t display; /* Display number */
+ uint8_t bpp; /* Bits per pixel */
+ };
+
+* ``FBIOGET_CMAP`` and ``FBIOPUT_CMAP``. Get/Put RGB color mapping.
+ These commands are available only if the hardware and
+ framebuffer driver support color mapping (``CONFIG_FB_CMAP=y``).
+ They each take a pointer to an instance of ``struct fb_cmap_s``
+ as an argument (writeable for ``FBIOGET_CMAP`` and read-only
+ for ``FBIOPUT_CMAP``).
+
+ .. code-block:: c
+
+ #ifdef CONFIG_FB_CMAP
+ struct fb_cmap_s
+ {
+ uint16_t first; /* Offset offset first color entry in tables */
+ uint16_t len; /* Number of color entries in tables */
+
+ /* Tables of color component. Any may be NULL if not used */
+
+ uint8_t *red; /* Table of 8-bit red values */
+ uint8_t *green; /* Table of 8-bit green values */
+ uint8_t *blue; /* Table of 8-bit blue values */
+ #ifdef CONFIG_FB_TRANSPARENCY
+ uint8_t *transp; /* Table of 8-bit transparency */
+ #endif
+ };
+ #endif
+
+* ``FBIOGET_CURSOR``. Get cursor attributes. This command is
+ available only if the hardware and framebuffer driver
+ support cursors (``CONFIG_FB_HWCURSOR=y``). It take a pointer
+ to a writable instance of ``struct fb_cursorattrib_s``:
+
+ .. code-block:: c
+
+ #ifdef CONFIG_FB_HWCURSOR
+ #ifdef CONFIG_FB_HWCURSORIMAGE
+ struct fb_cursorimage_s
+ {
+ fb_coord_t width; /* Width of the cursor image in pixels */
+ fb_coord_t height /* Height of the cursor image in pixels */
+ const uint8_t *image; /* Pointer to image data */
+ };
+ #endif
+
+ struct fb_cursorpos_s
+ {
+ fb_coord_t x; /* X position in pixels */
+ fb_coord_t y; /* Y position in rows */
+ };
+
+ #ifdef CONFIG_FB_HWCURSORSIZE
+ struct fb_cursorsize_s
+ {
+ fb_coord_t h; /* Height in rows */
+ fb_coord_t w; /* Width in pixels */
+ };
+ #endif
+
+ struct fb_cursorattrib_s
+ {
+ #ifdef CONFIG_FB_HWCURSORIMAGE
+ uint8_t fmt; /* Video format of cursor */
+ #endif
+ struct fb_cursorpos_s pos; /* Current cursor position */
+ #ifdef CONFIG_FB_HWCURSORSIZE
+ struct fb_cursorsize_s mxsize; /* Maximum cursor size */
+ struct fb_cursorsize_s size; /* Current size */
+ #endif
+ };
+ #endif
+
+* ``FBIOPUT_CURSOR``. Set cursor attributes. This command is
+ available only if the hardware and framebuffer driver
+ support cursors (``CONFIG_FB_HWCURSOR=y``). It take a
+ pointer to a writable instance of ``struct fb_setcursor_s``:
+
+ .. code-block:: c
+
+ #ifdef CONFIG_FB_HWCURSOR
+ struct fb_setcursor_s
+ {
+ uint8_t flags; /* See FB_CUR_* definitions */
+ struct fb_cursorpos_s pos; /* Cursor position */
+ #ifdef CONFIG_FB_HWCURSORSIZE
+ struct fb_cursorsize_s size; /* Cursor size */
+ #endif
+ #ifdef CONFIG_FB_HWCURSORIMAGE
+ struct fb_cursorimage_s img; /* Cursor image */
+ #endif
+ };
+ #endif
+
+* ``FBIO_UPDATE``. This IOCTL command updates a rectangular region
+ in the framebuffer. Some hardware requires that there be
+ such a notification when a change is made to the
+ framebuffer (see, for example, the discussion of LCD drivers
+ below). This IOTCL command is if ``CONFIG_NX_UPDATE=y`` is
+ defined. It takes a pointer to a read-only instance of
+ ``struct nxgl_rect_s`` that describes the region to be updated:
+
+ .. code-block:: c
+
+ struct nxgl_rect_s
+ {
+ struct nxgl_point_s pt1; /* Upper, left-hand corner */
+ struct nxgl_point_s pt2; /* Lower, right-hand corner */
+ };
+
+``mmap()``
+==========
+
+Above we talked about using ``read()``, ``write()``, and ``seek()`` to
+access the framebuffer. The simplest way to access the
+framebuffer, however, is by using the ``mmap()`` to map
+the framebuffer memory into the application memory
+space. The following ``mmap()`` command, for example, can
+be used to obtain a pointer to a read-able, write-able
+copy of the framebuffer:
+
+.. code-block:: c
+
+ FAR void *fbmem;
+
+ fbmem = mmap(NULL, fblen, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_FILE, fd, 0);
+ if (state.fbmem == MAP_FAILED)
+ {
+ /* Handle failure */
+ ...
+ }
+
+ printf("Mapped FB: %p\n", fbmem);
+
+Where fd is the file descriptor of the opened framebuffer
+character driver and ``fblen`` was obtained via an IOCTL
+command as described above. NOTE that the framebuffer
+buffer pointer is also available within the values
+returned by the IOCTL commands. The address is a
+kernel memory address and may not be valid in all
+build configurations. Hence, ``mmap()`` is the preferred,
+portable way to get the framebuffer address.
+
+Framebuffer vs. LCD Graphics Drivers
+====================================
+
+Framebuffer graphics drivers are very common in high-end CPUs
+but most low-end, embedded hardware will not support a
+framebuffer.
+
+A framebuffer graphics driver supports a region of memory
+that is shared both by the software and by the graphics
+hardware. Any modification to the framebuffer memory
+results in a corresponding modification on the display
+with no intervening software interaction. Some video
+memory is dual ported to support concurrent video processor
+and application processor accesses; or perhaps the LCD
+peripheral just constantly DMAs the framebuffer memory
+to the graphics hardware.
+
+Most low-end embedded MCUs have a much simpler hardware
+interface: The interface to the LCD may be through a simple
+parallel interface or, more commonly, through a slower serial
+interface such as SPI. In order to support such low-end
+hardware with the framebuffer character driver, a special
+software layer called the `Framebuffer LCD Front End` has
+been developed. This is the topic of the next paragraph.
+
+LCD Framebuffer Front-End
+=========================
+
+The `LCD Framebuffer Front-End` provides a standard NuttX
+framebuffer interface, but works on top of a standard
+parallel or serial LCD driver. It provides the framebuffer,
+the framebuffer interface, and the hooks to adapt the LCD
+driver. The LCD framebuffer front-end can be found in the
+NuttX source tree at ``drivers/lcd/lcd_framebuffer.c``.
+
+In order to provide updates to the LCD hardware after
+updates to the framebuffer, the LCD framebuffer front-end
+must be notified when significant changes to the framebuffer
+have been made. This notification is supported when
+``CONFIG_NX_UPDATE=y`` is defined in the configuration. In
+this case, the LCD framebuffer front-end will support
+the special. OS-internal interface function ``nx_notify_rectangle()``
+which defines the rectangular region in the framebuffer that
+has been changed. In response to a call to ``nx_notify_rectangle()``
+will use the lower-level LCD interface to update only that
+rectangular region on the display.
+
+This kind of update for standard LCD drivers is very efficient:
+It is usually more efficient to update a region on the
+display than it is for form a complex image with text and
+line drawing; the updated region seems to update very
+quickly because of that. In fact, many of the low-end
+LCD drivers already include an internal framebuffer to
+support this style of LCD update.
+
+When used with LCD character driver, the ``nx_notify_rectangle()``
+function will be called by the character river in response
+to the ``FBIO_UPDATE IOCTL`` command.
+
+Another advantage of the framebuffer, both the LCD internal
+framebuffer and the framebuffer character driver, is
+that super-efficient reading of the LCD display memory:
+The LCD display memory is not read at all! The read is
+from the copy in the framebuffer.
+
+Of course, using both an LCD internal framebuffer with the
+framebuffer character drivers is wasteful; one framebuffer
+is enough!
+
+As a caution, it is important to remember that a framebuffer
+can be quite large. For example, a 480x320 display with
+16-bit RGB pixels would require an allocated framebuffer
+of size 300 KiB. This is inappropriate with most small
+MCUs (unless they support external memory). For tiny displays,
+such as 128x64 1-bit monochromatic displays, the framebuffer
+memory usage is not bad: 1 KiB in that example.
+
+Framebuffer Graphics Library
+============================
+
+Now the missing part is some kind of application-space
+framebuffer graphics library. The NuttX framebuffer
+driver is superficially similar to the Linux framebuffer
+driver so there is a lot of support for Linux
+framebuffer graphics support that should be easily ported to
+NuttX – Perhaps DirectFB would be an GPL option? SDL with its
+MIT license might be a more compatible source for such a port.
\ No newline at end of file
diff --git a/content/docs/latest/_sources/components/nxgraphics/index.rst.txt b/content/docs/latest/_sources/components/nxgraphics/index.rst.txt
index f5740a45c..318f3bd98 100644
--- a/content/docs/latest/_sources/components/nxgraphics/index.rst.txt
+++ b/content/docs/latest/_sources/components/nxgraphics/index.rst.txt
@@ -171,6 +171,8 @@ NX Header Files
nxtk.rst
nxfonts.rst
nxcursor.rst
+ nxwm_threading.rst
+ framebuffer_char_driver.rst
sample.rst
appendix.rst
diff --git a/content/docs/latest/_sources/components/nxgraphics/nxwm_threading.rst.txt b/content/docs/latest/_sources/components/nxgraphics/nxwm_threading.rst.txt
new file mode 100644
index 000000000..ea5c8ac96
--- /dev/null
+++ b/content/docs/latest/_sources/components/nxgraphics/nxwm_threading.rst.txt
@@ -0,0 +1,13 @@
+==============
+NxWM Threading
+==============
+
+.. warning::
+ Migrated from:
+ https://cwiki.apache.org/confluence/display/NUTTX/NxWM+Threading
+
+.. image:: nxwm_threading_model/nxwm_theading_model_page_0.png
+.. image:: nxwm_threading_model/nxwm_theading_model_page_1.png
+.. image:: nxwm_threading_model/nxwm_theading_model_page_2.png
+.. image:: nxwm_threading_model/nxwm_theading_model_page_3.png
+.. image:: nxwm_threading_model/nxwm_theading_model_page_4.png
diff --git a/content/docs/latest/components/index.html b/content/docs/latest/components/index.html
index 731c8b681..c36902aec 100644
--- a/content/docs/latest/components/index.html
+++ b/content/docs/latest/components/index.html
@@ -251,6 +251,8 @@ case, you can head to the <a class="reference internal" href="../reference/index
<li class="toctree-l2"><a class="reference internal" href="net/netlink.html">Netlink Route support</a></li>
<li class="toctree-l2"><a class="reference internal" href="net/slip.html">SLIP</a></li>
<li class="toctree-l2"><a class="reference internal" href="net/wqueuedeadlocks.html">Work Queue Deadlocks</a></li>
+<li class="toctree-l2"><a class="reference internal" href="net/tcp_network_perf.html">TCP Network Performance</a></li>
+<li class="toctree-l2"><a class="reference internal" href="net/delay_act_and_tcp_perf.html">Delayed ACK and TCP Performance</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="mm/index.html">Memory Management</a><ul>
diff --git a/content/docs/latest/components/mm/index.html b/content/docs/latest/components/mm/index.html
index d09ac03f7..21064c419 100644
--- a/content/docs/latest/components/mm/index.html
+++ b/content/docs/latest/components/mm/index.html
@@ -44,7 +44,7 @@
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
<link rel="next" title="Shared Memory Support" href="shm.html" />
- <link rel="prev" title="Work Queue Deadlocks" href="../net/wqueuedeadlocks.html" />
+ <link rel="prev" title="Delayed ACK and TCP Performance" href="../net/delay_act_and_tcp_perf.html" />
</head>
<body class="wy-body-for-nav">
@@ -417,7 +417,7 @@ returned to the free list.</p></li>
</div>
</div>
<footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
- <a href="../net/wqueuedeadlocks.html" class="btn btn-neutral float-left" title="Work Queue Deadlocks" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
+ <a href="../net/delay_act_and_tcp_perf.html" class="btn btn-neutral float-left" title="Delayed ACK and TCP Performance" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
<a href="shm.html" class="btn btn-neutral float-right" title="Shared Memory Support" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
</div>
diff --git a/content/docs/latest/components/net/delay_act_and_tcp_perf.html b/content/docs/latest/components/net/delay_act_and_tcp_perf.html
new file mode 100644
index 000000000..df29b9596
--- /dev/null
+++ b/content/docs/latest/components/net/delay_act_and_tcp_perf.html
@@ -0,0 +1,412 @@
+<!--
+ 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>Delayed ACK and TCP Performance — NuttX latest documentation</title>
+ <link rel="stylesheet" type="text/css" href="../../_static/pygments.css" />
+ <link rel="stylesheet" type="text/css" href="../../_static/css/theme.css" />
+ <link rel="stylesheet" type="text/css" href="../../_static/copybutton.css" />
+ <link rel="stylesheet" type="text/css" href="../../_static/custom.css" />
+
+
+ <link rel="shortcut icon" href="../../_static/favicon.ico"/>
+ <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="Memory Management" href="../mm/index.html" />
+ <link rel="prev" title="TCP Network Performance" href="tcp_network_perf.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>
+
+ <option value="../../../12.6.0" >12.6.0</option>
+
+ <option value="../../../12.7.0" >12.7.0</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 current"><a class="reference internal" href="index.html">Network Support</a><ul class="current">
+<li class="toctree-l3"><a class="reference internal" href="sixlowpan.html">6LoWPAN</a></li>
+<li class="toctree-l3"><a class="reference internal" href="socketcan.html">SocketCAN Device Drivers</a></li>
+<li class="toctree-l3"><a class="reference internal" href="pkt.html">“Raw” packet socket support</a></li>
+<li class="toctree-l3"><a class="reference internal" href="ipfilter.html">IP Packet Filter</a></li>
+<li class="toctree-l3"><a class="reference internal" href="nat.html">Network Address Translation (NAT)</a></li>
+<li class="toctree-l3"><a class="reference internal" href="netdev.html">Network Devices</a></li>
+<li class="toctree-l3"><a class="reference internal" href="netdriver.html">Network Drivers</a></li>
+<li class="toctree-l3"><a class="reference internal" href="netguardsize.html">CONFIG_NET_GUARDSIZE</a></li>
+<li class="toctree-l3"><a class="reference internal" href="netlink.html">Netlink Route support</a></li>
+<li class="toctree-l3"><a class="reference internal" href="slip.html">SLIP</a></li>
+<li class="toctree-l3"><a class="reference internal" href="wqueuedeadlocks.html">Work Queue Deadlocks</a></li>
+<li class="toctree-l3"><a class="reference internal" href="tcp_network_perf.html">TCP Network Performance</a></li>
+<li class="toctree-l3 current"><a class="current reference internal" href="#">Delayed ACK and TCP Performance</a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#uip-and-nuttx">uIP and NuttX</a></li>
+<li class="toctree-l4"><a class="reference internal" href="#uip-delayed-acks-and-split-packets">uIP, Delayed ACKs, and Split Packets</a></li>
+<li class="toctree-l4"><a class="reference internal" href="#the-nuttx-tcp-ip-stack-and-delay-acks">The NuttX TCP/IP Stack and Delay ACKs</a></li>
+<li class="toctree-l4"><a class="reference internal" href="#the-nuttx-split-packet-configuration">The NuttX Split Packet Configuration</a></li>
+<li class="toctree-l4"><a class="reference internal" href="#write-buffering">Write Buffering</a></li>
+</ul>
+</li>
+</ul>
+</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"><a class="reference internal" href="../arch/index.html">Architecture-Specific Code</a></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>
+<li class="toctree-l1"><a class="reference internal" href="../../logos/index.html">NuttX Logos</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"><a href="index.html">Network Support</a></li>
+ <li class="breadcrumb-item active">Delayed ACK and TCP Performance</li>
+ <li class="wy-breadcrumbs-aside">
+ <a href="../../_sources/components/net/delay_act_and_tcp_perf.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="delayed-ack-and-tcp-performance">
+<h1>Delayed ACK and TCP Performance<a class="headerlink" href="#delayed-ack-and-tcp-performance" title="Permalink to this heading"></a></h1>
+<div class="admonition warning">
+<p class="admonition-title">Warning</p>
+<p>Migrated from:
+<a class="reference external" href="https://cwiki.apache.org/confluence/display/NUTTX/Delayed+ACK+and+TCP+Performance">https://cwiki.apache.org/confluence/display/NUTTX/Delayed+ACK+and+TCP+Performance</a></p>
+</div>
+<section id="uip-and-nuttx">
+<h2>uIP and NuttX<a class="headerlink" href="#uip-and-nuttx" title="Permalink to this heading"></a></h2>
+<p>The heart of the NuttX IP stack derived from Adam Dunkel’s tiny <a class="reference external" href="http://sourceforge.net/projects/uip-stack/">uIP
+stack</a> back at version 1.0.
+The NuttX TCP/IP stack contains the uIP TCP state machine and
+some uIP “ways of doing things,” but otherwise, there is
+now little in common between these two designs.</p>
+<p><strong>NOTE</strong>: uIP is also built into Adam Dunkel’s
+<a class="reference external" href="http://contiki.sourceforge.net/docs/2.6/a01793.html">Contiki</a>
+operating system.</p>
+</section>
+<section id="uip-delayed-acks-and-split-packets">
+<h2>uIP, Delayed ACKs, and Split Packets<a class="headerlink" href="#uip-delayed-acks-and-split-packets" title="Permalink to this heading"></a></h2>
+<p>In uIP, TCP packets are sent and ACK’ed one at a time.
+That is, after one TCP packet is sent, the next packet cannot
+be sent until the previous packet has been ACKed by the
+receiving side.
+The TCP protocol, of course, supports sending multiple packets
+which can be ACKed be the receiving time asynchronously.
+This one-packet-at-a-time logic is a simplification in the
+uIP design; because of this, uIP needs only a single packet
+buffer any you can use uIP in even the tiniest environments.
+This is a good thing for the objectives of uIP.</p>
+<p>Improvements in packet buffering is the essential improvement
+that you get if upgrade from Adam Dunkel’s uIP to his
+<a class="reference external" href="http://savannah.nongnu.org/projects/lwip/">lwIP</a> stack.
+The price that you pay is in memory usage.</p>
+<p>This one-at-a-time packet transfer does create a performance
+problem for uIP:
+RFC 1122 states that a host may delay ACKing a packet for up
+to 500ms but must respond with an ACK to every second segment.
+In the baseline uIP, the effectively adds a one half second
+delay between the transfer of every packet to a recipient
+that employs this delayed ACK policy!</p>
+<p>uIP has an option to work around this:
+It has logic that can be enable to split each packet into half,
+sending half as much data in each packet.
+Sending more, smaller packets does not sound like a performance
+improvement.
+This tricks the recipient that follows RFC 1122 into receiving
+the two, smaller back-to-back packets and ACKing the second
+immediately.
+References: <a class="reference external" href="http://contiki.sourceforge.net/docs/2.6/a00427_source.html">uip-split.c</a>
+and <a class="reference external" href="http://contiki.sourceforge.net/docs/2.6/a00428.html">uip-split.h</a>.</p>
+</section>
+<section id="the-nuttx-tcp-ip-stack-and-delay-acks">
+<h2>The NuttX TCP/IP Stack and Delay ACKs<a class="headerlink" href="#the-nuttx-tcp-ip-stack-and-delay-acks" title="Permalink to this heading"></a></h2>
+<p>The NuttX, low-level TCP/IP stack does not have the
+limitations of the uIP TCP/IP stack.
+It can send numerous TCP/IP packets regardless of
+whether they have been ACKed or not.
+That is because in NuttX, the accounting for which
+packets have been ACKed and which have not has been
+moved to a higher level in the architecture.</p>
+<p>NuttX includes a standard, BSD socket interface on top
+of the low-level TCP/IP stack.
+It is in this higer-level, socket layer where the ACK
+accounting is done, specifically in the function
+<a class="reference external" href="http://pubs.opengroup.org/onlinepubs/009695399/functions/send.html">send()</a>.
+If you send a large, multi-packet buffer via <code class="docutils literal notranslate"><span class="pre">send()</span></code>,
+it will be broken up into individual packets and each
+packet will be sent as quickly as possible, with no
+concern for whether the previous packet has been ACKed or not.</p>
+<p>However, the NuttX <code class="docutils literal notranslate"><span class="pre">send()</span></code> function will not return to
+the caller until the final packet has been ACKed.
+It does this to assure that the callers data was sent
+successfully (or not).
+This behavior means that if an odd number of packets
+were sent, there could still be a delay after the final
+packet before <code class="docutils literal notranslate"><span class="pre">send()</span></code> receives the ACK and returns.</p>
+<p>So the NuttX approach is similar to the uIP way of doing
+things, but does add one more buffer, the user provided
+buffer to <code class="docutils literal notranslate"><span class="pre">send()</span></code>, that can be used to improve TCP/IP
+performance (of course, this user provided buffer is
+also required by in order to be compliant with <code class="docutils literal notranslate"><span class="pre">send()</span></code>””
+<a class="reference external" href="http://pubs.opengroup.org/onlinepubs/009695399/functions/send.html">specification</a>.</p>
+</section>
+<section id="the-nuttx-split-packet-configuration">
+<h2>The NuttX Split Packet Configuration<a class="headerlink" href="#the-nuttx-split-packet-configuration" title="Permalink to this heading"></a></h2>
+<p>But what happens if all of the user buffer is smaller than
+the MSS of one TCP packet?
+Suppose the MTU is 1500 and the user I/O buffer is only
+512 bytes?
+In this case, <code class="docutils literal notranslate"><span class="pre">send()</span></code> performance degenerates to the same
+behavior as uIP:
+An ACK is required for each packet before <code class="docutils literal notranslate"><span class="pre">send()</span></code> can
+return and before <code class="docutils literal notranslate"><span class="pre">send()</span></code> can be called again to send
+the next packet.</p>
+<p>And the fix? A fix has recently been contributed by
+Yan T that works in a similar way to uIP split
+packet logic:
+In <code class="docutils literal notranslate"><span class="pre">send()</span></code>, the logic normally tries to send a full packet
+of data each time it has the opportunity to do so.
+However, if the configuration option <code class="docutils literal notranslate"><span class="pre">CONFIG_NET_TCP_SPLIT=y</span></code>
+is defined, the behavior of <code class="docutils literal notranslate"><span class="pre">send()</span></code> will change in the
+following way:</p>
+<ul class="simple">
+<li><p><code class="docutils literal notranslate"><span class="pre">send()</span></code> will keep track of <cite>even</cite> and <cite>odd</cite> packets; <cite>even</cite>
+packets being those that we do not expect to be ACKed
+and <cite>odd</cite> packets being the those that we do expect to
+be ACKed.</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">send()</span></code> will then reduce the size of even packets as
+necessary to assure that an even number of packets is
+always sent. Every call to send will result in an even
+number of packets being sent.</p></li>
+</ul>
+<p>This clever solution tricks the RFC 1122 recipient in the
+same way that uIP split logic does.
+So if you are working with hosts the following the RFC 1122
+ACKing behavior and you have MSS sizes that are larger that
+the average size of the user buffers, then your throughput
+can probably be greatly improved by enabling <code class="docutils literal notranslate"><span class="pre">CONFIG_NET_TCP_SPLIT=y</span></code></p>
+<p>NOTE: NuttX is <cite>not</cite> an RFC 1122 recipient; NuttX will ACK
+every TCP/IP packet that it receives.</p>
+</section>
+<section id="write-buffering">
+<h2>Write Buffering<a class="headerlink" href="#write-buffering" title="Permalink to this heading"></a></h2>
+<p>The best technical solution to the delayed ACK problem
+would be to support <cite>write buffering</cite>.
+Write buffering is enabled with <code class="docutils literal notranslate"><span class="pre">CONFIG_NET_TCP_WRITE_BUFFERS</span></code>.
+If this option is selected, the NuttX networking layer will
+pre-allocate several write buffers at system initialization
+time. The sending a buffer of data then works like this:</p>
+<ul class="simple">
+<li><p><code class="docutils literal notranslate"><span class="pre">send()</span></code> (1) obtains a pre-allocated write buffer from a free
+list, and then (2) simply copies the buffer of data that the
+user wishes to send into the allocated write buffer. If no
+write buffer is available, <code class="docutils literal notranslate"><span class="pre">send()</span></code> would have to block waiting
+for free write buffer space.</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">send()</span></code> then (3) adds the write buffer to a queue of outgoing
+data for a TCP socket. Each open TCP socket has to support
+such a queue. <code class="docutils literal notranslate"><span class="pre">send()</span></code> could then (4) return success to the
+caller (even thought the transfer could still fail later).</p></li>
+<li><p>Logic outside of the <code class="docutils literal notranslate"><span class="pre">send()</span></code> implementation manages the actual
+transfer of data from the write buffer. When the Ethernet
+driver is able to send a packet on the TCP connection, this
+external logic (5) copies a packet of data from the write
+buffer so that the Ethernet driver can perform the
+transmission (a <cite>zero-copy</cite> implementation would be preferable).
+Note that the data has to remain in the write buffer for now;
+it may need to be re-transmitted.</p></li>
+<li><p>This external logic would also manage the receipt TCP ACKs.
+When TCP peer acknowledges the receipt of data, the
+acknowledged portion of the data can the (6) finally
+be deleted from the write buffer.</p></li>
+</ul>
+<p>The following options configure TCP write buffering:</p>
+<ul class="simple">
+<li><p><code class="docutils literal notranslate"><span class="pre">CONFIG_NET_TCP_WRITE_BUFSIZE</span></code>: The size of one TCP write buffer.</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">CONFIG_NET_NTCP_WRITE_BUFFERS</span></code>: The number of TCP
+write buffers (may be zero to disable TCP/IP write buffering)</p></li>
+</ul>
+<p>NuttX also supports TCP read-ahead buffering. This option
+is enabled with <code class="docutils literal notranslate"><span class="pre">CONFIG_NET_TCP_READAHEAD</span></code>. TCP read-ahead
+buffer is necessary on TCP connections; otherwise data
+received while there is no <code class="docutils literal notranslate"><span class="pre">recv()</span></code> in place would be lost.
+For consistency, it would be best if such a TCP write
+buffer implementation worked in a manner similar to the
+existing TCP read-ahead buffering.</p>
+<p>The following lists the NuttX configuration options
+available to configure the TCP read-ahead buffering feature:</p>
+<ul class="simple">
+<li><p><code class="docutils literal notranslate"><span class="pre">CONFIG_NET_TCP_READAHEAD_BUFSIZE</span></code>: The size of one TCP read-ahead buffer.</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">CONFIG_NET_NTCP_READAHEAD_BUFFERS</span></code>: The number of TCP
+read-ahead buffers (may be zero to disable TCP/IP read-ahead buffering)</p></li>
+</ul>
+<p>A future enhancement is to combine the TCP write buffer
+management logic and the TCP read-ahead buffer management
+so that one common pool of buffers can be used for both
+functions (this would probably also require additional logic
+to <cite>throttle</cite> read-buffering so that received messages do not
+consume all of the buffers).</p>
+</section>
+</section>
+
+
+ </div>
+ </div>
+ <footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
+ <a href="tcp_network_perf.html" class="btn btn-neutral float-left" title="TCP Network Performance" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
+ <a href="../mm/index.html" class="btn btn-neutral float-right" title="Memory Management" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
+ </div>
+
+ <hr/>
+
+ <div role="contentinfo">
+ <p>© Copyright 2023, The Apache Software Foundation.</p>
+ </div>
+
+
+
+</footer>
+ </div>
+ </div>
+ </section>
+ </div>
+ <script>
+ jQuery(function () {
+ SphinxRtdTheme.Navigation.enable(true);
+ });
+ </script>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/content/docs/latest/components/net/index.html b/content/docs/latest/components/net/index.html
index 042651f49..4c756cf62 100644
--- a/content/docs/latest/components/net/index.html
+++ b/content/docs/latest/components/net/index.html
@@ -141,6 +141,8 @@
<li class="toctree-l3"><a class="reference internal" href="netlink.html">Netlink Route support</a></li>
<li class="toctree-l3"><a class="reference internal" href="slip.html">SLIP</a></li>
<li class="toctree-l3"><a class="reference internal" href="wqueuedeadlocks.html">Work Queue Deadlocks</a></li>
+<li class="toctree-l3"><a class="reference internal" href="tcp_network_perf.html">TCP Network Performance</a></li>
+<li class="toctree-l3"><a class="reference internal" href="delay_act_and_tcp_perf.html">Delayed ACK and TCP Performance</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../mm/index.html">Memory Management</a></li>
@@ -204,6 +206,8 @@
<li class="toctree-l1"><a class="reference internal" href="netlink.html">Netlink Route support</a></li>
<li class="toctree-l1"><a class="reference internal" href="slip.html">SLIP</a></li>
<li class="toctree-l1"><a class="reference internal" href="wqueuedeadlocks.html">Work Queue Deadlocks</a></li>
+<li class="toctree-l1"><a class="reference internal" href="tcp_network_perf.html">TCP Network Performance</a></li>
+<li class="toctree-l1"><a class="reference internal" href="delay_act_and_tcp_perf.html">Delayed ACK and TCP Performance</a></li>
</ul>
</div>
<p><code class="docutils literal notranslate"><span class="pre">net</span></code> Directory Structure</p>
diff --git a/content/docs/latest/components/net/ipfilter.html b/content/docs/latest/components/net/ipfilter.html
index 52e3f2032..05c64ca76 100644
--- a/content/docs/latest/components/net/ipfilter.html
+++ b/content/docs/latest/components/net/ipfilter.html
@@ -146,6 +146,8 @@
<li class="toctree-l3"><a class="reference internal" href="netlink.html">Netlink Route support</a></li>
<li class="toctree-l3"><a class="reference internal" href="slip.html">SLIP</a></li>
<li class="toctree-l3"><a class="reference internal" href="wqueuedeadlocks.html">Work Queue Deadlocks</a></li>
+<li class="toctree-l3"><a class="reference internal" href="tcp_network_perf.html">TCP Network Performance</a></li>
+<li class="toctree-l3"><a class="reference internal" href="delay_act_and_tcp_perf.html">Delayed ACK and TCP Performance</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../mm/index.html">Memory Management</a></li>
diff --git a/content/docs/latest/components/net/nat.html b/content/docs/latest/components/net/nat.html
index 6ce7b9908..62a928382 100644
--- a/content/docs/latest/components/net/nat.html
+++ b/content/docs/latest/components/net/nat.html
@@ -147,6 +147,8 @@
<li class="toctree-l3"><a class="reference internal" href="netlink.html">Netlink Route support</a></li>
<li class="toctree-l3"><a class="reference internal" href="slip.html">SLIP</a></li>
<li class="toctree-l3"><a class="reference internal" href="wqueuedeadlocks.html">Work Queue Deadlocks</a></li>
+<li class="toctree-l3"><a class="reference internal" href="tcp_network_perf.html">TCP Network Performance</a></li>
+<li class="toctree-l3"><a class="reference internal" href="delay_act_and_tcp_perf.html">Delayed ACK and TCP Performance</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../mm/index.html">Memory Management</a></li>
diff --git a/content/docs/latest/components/net/netdev.html b/content/docs/latest/components/net/netdev.html
index 4de5a341e..76557dc88 100644
--- a/content/docs/latest/components/net/netdev.html
+++ b/content/docs/latest/components/net/netdev.html
@@ -150,6 +150,8 @@
<li class="toctree-l3"><a class="reference internal" href="netlink.html">Netlink Route support</a></li>
<li class="toctree-l3"><a class="reference internal" href="slip.html">SLIP</a></li>
<li class="toctree-l3"><a class="reference internal" href="wqueuedeadlocks.html">Work Queue Deadlocks</a></li>
+<li class="toctree-l3"><a class="reference internal" href="tcp_network_perf.html">TCP Network Performance</a></li>
+<li class="toctree-l3"><a class="reference internal" href="delay_act_and_tcp_perf.html">Delayed ACK and TCP Performance</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../mm/index.html">Memory Management</a></li>
diff --git a/content/docs/latest/components/net/netdriver.html b/content/docs/latest/components/net/netdriver.html
index df19e4b70..020bf49db 100644
--- a/content/docs/latest/components/net/netdriver.html
+++ b/content/docs/latest/components/net/netdriver.html
@@ -145,6 +145,8 @@
<li class="toctree-l3"><a class="reference internal" href="netlink.html">Netlink Route support</a></li>
<li class="toctree-l3"><a class="reference internal" href="slip.html">SLIP</a></li>
<li class="toctree-l3"><a class="reference internal" href="wqueuedeadlocks.html">Work Queue Deadlocks</a></li>
+<li class="toctree-l3"><a class="reference internal" href="tcp_network_perf.html">TCP Network Performance</a></li>
+<li class="toctree-l3"><a class="reference internal" href="delay_act_and_tcp_perf.html">Delayed ACK and TCP Performance</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../mm/index.html">Memory Management</a></li>
diff --git a/content/docs/latest/components/net/netguardsize.html b/content/docs/latest/components/net/netguardsize.html
index ed344ffaf..0d5da22aa 100644
--- a/content/docs/latest/components/net/netguardsize.html
+++ b/content/docs/latest/components/net/netguardsize.html
@@ -146,6 +146,8 @@
<li class="toctree-l3"><a class="reference internal" href="netlink.html">Netlink Route support</a></li>
<li class="toctree-l3"><a class="reference internal" href="slip.html">SLIP</a></li>
<li class="toctree-l3"><a class="reference internal" href="wqueuedeadlocks.html">Work Queue Deadlocks</a></li>
+<li class="toctree-l3"><a class="reference internal" href="tcp_network_perf.html">TCP Network Performance</a></li>
+<li class="toctree-l3"><a class="reference internal" href="delay_act_and_tcp_perf.html">Delayed ACK and TCP Performance</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../mm/index.html">Memory Management</a></li>
diff --git a/content/docs/latest/components/net/netlink.html b/content/docs/latest/components/net/netlink.html
index 1560c35ed..3cf9aec92 100644
--- a/content/docs/latest/components/net/netlink.html
+++ b/content/docs/latest/components/net/netlink.html
@@ -145,6 +145,8 @@
</li>
<li class="toctree-l3"><a class="reference internal" href="slip.html">SLIP</a></li>
<li class="toctree-l3"><a class="reference internal" href="wqueuedeadlocks.html">Work Queue Deadlocks</a></li>
+<li class="toctree-l3"><a class="reference internal" href="tcp_network_perf.html">TCP Network Performance</a></li>
+<li class="toctree-l3"><a class="reference internal" href="delay_act_and_tcp_perf.html">Delayed ACK and TCP Performance</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../mm/index.html">Memory Management</a></li>
diff --git a/content/docs/latest/components/net/pkt.html b/content/docs/latest/components/net/pkt.html
index a90f633ce..c24514362 100644
--- a/content/docs/latest/components/net/pkt.html
+++ b/content/docs/latest/components/net/pkt.html
@@ -145,6 +145,8 @@
<li class="toctree-l3"><a class="reference internal" href="netlink.html">Netlink Route support</a></li>
<li class="toctree-l3"><a class="reference internal" href="slip.html">SLIP</a></li>
<li class="toctree-l3"><a class="reference internal" href="wqueuedeadlocks.html">Work Queue Deadlocks</a></li>
+<li class="toctree-l3"><a class="reference internal" href="tcp_network_perf.html">TCP Network Performance</a></li>
+<li class="toctree-l3"><a class="reference internal" href="delay_act_and_tcp_perf.html">Delayed ACK and TCP Performance</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../mm/index.html">Memory Management</a></li>
diff --git a/content/docs/latest/components/net/sixlowpan.html b/content/docs/latest/components/net/sixlowpan.html
index d32477021..70bea330a 100644
--- a/content/docs/latest/components/net/sixlowpan.html
+++ b/content/docs/latest/components/net/sixlowpan.html
@@ -148,6 +148,8 @@
<li class="toctree-l3"><a class="reference internal" href="netlink.html">Netlink Route support</a></li>
<li class="toctree-l3"><a class="reference internal" href="slip.html">SLIP</a></li>
<li class="toctree-l3"><a class="reference internal" href="wqueuedeadlocks.html">Work Queue Deadlocks</a></li>
+<li class="toctree-l3"><a class="reference internal" href="tcp_network_perf.html">TCP Network Performance</a></li>
+<li class="toctree-l3"><a class="reference internal" href="delay_act_and_tcp_perf.html">Delayed ACK and TCP Performance</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../mm/index.html">Memory Management</a></li>
diff --git a/content/docs/latest/components/net/slip.html b/content/docs/latest/components/net/slip.html
index f993ed0ae..c4b8a234c 100644
--- a/content/docs/latest/components/net/slip.html
+++ b/content/docs/latest/components/net/slip.html
@@ -144,6 +144,8 @@
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="wqueuedeadlocks.html">Work Queue Deadlocks</a></li>
+<li class="toctree-l3"><a class="reference internal" href="tcp_network_perf.html">TCP Network Performance</a></li>
+<li class="toctree-l3"><a class="reference internal" href="delay_act_and_tcp_perf.html">Delayed ACK and TCP Performance</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../mm/index.html">Memory Management</a></li>
diff --git a/content/docs/latest/components/net/socketcan.html b/content/docs/latest/components/net/socketcan.html
index fdee61094..b7269aa54 100644
--- a/content/docs/latest/components/net/socketcan.html
+++ b/content/docs/latest/components/net/socketcan.html
@@ -141,6 +141,8 @@
<li class="toctree-l3"><a class="reference internal" href="netlink.html">Netlink Route support</a></li>
<li class="toctree-l3"><a class="reference internal" href="slip.html">SLIP</a></li>
<li class="toctree-l3"><a class="reference internal" href="wqueuedeadlocks.html">Work Queue Deadlocks</a></li>
+<li class="toctree-l3"><a class="reference internal" href="tcp_network_perf.html">TCP Network Performance</a></li>
+<li class="toctree-l3"><a class="reference internal" href="delay_act_and_tcp_perf.html">Delayed ACK and TCP Performance</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../mm/index.html">Memory Management</a></li>
diff --git a/content/docs/latest/components/net/tcp_network_perf.html b/content/docs/latest/components/net/tcp_network_perf.html
new file mode 100644
index 000000000..a638227e6
--- /dev/null
+++ b/content/docs/latest/components/net/tcp_network_perf.html
@@ -0,0 +1,405 @@
+<!--
+ 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>TCP Network Performance — NuttX latest documentation</title>
+ <link rel="stylesheet" type="text/css" href="../../_static/pygments.css" />
+ <link rel="stylesheet" type="text/css" href="../../_static/css/theme.css" />
+ <link rel="stylesheet" type="text/css" href="../../_static/copybutton.css" />
+ <link rel="stylesheet" type="text/css" href="../../_static/custom.css" />
+
+
+ <link rel="shortcut icon" href="../../_static/favicon.ico"/>
+ <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="Delayed ACK and TCP Performance" href="delay_act_and_tcp_perf.html" />
+ <link rel="prev" title="Work Queue Deadlocks" href="wqueuedeadlocks.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>
+
+ <option value="../../../12.6.0" >12.6.0</option>
+
+ <option value="../../../12.7.0" >12.7.0</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 current"><a class="reference internal" href="index.html">Network Support</a><ul class="current">
+<li class="toctree-l3"><a class="reference internal" href="sixlowpan.html">6LoWPAN</a></li>
+<li class="toctree-l3"><a class="reference internal" href="socketcan.html">SocketCAN Device Drivers</a></li>
+<li class="toctree-l3"><a class="reference internal" href="pkt.html">“Raw” packet socket support</a></li>
+<li class="toctree-l3"><a class="reference internal" href="ipfilter.html">IP Packet Filter</a></li>
+<li class="toctree-l3"><a class="reference internal" href="nat.html">Network Address Translation (NAT)</a></li>
+<li class="toctree-l3"><a class="reference internal" href="netdev.html">Network Devices</a></li>
+<li class="toctree-l3"><a class="reference internal" href="netdriver.html">Network Drivers</a></li>
+<li class="toctree-l3"><a class="reference internal" href="netguardsize.html">CONFIG_NET_GUARDSIZE</a></li>
+<li class="toctree-l3"><a class="reference internal" href="netlink.html">Netlink Route support</a></li>
+<li class="toctree-l3"><a class="reference internal" href="slip.html">SLIP</a></li>
+<li class="toctree-l3"><a class="reference internal" href="wqueuedeadlocks.html">Work Queue Deadlocks</a></li>
+<li class="toctree-l3 current"><a class="current reference internal" href="#">TCP Network Performance</a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#question">Question</a></li>
+<li class="toctree-l4"><a class="reference internal" href="#answer">Answer</a><ul>
+<li class="toctree-l5"><a class="reference internal" href="#source-of-performance-bottlenecks">Source of Performance Bottlenecks</a></li>
+<li class="toctree-l5"><a class="reference internal" href="#rfc-1122">RFC 1122</a></li>
+<li class="toctree-l5"><a class="reference internal" href="#tcpblaster">TCPBlaster</a></li>
+<li class="toctree-l5"><a class="reference internal" href="#what-about-receive-performance">What about Receive Performance?</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l3"><a class="reference internal" href="delay_act_and_tcp_perf.html">Delayed ACK and TCP Performance</a></li>
+</ul>
+</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"><a class="reference internal" href="../arch/index.html">Architecture-Specific Code</a></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>
+<li class="toctree-l1"><a class="reference internal" href="../../logos/index.html">NuttX Logos</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"><a href="index.html">Network Support</a></li>
+ <li class="breadcrumb-item active">TCP Network Performance</li>
+ <li class="wy-breadcrumbs-aside">
+ <a href="../../_sources/components/net/tcp_network_perf.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="tcp-network-performance">
+<h1>TCP Network Performance<a class="headerlink" href="#tcp-network-performance" title="Permalink to this heading"></a></h1>
+<div class="admonition warning">
+<p class="admonition-title">Warning</p>
+<p>Migrated from:
+<a class="reference external" href="https://cwiki.apache.org/confluence/display/NUTTX/TCP+Network+Performance">https://cwiki.apache.org/confluence/display/NUTTX/TCP+Network+Performance</a></p>
+</div>
+<p>(Abstracted and extended from a discussion from the NuttX Google group)</p>
+<section id="question">
+<h2>Question<a class="headerlink" href="#question" title="Permalink to this heading"></a></h2>
+<p>For some unknown reason, I am seeing poor TCP network performance.</p>
+</section>
+<section id="answer">
+<h2>Answer<a class="headerlink" href="#answer" title="Permalink to this heading"></a></h2>
+<p>First let’s talk about TCP send performance.</p>
+<section id="source-of-performance-bottlenecks">
+<h3>Source of Performance Bottlenecks<a class="headerlink" href="#source-of-performance-bottlenecks" title="Permalink to this heading"></a></h3>
+<p>General TCP send performance is not determined by the TCP stack as much
+as it is by the network device driver. Bad network performance is due
+to time lost <cite>BETWEEN</cite> packet transfers. The packet transfers themselves
+go at the wire speed*. So if you want to improve performance on a
+given network, you have to reduce time lost between transfers.
+There is no other way.</p>
+<p>Ignoring Ethernet issues like collisions, back-off delays,
+inter-packet gaps (IPG), etc.</p>
+<p>The time between packets is limited primarily by the buffering
+design of the network driver. If you want to improve performance,
+then you must improve the buffering at the network driver.
+You need to support many full size (1500 byte) packet buffers.
+You must be able to query the network for new data to transfer,
+and queue those transfers in packet buffers. In order to reach
+peak performance, the network driver must have the next transfer
+buffered and ready-to-go before the previous transfer is finished
+to minimize the GAP between packet transfers.</p>
+<p>Different network devices also support more or less efficient
+interfaces: The worst performing support interfaces that can
+handle only one packet at a time, the best performing are able
+to retain linked lists of packet buffers in memory and perform
+scatter-gather DMA for a sequence of packets.</p>
+<p>In the NuttX TCP stack, you can also improve performance by
+enabling TCP write buffering. But the driver is the real key.</p>
+<p>It would be good to have a real in-depth analysis of the
+network stack performance to identify bottlenecks and
+generate ideas for performance improvement. No one has
+ever done that. If I were aware of any stack related
+performance issue, I would certainly address it.</p>
+</section>
+<section id="rfc-1122">
+<h3>RFC 1122<a class="headerlink" href="#rfc-1122" title="Permalink to this heading"></a></h3>
+<p>There is one important feature missing the NuttX TCP that
+can help when there is no write buffering: Without write
+buffering send() will not return until the transfer has
+been ACKed by the recipient. But under RFC 1122, the host
+need not ACK each packet immediately; the host may wait
+for 500 MS before ACKing. This combination can cause very
+slow performance when small, non-buffered transfers are
+made to an RFC 1122 client. However, the RFC 1122 must
+ACK at least every second (odd) packet so sequences of
+packets with write buffering enabled do not suffer from
+this problem.</p>
+<p><cite>Update: RFC 1122 support was added to the NuttX TCP
+stack with commit 66ef6d143a627738ad7f3ce1c065f9b1f3f303b0
+in December of 2019. That, however, that affects only
+received packet ACK behavior and has no impact on transmitted
+packet performance; write buffering is still recommended.</cite></p>
+</section>
+<section id="tcpblaster">
+<h3>TCPBlaster<a class="headerlink" href="#tcpblaster" title="Permalink to this heading"></a></h3>
+<p>I created a new test application at <code class="docutils literal notranslate"><span class="pre">apps/examples/tcpblaster</span></code> to
+measure TCP performance and collected some data for the
+configuration that happens to be on my desk. The <cite>tcpblaster</cite>
+test gives you the read and write transfer rates in <code class="docutils literal notranslate"><span class="pre">Kb/sec</span></code>
+(I won’t mention the numbers because I don’t believe they
+would translate any other setup and, hence, would be
+misleading).</p>
+<p>There is a nifty <a class="reference external" href="https://www.switch.ch/network/tools/tcp_throughput/">TCP Throughput Tool</a>
+that gives some theoretical upper limits on performance.
+The tool needs to know the <code class="docutils literal notranslate"><span class="pre">MSS</span></code> (which is the Ethernet
+packet size that you configured minus the size of the
+Ethernet header, 14), the round-trip time (<code class="docutils literal notranslate"><span class="pre">RTT</span></code>)in
+milliseconds (which you can
+get from the Linux host ping), and a loss constant (which
+I left at the default). With these values, I can determine
+that the throughput for the NuttX TCP stack is approximately
+at the theoretical limits. You should not be able to do
+better any better than that (actually, it performs above
+the theoretical limit, but I suppose that is why it is
+“theoretical”).</p>
+<p>So, If you are unhappy with your network performance, the I
+suggest you run the <cite>tcpblaster</cite> test, use that data
+(along with the <code class="docutils literal notranslate"><span class="pre">RTT</span></code> from ping) with the
+<a class="reference external" href="https://www.switch.ch/network/tools/tcp_throughput/">TCP Throughput Tool</a>.
+If you are still unhappy with the performance, don’t go
+immediately pointing fingers at the stack (which everyone does).
+Instead, you should focus on optimizing your network
+configuration settings and reviewing the buffer handling
+of the Ethernet driver in you MCU.</p>
+<p>If you do discover any significant performance issues
+with the stack I will of course gladly help you resolve
+them. Or if you have ideas for improved performance,
+I would also be happy to hear those.</p>
+</section>
+<section id="what-about-receive-performance">
+<h3>What about Receive Performance?<a class="headerlink" href="#what-about-receive-performance" title="Permalink to this heading"></a></h3>
+<p>All of the above discussion concerns <cite>transmit performance</cite>,
+i.e., “How fast can we send data over the network?” The other
+side is receive performance. Receive performance is very
+different thing. In this case it is the remote peer who is
+in complete control of the rate at which packets appear on
+the network and, hence, responsible for all of the raw bit
+transfer rates.</p>
+<p>However, we might also redefine performance as the number of
+bytes that were <cite>successfully</cite> transferred. In order for the
+bytes to be successfully transferred they must be successfully
+received and processed on the NuttX target. If we fail in
+this if the packet is <cite>lost</cite> or <cite>dropped</cite>. A packet is lost if
+the network driver is not prepared to receive the packet when
+it was sent. A packet is dropped by the network if it is
+received but could not be processed either because there
+is some logical issue with the packet (not the case here)
+or if we have no space to buffer the newly received packet.</p>
+<p>If a TCP packet is lost or dropped, then the penalty is big:
+The packet will not be ACKed, the remote peer may send a
+few more out-of-sequence packets which will also be dropped.
+Eventually, the remote peer will time out and retransmit
+the data from the point of the lost packet.</p>
+<p>There is logic in the TCP protocol to help manage these data
+overruns. The TCP header includes a TCP <cite>receive window</cite> which
+tells the remote peer how much data the receiver is able to
+buffer. This value is sent in the ACK to each received
+packet. If well tuned, this receive window could possibly
+prevent packets from being lost due to the lack of
+read-ahead storage. This is a little better. The remote
+peer will hold off sending data instead of timing out and
+re-transmitting. But this is still a loss of performance;
+the gap between the transfer of packets caused by the hold-off
+will result in a reduced transfer rate.</p>
+<p>So the issues for good reception are buffering and processing
+time. Buffering again applies to handling within the driver
+but unlike the transmit performance, this is not typically
+the bottleneck. And there is also a NuttX configuration
+option that controls <cite>read-ahead</cite> buffering of TCP packets.
+The buffering in the driver must be optimized to avoid lost
+packets; the ` buffering can be tuned to minimize
+the number packets dropped because we have no space to buffer them.</p>
+<p>But the key to receive perform is management of processing
+delays. Small processing delays can occur in the network
+driver or in the TCP stack. But the major source of
+processing delay is the application which is the ultimate
+consumer of the incoming data. Imagine, for example,
+and FTP application that is receiving a file over a
+TCP and writing the file into FLASH memory. The primary
+bottleneck here will be the write to FLASH memory which
+is out of the control of software.</p>
+<p>We obtain optimal receive performance when the processing
+delays keep up with the rate of the incoming packets.
+If the processing data rate is even slightly slower
+then the receive data rate, then there will be a
+growing <cite>backlog</cite> of buffered, incoming data to be
+processed. If this backlog continues to grow then
+eventually our ability to buffer data will be exhausted,
+packets will be held off or dropped, and performance
+will deteriorate. In an environment where a high-end,
+remote peer is interacting with the low-end, embedded
+system, that remote peer can easily overrun the
+embedded system due to the embedded system’s limited
+buffering space, its much lower processing capability,
+and its slower storage peripherals.</p>
+</section>
+</section>
+</section>
+
+
+ </div>
+ </div>
+ <footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
+ <a href="wqueuedeadlocks.html" class="btn btn-neutral float-left" title="Work Queue Deadlocks" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
+ <a href="delay_act_and_tcp_perf.html" class="btn btn-neutral float-right" title="Delayed ACK and TCP Performance" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
+ </div>
+
+ <hr/>
+
+ <div role="contentinfo">
+ <p>© Copyright 2023, The Apache Software Foundation.</p>
+ </div>
+
+
+
+</footer>
+ </div>
+ </div>
+ </section>
+ </div>
+ <script>
+ jQuery(function () {
+ SphinxRtdTheme.Navigation.enable(true);
+ });
+ </script>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/content/docs/latest/components/net/wqueuedeadlocks.html b/content/docs/latest/components/net/wqueuedeadlocks.html
index d2d71788e..44586827f 100644
--- a/content/docs/latest/components/net/wqueuedeadlocks.html
+++ b/content/docs/latest/components/net/wqueuedeadlocks.html
@@ -43,7 +43,7 @@
<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="Memory Management" href="../mm/index.html" />
+ <link rel="next" title="TCP Network Performance" href="tcp_network_perf.html" />
<link rel="prev" title="SLIP" href="slip.html" />
</head>
@@ -150,6 +150,8 @@
<li class="toctree-l4"><a class="reference internal" href="#alternatives-to-work-queues">Alternatives to Work Queues</a></li>
</ul>
</li>
+<li class="toctree-l3"><a class="reference internal" href="tcp_network_perf.html">TCP Network Performance</a></li>
+<li class="toctree-l3"><a class="reference internal" href="delay_act_and_tcp_perf.html">Delayed ACK and TCP Performance</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../mm/index.html">Memory Management</a></li>
@@ -359,7 +361,7 @@ the lock is recovered. Your design should account for this possibility.</p>
</div>
<footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
<a href="slip.html" class="btn btn-neutral float-left" title="SLIP" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
- <a href="../mm/index.html" class="btn btn-neutral float-right" title="Memory Management" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
+ <a href="tcp_network_perf.html" class="btn btn-neutral float-right" title="TCP Network Performance" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
</div>
<hr/>
diff --git a/content/docs/latest/components/nxgraphics/appendix.html b/content/docs/latest/components/nxgraphics/appendix.html
index aee202307..3ce4ae6d4 100644
--- a/content/docs/latest/components/nxgraphics/appendix.html
+++ b/content/docs/latest/components/nxgraphics/appendix.html
@@ -133,6 +133,8 @@
<li class="toctree-l4"><a class="reference internal" href="nxtk.html">NX Tool Kit (<code class="docutils literal notranslate"><span class="pre">NXTK</span></code>)</a></li>
<li class="toctree-l4"><a class="reference internal" href="nxfonts.html">NX Fonts Support (<code class="docutils literal notranslate"><span class="pre">NXFONTS</span></code>)</a></li>
<li class="toctree-l4"><a class="reference internal" href="nxcursor.html">NX Cursor Support (<code class="docutils literal notranslate"><span class="pre">NXCURSOR</span></code>)</a></li>
+<li class="toctree-l4"><a class="reference internal" href="nxwm_threading.html">NxWM Threading</a></li>
+<li class="toctree-l4"><a class="reference internal" href="framebuffer_char_driver.html">Framebuffer Character Driver</a></li>
<li class="toctree-l4"><a class="reference internal" href="sample.html">Sample Code</a></li>
<li class="toctree-l4 current"><a class="current reference internal" href="#">Appendix</a><ul>
<li class="toctree-l5"><a class="reference internal" href="#graphics-directory-structure"><code class="docutils literal notranslate"><span class="pre">graphics/</span></code> Directory Structure</a></li>
diff --git a/content/docs/latest/components/nxgraphics/framebuffer_char_driver.html b/content/docs/latest/components/nxgraphics/framebuffer_char_driver.html
new file mode 100644
index 000000000..ad656ecf1
--- /dev/null
+++ b/content/docs/latest/components/nxgraphics/framebuffer_char_driver.html
@@ -0,0 +1,590 @@
+<!--
+ 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>Framebuffer Character Driver — NuttX latest documentation</title>
+ <link rel="stylesheet" type="text/css" href="../../_static/pygments.css" />
+ <link rel="stylesheet" type="text/css" href="../../_static/css/theme.css" />
+ <link rel="stylesheet" type="text/css" href="../../_static/copybutton.css" />
+ <link rel="stylesheet" type="text/css" href="../../_static/custom.css" />
+
+
+ <link rel="shortcut icon" href="../../_static/favicon.ico"/>
+ <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="Sample Code" href="sample.html" />
+ <link rel="prev" title="NxWM Threading" href="nxwm_threading.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>
+
+ <option value="../../../12.6.0" >12.6.0</option>
+
+ <option value="../../../12.7.0" >12.7.0</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 current"><a class="reference internal" href="index.html">NX Graphics Subsystem</a><ul class="current">
+<li class="toctree-l3"><a class="reference internal" href="index.html#objectives">Objectives</a></li>
+<li class="toctree-l3"><a class="reference internal" href="index.html#organization">Organization</a></li>
+<li class="toctree-l3 current"><a class="reference internal" href="index.html#nx-header-files">NX Header Files</a><ul class="current">
+<li class="toctree-l4"><a class="reference internal" href="nxgl.html">NX Graphics Library (<code class="docutils literal notranslate"><span class="pre">NXGL</span></code>)</a></li>
+<li class="toctree-l4"><a class="reference internal" href="nx.html">NX</a></li>
+<li class="toctree-l4"><a class="reference internal" href="nxtk.html">NX Tool Kit (<code class="docutils literal notranslate"><span class="pre">NXTK</span></code>)</a></li>
+<li class="toctree-l4"><a class="reference internal" href="nxfonts.html">NX Fonts Support (<code class="docutils literal notranslate"><span class="pre">NXFONTS</span></code>)</a></li>
+<li class="toctree-l4"><a class="reference internal" href="nxcursor.html">NX Cursor Support (<code class="docutils literal notranslate"><span class="pre">NXCURSOR</span></code>)</a></li>
+<li class="toctree-l4"><a class="reference internal" href="nxwm_threading.html">NxWM Threading</a></li>
+<li class="toctree-l4 current"><a class="current reference internal" href="#">Framebuffer Character Driver</a><ul>
+<li class="toctree-l5"><a class="reference internal" href="#nx-graphics">NX Graphics</a></li>
+<li class="toctree-l5"><a class="reference internal" href="#figure-1">Figure 1</a></li>
+<li class="toctree-l5"><a class="reference internal" href="#framebuffer-character-driver-details">Framebuffer Character Driver details</a></li>
+<li class="toctree-l5"><a class="reference internal" href="#posix-interfaces">POSIX Interfaces</a></li>
+<li class="toctree-l5"><a class="reference internal" href="#ioctl-commands">IOCTL Commands</a></li>
+<li class="toctree-l5"><a class="reference internal" href="#mmap"><code class="docutils literal notranslate"><span class="pre">mmap()</span></code></a></li>
+<li class="toctree-l5"><a class="reference internal" href="#framebuffer-vs-lcd-graphics-drivers">Framebuffer vs. LCD Graphics Drivers</a></li>
+<li class="toctree-l5"><a class="reference internal" href="#lcd-framebuffer-front-end">LCD Framebuffer Front-End</a></li>
+<li class="toctree-l5"><a class="reference internal" href="#framebuffer-graphics-library">Framebuffer Graphics Library</a></li>
+</ul>
+</li>
+<li class="toctree-l4"><a class="reference internal" href="sample.html">Sample Code</a></li>
+<li class="toctree-l4"><a class="reference internal" href="appendix.html">Appendix</a></li>
+</ul>
+</li>
+</ul>
+</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"><a class="reference internal" href="../arch/index.html">Architecture-Specific Code</a></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>
+<li class="toctree-l1"><a class="reference internal" href="../../logos/index.html">NuttX Logos</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"><a href="index.html">NX Graphics Subsystem</a></li>
+ <li class="breadcrumb-item active">Framebuffer Character Driver</li>
+ <li class="wy-breadcrumbs-aside">
+ <a href="../../_sources/components/nxgraphics/framebuffer_char_driver.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="framebuffer-character-driver">
+<h1>Framebuffer Character Driver<a class="headerlink" href="#framebuffer-character-driver" title="Permalink to this heading"></a></h1>
+<div class="admonition warning">
+<p class="admonition-title">Warning</p>
+<p>Migrated from:
+<a class="reference external" href="https://cwiki.apache.org/confluence/display/NUTTX/Framebuffer+Character+Driver">https://cwiki.apache.org/confluence/display/NUTTX/Framebuffer+Character+Driver</a></p>
+</div>
+<section id="nx-graphics">
+<h2>NX Graphics<a class="headerlink" href="#nx-graphics" title="Permalink to this heading"></a></h2>
+<p>NuttX has supported higher level graphics for some time with
+the OS’s <a class="reference internal" href="index.html"><span class="doc">NX Graphics Subsystem</span></a> and application
+oriented <a class="reference internal" href="../../applications/graphics/nxwidgets/index.html"><span class="doc">NxWidgets</span></a> and the tiny
+window manager <a class="reference internal" href="../../applications/graphics/nxwm/index.html"><span class="doc">NxWM</span></a>.
+These are higher level in the sense that the primary
+graphical function is to support windowing and control
+of tools and toolbars within windows. These graphics
+tools often do not meet the needs
+of developers with very low end graphics and minimal display
+requirements.</p>
+</section>
+<section id="figure-1">
+<h2>Figure 1<a class="headerlink" href="#figure-1" title="Permalink to this heading"></a></h2>
+<p>The framebuffer character driver, along with the option LCD
+framebuffer interface, is an optional lighter-weight graphics interface.</p>
+<img alt="../../_images/GraphicsInterfaces.png" src="../../_images/GraphicsInterfaces.png" />
+</section>
+<section id="framebuffer-character-driver-details">
+<h2>Framebuffer Character Driver details<a class="headerlink" href="#framebuffer-character-driver-details" title="Permalink to this heading"></a></h2>
+<p>A <cite>framebuffer character driver</cite> has been recently been added
+to bypass the complexity of <cite>NX</cite> and to provide a direct
+application interface to the framebuffer graphic device.
+The framebuffer buffer character devices, as with all
+character devices, provides the interface to the graphics
+device via stand POSIX VFS commands (<code class="docutils literal notranslate"><span class="pre">open()</span></code>, <code class="docutils literal notranslate"><span class="pre">close()</span></code>,
+<code class="docutils literal notranslate"><span class="pre">read()</span></code>, <code class="docutils literal notranslate"><span class="pre">write()</span></code>, <code class="docutils literal notranslate"><span class="pre">seek()</span></code>, …), through IOCTL commands,
+and for this driver via the <code class="docutils literal notranslate"><span class="pre">mmap()</span></code> function. These
+interfaces are described below,</p>
+<p>The framebuffer character driver is located in the NuttX
+source tree at <code class="docutils literal notranslate"><span class="pre">drivers/video/fb.c</span></code>. It is enabled in the
+build with <code class="docutils literal notranslate"><span class="pre">CONFIG_VIDEO_FB=y</span></code>. In order to register the
+framebuffer driver, you will need to include logic in the
+your board-specific start-up function that calls
+<code class="docutils literal notranslate"><span class="pre">fb_register()</span></code> That code sequence might look something
+like:</p>
+<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="cp">#include</span><span class="w"> </span><span class="cpf"><nuttx/video/fb.h></span>
+
+<span class="cp">#ifdef CONFIG_VIDEO_FB</span>
+<span class="cm">/* Initialize and register the simulated framebuffer driver */</span>
+
+<span class="n">ret</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">fb_register</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">);</span>
+<span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">ret</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="mi">0</span><span class="p">)</span>
+<span class="w"> </span><span class="p">{</span>
+<span class="w"> </span><span class="n">syslog</span><span class="p">(</span><span class="n">LOG_ERR</span><span class="p">,</span><span class="w"> </span><span class="s">"ERROR: fb_register() failed: %d</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span><span class="w"> </span><span class="n">ret</span><span class="p">);</span>
+<span class="w"> </span><span class="p">}</span>
+<span class="cp">#endif</span>
+</pre></div>
+</div>
+<p>The <code class="docutils literal notranslate"><span class="pre">fb_register()</span></code> function takes two parameters:</p>
+<ul class="simple">
+<li><p><cite>display</cite>. The display number for the case of boards
+supporting multiple displays or for hardware that supports
+multiple layers (each layer is consider a display). Typically zero.</p></li>
+<li><p><cite>plane</cite>. Identifies the color plane on hardware that supports
+separate framebuffer “planes” for each color component.
+Should be zero because no planar hardware is currently
+supported by NuttX.</p></li>
+</ul>
+<p><code class="docutils literal notranslate"><span class="pre">fb_register()</span></code> will register the framebuffer character device
+at <code class="docutils literal notranslate"><span class="pre">/dev/fb</span></code> <cite>N</cite> where <cite>N</cite> is the display number if the devices
+supports only a single plane. If the hardware supports
+multiple color planes, then the device will be registered
+at <code class="docutils literal notranslate"><span class="pre">/dev/fb</span></code> <cite>N-M</cite> where <cite>N</cite> is the again display number but <cite>M</cite>
+is the display plane.</p>
+<p>There is a simple example at <code class="docutils literal notranslate"><span class="pre">apps/examples/fb</span></code> that provides
+an illustration of most of the following interfacing methods.</p>
+</section>
+<section id="posix-interfaces">
+<h2>POSIX Interfaces<a class="headerlink" href="#posix-interfaces" title="Permalink to this heading"></a></h2>
+<p>The interaction with the framebuffer character driver via POSIX
+VFS interface calls is the same as for other character drivers.
+The only aspect that might require some additional discussion
+is the use of <code class="docutils literal notranslate"><span class="pre">read()</span></code>, <code class="docutils literal notranslate"><span class="pre">write()</span></code>, and <code class="docutils literal notranslate"><span class="pre">seek()</span></code>.</p>
+<ul class="simple">
+<li><p><code class="docutils literal notranslate"><span class="pre">read()</span></code> returns data from the framebuffer memory and
+updates the file position based on the number of bytes read.</p></li>
+<li><p><code class="docutils literal notranslate"><span class="pre">write()</span></code> puts data into the framebuffer memory and
+also updates the file position.</p></li>
+</ul>
+<p>That file position is initially set to the position
+zero meaning the beginning of the framebuffer. It is
+advanced each time you <code class="docutils literal notranslate"><span class="pre">read()</span></code> from or <code class="docutils literal notranslate"><span class="pre">write()</span></code> to the
+framebuffer. Is also updated by <code class="docutils literal notranslate"><span class="pre">seek()</span></code>:</p>
+<ul class="simple">
+<li><p><code class="docutils literal notranslate"><span class="pre">seek()</span></code> sets the file position to any desired
+location within the framebuffer.</p></li>
+</ul>
+<p>The file position is in units of <cite>bytes</cite>. This can be
+confusing because other positional data may be in units
+<cite>pixels</cite>. Pixels have different <cite>depth</cite> in different displays,
+that is, different graphic hardware may support pixels with
+differing bits-per-pixel. The pixel depth can be obtained
+using one of the IOCTL commands listed below. Since the file
+position is in bytes, the bits-per-pixel must be taken account
+when using <code class="docutils literal notranslate"><span class="pre">read()</span></code>, <code class="docutils literal notranslate"><span class="pre">write()</span></code>, and <code class="docutils literal notranslate"><span class="pre">seek()</span></code>. The usual conversion
+from pixels to bytes is:</p>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="n">start_byte</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">start_pixel</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">bits_per_pixel</span><span class="p">)</span><span class="w"> </span><span class="o">>></span><span class="w"> </span><span class="mi">3</span><span class="p [...]
+<span class="n">end_byte</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">end_pixel</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">bits_per_pixel</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">7</span><span class="p">)</span><span class="w"> </span><span class="o">>></span><span class="w"> </span><span class="mi">3</sp [...]
+</pre></div>
+</div>
+<p>While the framebuffer may be accessed with these POSIX interfaces,
+a more typical way of interacting with the framebuffer from an
+application would involve use of <code class="docutils literal notranslate"><span class="pre">mmap()</span></code> as described below.</p>
+</section>
+<section id="ioctl-commands">
+<h2>IOCTL Commands<a class="headerlink" href="#ioctl-commands" title="Permalink to this heading"></a></h2>
+<ul>
+<li><p><code class="docutils literal notranslate"><span class="pre">FBIOGET_VIDEOINFO</span></code>. Get color plane info. Its argument is
+pointer a writable instance of <code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">fb_videoinfo_s</span></code>:</p>
+<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="k">struct</span><span class="w"> </span><span class="nc">fb_videoinfo_s</span>
+<span class="p">{</span>
+<span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">fmt</span><span class="p">;</span><span class="w"> </span><span class="cm">/* see FB_FMT_* */</span>
+<span class="w"> </span><span class="n">fb_coord_t</span><span class="w"> </span><span class="n">xres</span><span class="p">;</span><span class="w"> </span><span class="cm">/* Horizontal resolution in pixel columns */</span>
+<span class="w"> </span><span class="n">fb_coord_t</span><span class="w"> </span><span class="n">yres</span><span class="p">;</span><span class="w"> </span><span class="cm">/* Vertical resolution in pixel rows */</span>
+<span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">nplanes</span><span class="p">;</span><span class="w"> </span><span class="cm">/* Number of color planes supported */</span>
+<span class="p">};</span>
+</pre></div>
+</div>
+</li>
+<li><p><code class="docutils literal notranslate"><span class="pre">FBIOGET_PLANEINFO</span></code>. Get video plane info. It received
+a pointer to a writable instance of <code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">fb_planeinfo_s</span></code> as its argument:</p>
+<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="k">struct</span><span class="w"> </span><span class="nc">fb_planeinfo_s</span>
+<span class="p">{</span>
+<span class="w"> </span><span class="n">FAR</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="o">*</span><span class="n">fbmem</span><span class="p">;</span><span class="w"> </span><span class="cm">/* Start of frame buffer memory */</span>
+<span class="w"> </span><span class="kt">uint32_t</span><span class="w"> </span><span class="n">fblen</span><span class="p">;</span><span class="w"> </span><span class="cm">/* Length of frame buffer memory in bytes */</span>
+<span class="w"> </span><span class="n">fb_coord_t</span><span class="w"> </span><span class="n">stride</span><span class="p">;</span><span class="w"> </span><span class="cm">/* Length of a line in bytes */</span>
+<span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">display</span><span class="p">;</span><span class="w"> </span><span class="cm">/* Display number */</span>
+<span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">bpp</span><span class="p">;</span><span class="w"> </span><span class="cm">/* Bits per pixel */</span>
+<span class="p">};</span>
+</pre></div>
+</div>
+</li>
+<li><p><code class="docutils literal notranslate"><span class="pre">FBIOGET_CMAP</span></code> and <code class="docutils literal notranslate"><span class="pre">FBIOPUT_CMAP</span></code>. Get/Put RGB color mapping.
+These commands are available only if the hardware and
+framebuffer driver support color mapping (<code class="docutils literal notranslate"><span class="pre">CONFIG_FB_CMAP=y</span></code>).
+They each take a pointer to an instance of <code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">fb_cmap_s</span></code>
+as an argument (writeable for <code class="docutils literal notranslate"><span class="pre">FBIOGET_CMAP</span></code> and read-only
+for <code class="docutils literal notranslate"><span class="pre">FBIOPUT_CMAP</span></code>).</p>
+<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="cp">#ifdef CONFIG_FB_CMAP</span>
+<span class="k">struct</span><span class="w"> </span><span class="nc">fb_cmap_s</span>
+<span class="p">{</span>
+<span class="w"> </span><span class="kt">uint16_t</span><span class="w"> </span><span class="n">first</span><span class="p">;</span><span class="w"> </span><span class="cm">/* Offset offset first color entry in tables */</span>
+<span class="w"> </span><span class="kt">uint16_t</span><span class="w"> </span><span class="n">len</span><span class="p">;</span><span class="w"> </span><span class="cm">/* Number of color entries in tables */</span>
+
+<span class="w"> </span><span class="cm">/* Tables of color component. Any may be NULL if not used */</span>
+
+<span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="o">*</span><span class="n">red</span><span class="p">;</span><span class="w"> </span><span class="cm">/* Table of 8-bit red values */</span>
+<span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="o">*</span><span class="n">green</span><span class="p">;</span><span class="w"> </span><span class="cm">/* Table of 8-bit green values */</span>
+<span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="o">*</span><span class="n">blue</span><span class="p">;</span><span class="w"> </span><span class="cm">/* Table of 8-bit blue values */</span>
+<span class="cp">#ifdef CONFIG_FB_TRANSPARENCY</span>
+<span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="o">*</span><span class="n">transp</span><span class="p">;</span><span class="w"> </span><span class="cm">/* Table of 8-bit transparency */</span>
+<span class="cp">#endif</span>
+<span class="p">};</span>
+<span class="cp">#endif</span>
+</pre></div>
+</div>
+</li>
+<li><p><code class="docutils literal notranslate"><span class="pre">FBIOGET_CURSOR</span></code>. Get cursor attributes. This command is
+available only if the hardware and framebuffer driver
+support cursors (<code class="docutils literal notranslate"><span class="pre">CONFIG_FB_HWCURSOR=y</span></code>). It take a pointer
+to a writable instance of <code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">fb_cursorattrib_s</span></code>:</p>
+<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="cp">#ifdef CONFIG_FB_HWCURSOR</span>
+<span class="cp">#ifdef CONFIG_FB_HWCURSORIMAGE</span>
+<span class="k">struct</span><span class="w"> </span><span class="nc">fb_cursorimage_s</span>
+<span class="p">{</span>
+<span class="w"> </span><span class="n">fb_coord_t</span><span class="w"> </span><span class="n">width</span><span class="p">;</span><span class="w"> </span><span class="cm">/* Width of the cursor image in pixels */</span>
+<span class="w"> </span><span class="n">fb_coord_t</span><span class="w"> </span><span class="n">height</span><span class="w"> </span><span class="cm">/* Height of the cursor image in pixels */</span>
+<span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="o">*</span><span class="n">image</span><span class="p">;</span><span class="w"> </span><span class="cm">/* Pointer to image data */</span>
+<span class="p">};</span>
+<span class="cp">#endif</span>
+
+<span class="k">struct</span><span class="w"> </span><span class="nc">fb_cursorpos_s</span>
+<span class="p">{</span>
+<span class="w"> </span><span class="n">fb_coord_t</span><span class="w"> </span><span class="n">x</span><span class="p">;</span><span class="w"> </span><span class="cm">/* X position in pixels */</span>
+<span class="w"> </span><span class="n">fb_coord_t</span><span class="w"> </span><span class="n">y</span><span class="p">;</span><span class="w"> </span><span class="cm">/* Y position in rows */</span>
+<span class="p">};</span>
+
+<span class="cp">#ifdef CONFIG_FB_HWCURSORSIZE</span>
+<span class="k">struct</span><span class="w"> </span><span class="nc">fb_cursorsize_s</span>
+<span class="p">{</span>
+<span class="w"> </span><span class="n">fb_coord_t</span><span class="w"> </span><span class="n">h</span><span class="p">;</span><span class="w"> </span><span class="cm">/* Height in rows */</span>
+<span class="w"> </span><span class="n">fb_coord_t</span><span class="w"> </span><span class="n">w</span><span class="p">;</span><span class="w"> </span><span class="cm">/* Width in pixels */</span>
+<span class="p">};</span>
+<span class="cp">#endif</span>
+
+<span class="k">struct</span><span class="w"> </span><span class="nc">fb_cursorattrib_s</span>
+<span class="p">{</span>
+<span class="cp">#ifdef CONFIG_FB_HWCURSORIMAGE</span>
+<span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">fmt</span><span class="p">;</span><span class="w"> </span><span class="cm">/* Video format of cursor */</span>
+<span class="cp">#endif</span>
+<span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">fb_cursorpos_s</span><span class="w"> </span><span class="n">pos</span><span class="p">;</span><span class="w"> </span><span class="cm">/* Current cursor position */</span>
+<span class="cp">#ifdef CONFIG_FB_HWCURSORSIZE</span>
+<span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">fb_cursorsize_s</span><span class="w"> </span><span class="n">mxsize</span><span class="p">;</span><span class="w"> </span><span class="cm">/* Maximum cursor size */</span>
+<span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">fb_cursorsize_s</span><span class="w"> </span><span class="n">size</span><span class="p">;</span><span class="w"> </span><span class="cm">/* Current size */</span>
+<span class="cp">#endif</span>
+<span class="p">};</span>
+<span class="cp">#endif</span>
+</pre></div>
+</div>
+</li>
+<li><p><code class="docutils literal notranslate"><span class="pre">FBIOPUT_CURSOR</span></code>. Set cursor attributes. This command is
+available only if the hardware and framebuffer driver
+support cursors (<code class="docutils literal notranslate"><span class="pre">CONFIG_FB_HWCURSOR=y</span></code>). It take a
+pointer to a writable instance of <code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">fb_setcursor_s</span></code>:</p>
+<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="cp">#ifdef CONFIG_FB_HWCURSOR</span>
+<span class="k">struct</span><span class="w"> </span><span class="nc">fb_setcursor_s</span>
+<span class="p">{</span>
+<span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">flags</span><span class="p">;</span><span class="w"> </span><span class="cm">/* See FB_CUR_* definitions */</span>
+<span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">fb_cursorpos_s</span><span class="w"> </span><span class="n">pos</span><span class="p">;</span><span class="w"> </span><span class="cm">/* Cursor position */</span>
+<span class="cp">#ifdef CONFIG_FB_HWCURSORSIZE</span>
+<span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">fb_cursorsize_s</span><span class="w"> </span><span class="n">size</span><span class="p">;</span><span class="w"> </span><span class="cm">/* Cursor size */</span>
+<span class="cp">#endif</span>
+<span class="cp">#ifdef CONFIG_FB_HWCURSORIMAGE</span>
+<span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">fb_cursorimage_s</span><span class="w"> </span><span class="n">img</span><span class="p">;</span><span class="w"> </span><span class="cm">/* Cursor image */</span>
+<span class="cp">#endif</span>
+<span class="p">};</span>
+<span class="cp">#endif</span>
+</pre></div>
+</div>
+</li>
+<li><p><code class="docutils literal notranslate"><span class="pre">FBIO_UPDATE</span></code>. This IOCTL command updates a rectangular region
+in the framebuffer. Some hardware requires that there be
+such a notification when a change is made to the
+framebuffer (see, for example, the discussion of LCD drivers
+below). This IOTCL command is if <code class="docutils literal notranslate"><span class="pre">CONFIG_NX_UPDATE=y</span></code> is
+defined. It takes a pointer to a read-only instance of
+<code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">nxgl_rect_s</span></code> that describes the region to be updated:</p>
+<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="k">struct</span><span class="w"> </span><span class="nc">nxgl_rect_s</span>
+<span class="p">{</span>
+<span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">nxgl_point_s</span><span class="w"> </span><span class="n">pt1</span><span class="p">;</span><span class="w"> </span><span class="cm">/* Upper, left-hand corner */</span>
+<span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">nxgl_point_s</span><span class="w"> </span><span class="n">pt2</span><span class="p">;</span><span class="w"> </span><span class="cm">/* Lower, right-hand corner */</span>
+<span class="p">};</span>
+</pre></div>
+</div>
+</li>
+</ul>
+</section>
+<section id="mmap">
+<h2><code class="docutils literal notranslate"><span class="pre">mmap()</span></code><a class="headerlink" href="#mmap" title="Permalink to this heading"></a></h2>
+<p>Above we talked about using <code class="docutils literal notranslate"><span class="pre">read()</span></code>, <code class="docutils literal notranslate"><span class="pre">write()</span></code>, and <code class="docutils literal notranslate"><span class="pre">seek()</span></code> to
+access the framebuffer. The simplest way to access the
+framebuffer, however, is by using the <code class="docutils literal notranslate"><span class="pre">mmap()</span></code> to map
+the framebuffer memory into the application memory
+space. The following <code class="docutils literal notranslate"><span class="pre">mmap()</span></code> command, for example, can
+be used to obtain a pointer to a read-able, write-able
+copy of the framebuffer:</p>
+<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="n">FAR</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="o">*</span><span class="n">fbmem</span><span class="p">;</span>
+
+<span class="n">fbmem</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">mmap</span><span class="p">(</span><span class="nb">NULL</span><span class="p">,</span><span class="w"> </span><span class="n">fblen</span><span class="p">,</span><span class="w"> </span><span class="n">PROT_READ</span><span class="o">|</span><span class="n">PROT_WRITE</span><span class="p">,</span><span class="w"> </span><span class="n">MAP_SHARED</span><span class="o">|</ [...]
+<span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">state</span><span class="p">.</span><span class="n">fbmem</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">MAP_FAILED</span><span class="p">)</span>
+<span class="p">{</span>
+<span class="w"> </span><span class="cm">/* Handle failure */</span>
+<span class="w"> </span><span class="p">...</span>
+<span class="p">}</span>
+
+<span class="n">printf</span><span class="p">(</span><span class="s">"Mapped FB: %p</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span><span class="w"> </span><span class="n">fbmem</span><span class="p">);</span>
+</pre></div>
+</div>
+<p>Where fd is the file descriptor of the opened framebuffer
+character driver and <code class="docutils literal notranslate"><span class="pre">fblen</span></code> was obtained via an IOCTL
+command as described above. NOTE that the framebuffer
+buffer pointer is also available within the values
+returned by the IOCTL commands. The address is a
+kernel memory address and may not be valid in all
+build configurations. Hence, <code class="docutils literal notranslate"><span class="pre">mmap()</span></code> is the preferred,
+portable way to get the framebuffer address.</p>
+</section>
+<section id="framebuffer-vs-lcd-graphics-drivers">
+<h2>Framebuffer vs. LCD Graphics Drivers<a class="headerlink" href="#framebuffer-vs-lcd-graphics-drivers" title="Permalink to this heading"></a></h2>
+<p>Framebuffer graphics drivers are very common in high-end CPUs
+but most low-end, embedded hardware will not support a
+framebuffer.</p>
+<p>A framebuffer graphics driver supports a region of memory
+that is shared both by the software and by the graphics
+hardware. Any modification to the framebuffer memory
+results in a corresponding modification on the display
+with no intervening software interaction. Some video
+memory is dual ported to support concurrent video processor
+and application processor accesses; or perhaps the LCD
+peripheral just constantly DMAs the framebuffer memory
+to the graphics hardware.</p>
+<p>Most low-end embedded MCUs have a much simpler hardware
+interface: The interface to the LCD may be through a simple
+parallel interface or, more commonly, through a slower serial
+interface such as SPI. In order to support such low-end
+hardware with the framebuffer character driver, a special
+software layer called the <cite>Framebuffer LCD Front End</cite> has
+been developed. This is the topic of the next paragraph.</p>
+</section>
+<section id="lcd-framebuffer-front-end">
+<h2>LCD Framebuffer Front-End<a class="headerlink" href="#lcd-framebuffer-front-end" title="Permalink to this heading"></a></h2>
+<p>The <cite>LCD Framebuffer Front-End</cite> provides a standard NuttX
+framebuffer interface, but works on top of a standard
+parallel or serial LCD driver. It provides the framebuffer,
+the framebuffer interface, and the hooks to adapt the LCD
+driver. The LCD framebuffer front-end can be found in the
+NuttX source tree at <code class="docutils literal notranslate"><span class="pre">drivers/lcd/lcd_framebuffer.c</span></code>.</p>
+<p>In order to provide updates to the LCD hardware after
+updates to the framebuffer, the LCD framebuffer front-end
+must be notified when significant changes to the framebuffer
+have been made. This notification is supported when
+<code class="docutils literal notranslate"><span class="pre">CONFIG_NX_UPDATE=y</span></code> is defined in the configuration. In
+this case, the LCD framebuffer front-end will support
+the special. OS-internal interface function <code class="docutils literal notranslate"><span class="pre">nx_notify_rectangle()</span></code>
+which defines the rectangular region in the framebuffer that
+has been changed. In response to a call to <code class="docutils literal notranslate"><span class="pre">nx_notify_rectangle()</span></code>
+will use the lower-level LCD interface to update only that
+rectangular region on the display.</p>
+<p>This kind of update for standard LCD drivers is very efficient:
+It is usually more efficient to update a region on the
+display than it is for form a complex image with text and
+line drawing; the updated region seems to update very
+quickly because of that. In fact, many of the low-end
+LCD drivers already include an internal framebuffer to
+support this style of LCD update.</p>
+<p>When used with LCD character driver, the <code class="docutils literal notranslate"><span class="pre">nx_notify_rectangle()</span></code>
+function will be called by the character river in response
+to the <code class="docutils literal notranslate"><span class="pre">FBIO_UPDATE</span> <span class="pre">IOCTL</span></code> command.</p>
+<p>Another advantage of the framebuffer, both the LCD internal
+framebuffer and the framebuffer character driver, is
+that super-efficient reading of the LCD display memory:
+The LCD display memory is not read at all! The read is
+from the copy in the framebuffer.</p>
+<p>Of course, using both an LCD internal framebuffer with the
+framebuffer character drivers is wasteful; one framebuffer
+is enough!</p>
+<p>As a caution, it is important to remember that a framebuffer
+can be quite large. For example, a 480x320 display with
+16-bit RGB pixels would require an allocated framebuffer
+of size 300 KiB. This is inappropriate with most small
+MCUs (unless they support external memory). For tiny displays,
+such as 128x64 1-bit monochromatic displays, the framebuffer
+memory usage is not bad: 1 KiB in that example.</p>
+</section>
+<section id="framebuffer-graphics-library">
+<h2>Framebuffer Graphics Library<a class="headerlink" href="#framebuffer-graphics-library" title="Permalink to this heading"></a></h2>
+<p>Now the missing part is some kind of application-space
+framebuffer graphics library. The NuttX framebuffer
+driver is superficially similar to the Linux framebuffer
+driver so there is a lot of support for Linux
+framebuffer graphics support that should be easily ported to
+NuttX – Perhaps DirectFB would be an GPL option? SDL with its
+MIT license might be a more compatible source for such a port.</p>
+</section>
+</section>
+
+
+ </div>
+ </div>
+ <footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
+ <a href="nxwm_threading.html" class="btn btn-neutral float-left" title="NxWM Threading" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
+ <a href="sample.html" class="btn btn-neutral float-right" title="Sample Code" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
+ </div>
+
+ <hr/>
+
+ <div role="contentinfo">
+ <p>© Copyright 2023, The Apache Software Foundation.</p>
+ </div>
+
+
+
+</footer>
+ </div>
+ </div>
+ </section>
+ </div>
+ <script>
+ jQuery(function () {
+ SphinxRtdTheme.Navigation.enable(true);
+ });
+ </script>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/content/docs/latest/components/nxgraphics/index.html b/content/docs/latest/components/nxgraphics/index.html
index 31227edd8..7cea4a521 100644
--- a/content/docs/latest/components/nxgraphics/index.html
+++ b/content/docs/latest/components/nxgraphics/index.html
@@ -141,6 +141,8 @@
<li class="toctree-l4"><a class="reference internal" href="nxtk.html">NX Tool Kit (<code class="docutils literal notranslate"><span class="pre">NXTK</span></code>)</a></li>
<li class="toctree-l4"><a class="reference internal" href="nxfonts.html">NX Fonts Support (<code class="docutils literal notranslate"><span class="pre">NXFONTS</span></code>)</a></li>
<li class="toctree-l4"><a class="reference internal" href="nxcursor.html">NX Cursor Support (<code class="docutils literal notranslate"><span class="pre">NXCURSOR</span></code>)</a></li>
+<li class="toctree-l4"><a class="reference internal" href="nxwm_threading.html">NxWM Threading</a></li>
+<li class="toctree-l4"><a class="reference internal" href="framebuffer_char_driver.html">Framebuffer Character Driver</a></li>
<li class="toctree-l4"><a class="reference internal" href="sample.html">Sample Code</a></li>
<li class="toctree-l4"><a class="reference internal" href="appendix.html">Appendix</a></li>
</ul>
@@ -380,6 +382,19 @@ and <code class="docutils literal notranslate"><span class="pre">stderr</span></
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="nxcursor.html">NX Cursor Support (<code class="docutils literal notranslate"><span class="pre">NXCURSOR</span></code>)</a></li>
+<li class="toctree-l1"><a class="reference internal" href="nxwm_threading.html">NxWM Threading</a></li>
+<li class="toctree-l1"><a class="reference internal" href="framebuffer_char_driver.html">Framebuffer Character Driver</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="framebuffer_char_driver.html#nx-graphics">NX Graphics</a></li>
+<li class="toctree-l2"><a class="reference internal" href="framebuffer_char_driver.html#figure-1">Figure 1</a></li>
+<li class="toctree-l2"><a class="reference internal" href="framebuffer_char_driver.html#framebuffer-character-driver-details">Framebuffer Character Driver details</a></li>
+<li class="toctree-l2"><a class="reference internal" href="framebuffer_char_driver.html#posix-interfaces">POSIX Interfaces</a></li>
+<li class="toctree-l2"><a class="reference internal" href="framebuffer_char_driver.html#ioctl-commands">IOCTL Commands</a></li>
+<li class="toctree-l2"><a class="reference internal" href="framebuffer_char_driver.html#mmap"><code class="docutils literal notranslate"><span class="pre">mmap()</span></code></a></li>
+<li class="toctree-l2"><a class="reference internal" href="framebuffer_char_driver.html#framebuffer-vs-lcd-graphics-drivers">Framebuffer vs. LCD Graphics Drivers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="framebuffer_char_driver.html#lcd-framebuffer-front-end">LCD Framebuffer Front-End</a></li>
+<li class="toctree-l2"><a class="reference internal" href="framebuffer_char_driver.html#framebuffer-graphics-library">Framebuffer Graphics Library</a></li>
+</ul>
+</li>
<li class="toctree-l1"><a class="reference internal" href="sample.html">Sample Code</a></li>
<li class="toctree-l1"><a class="reference internal" href="appendix.html">Appendix</a><ul>
<li class="toctree-l2"><a class="reference internal" href="appendix.html#graphics-directory-structure"><code class="docutils literal notranslate"><span class="pre">graphics/</span></code> Directory Structure</a></li>
diff --git a/content/docs/latest/components/nxgraphics/nx.html b/content/docs/latest/components/nxgraphics/nx.html
index 2cb6ec563..ab970d2c5 100644
--- a/content/docs/latest/components/nxgraphics/nx.html
+++ b/content/docs/latest/components/nxgraphics/nx.html
@@ -140,6 +140,8 @@
<li class="toctree-l4"><a class="reference internal" href="nxtk.html">NX Tool Kit (<code class="docutils literal notranslate"><span class="pre">NXTK</span></code>)</a></li>
<li class="toctree-l4"><a class="reference internal" href="nxfonts.html">NX Fonts Support (<code class="docutils literal notranslate"><span class="pre">NXFONTS</span></code>)</a></li>
<li class="toctree-l4"><a class="reference internal" href="nxcursor.html">NX Cursor Support (<code class="docutils literal notranslate"><span class="pre">NXCURSOR</span></code>)</a></li>
+<li class="toctree-l4"><a class="reference internal" href="nxwm_threading.html">NxWM Threading</a></li>
+<li class="toctree-l4"><a class="reference internal" href="framebuffer_char_driver.html">Framebuffer Character Driver</a></li>
<li class="toctree-l4"><a class="reference internal" href="sample.html">Sample Code</a></li>
<li class="toctree-l4"><a class="reference internal" href="appendix.html">Appendix</a></li>
</ul>
diff --git a/content/docs/latest/components/nxgraphics/nxcursor.html b/content/docs/latest/components/nxgraphics/nxcursor.html
index 982c8ab7f..48267fe50 100644
--- a/content/docs/latest/components/nxgraphics/nxcursor.html
+++ b/content/docs/latest/components/nxgraphics/nxcursor.html
@@ -43,7 +43,7 @@
<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="Sample Code" href="sample.html" />
+ <link rel="next" title="NxWM Threading" href="nxwm_threading.html" />
<link rel="prev" title="NX Fonts Support (NXFONTS)" href="nxfonts.html" />
</head>
@@ -133,6 +133,8 @@
<li class="toctree-l4"><a class="reference internal" href="nxtk.html">NX Tool Kit (<code class="docutils literal notranslate"><span class="pre">NXTK</span></code>)</a></li>
<li class="toctree-l4"><a class="reference internal" href="nxfonts.html">NX Fonts Support (<code class="docutils literal notranslate"><span class="pre">NXFONTS</span></code>)</a></li>
<li class="toctree-l4 current"><a class="current reference internal" href="#">NX Cursor Support (<code class="docutils literal notranslate"><span class="pre">NXCURSOR</span></code>)</a></li>
+<li class="toctree-l4"><a class="reference internal" href="nxwm_threading.html">NxWM Threading</a></li>
+<li class="toctree-l4"><a class="reference internal" href="framebuffer_char_driver.html">Framebuffer Character Driver</a></li>
<li class="toctree-l4"><a class="reference internal" href="sample.html">Sample Code</a></li>
<li class="toctree-l4"><a class="reference internal" href="appendix.html">Appendix</a></li>
</ul>
@@ -266,7 +268,7 @@ of this structure.</p></li>
</div>
<footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
<a href="nxfonts.html" class="btn btn-neutral float-left" title="NX Fonts Support (NXFONTS)" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
- <a href="sample.html" class="btn btn-neutral float-right" title="Sample Code" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
+ <a href="nxwm_threading.html" class="btn btn-neutral float-right" title="NxWM Threading" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
</div>
<hr/>
diff --git a/content/docs/latest/components/nxgraphics/nxfonts.html b/content/docs/latest/components/nxgraphics/nxfonts.html
index 4e5287104..85758be49 100644
--- a/content/docs/latest/components/nxgraphics/nxfonts.html
+++ b/content/docs/latest/components/nxgraphics/nxfonts.html
@@ -137,6 +137,8 @@
</ul>
</li>
<li class="toctree-l4"><a class="reference internal" href="nxcursor.html">NX Cursor Support (<code class="docutils literal notranslate"><span class="pre">NXCURSOR</span></code>)</a></li>
+<li class="toctree-l4"><a class="reference internal" href="nxwm_threading.html">NxWM Threading</a></li>
+<li class="toctree-l4"><a class="reference internal" href="framebuffer_char_driver.html">Framebuffer Character Driver</a></li>
<li class="toctree-l4"><a class="reference internal" href="sample.html">Sample Code</a></li>
<li class="toctree-l4"><a class="reference internal" href="appendix.html">Appendix</a></li>
</ul>
diff --git a/content/docs/latest/components/nxgraphics/nxgl.html b/content/docs/latest/components/nxgraphics/nxgl.html
index 8cd10b641..abda0dcfe 100644
--- a/content/docs/latest/components/nxgraphics/nxgl.html
+++ b/content/docs/latest/components/nxgraphics/nxgl.html
@@ -136,6 +136,8 @@
<li class="toctree-l4"><a class="reference internal" href="nxtk.html">NX Tool Kit (<code class="docutils literal notranslate"><span class="pre">NXTK</span></code>)</a></li>
<li class="toctree-l4"><a class="reference internal" href="nxfonts.html">NX Fonts Support (<code class="docutils literal notranslate"><span class="pre">NXFONTS</span></code>)</a></li>
<li class="toctree-l4"><a class="reference internal" href="nxcursor.html">NX Cursor Support (<code class="docutils literal notranslate"><span class="pre">NXCURSOR</span></code>)</a></li>
+<li class="toctree-l4"><a class="reference internal" href="nxwm_threading.html">NxWM Threading</a></li>
+<li class="toctree-l4"><a class="reference internal" href="framebuffer_char_driver.html">Framebuffer Character Driver</a></li>
<li class="toctree-l4"><a class="reference internal" href="sample.html">Sample Code</a></li>
<li class="toctree-l4"><a class="reference internal" href="appendix.html">Appendix</a></li>
</ul>
diff --git a/content/docs/latest/components/nxgraphics/nxtk.html b/content/docs/latest/components/nxgraphics/nxtk.html
index 2c631b811..de1d35df0 100644
--- a/content/docs/latest/components/nxgraphics/nxtk.html
+++ b/content/docs/latest/components/nxgraphics/nxtk.html
@@ -133,6 +133,8 @@
<li class="toctree-l4 current"><a class="current reference internal" href="#">NX Tool Kit (<code class="docutils literal notranslate"><span class="pre">NXTK</span></code>)</a></li>
<li class="toctree-l4"><a class="reference internal" href="nxfonts.html">NX Fonts Support (<code class="docutils literal notranslate"><span class="pre">NXFONTS</span></code>)</a></li>
<li class="toctree-l4"><a class="reference internal" href="nxcursor.html">NX Cursor Support (<code class="docutils literal notranslate"><span class="pre">NXCURSOR</span></code>)</a></li>
+<li class="toctree-l4"><a class="reference internal" href="nxwm_threading.html">NxWM Threading</a></li>
+<li class="toctree-l4"><a class="reference internal" href="framebuffer_char_driver.html">Framebuffer Character Driver</a></li>
<li class="toctree-l4"><a class="reference internal" href="sample.html">Sample Code</a></li>
<li class="toctree-l4"><a class="reference internal" href="appendix.html">Appendix</a></li>
</ul>
diff --git a/content/docs/latest/components/nxgraphics/sample.html b/content/docs/latest/components/nxgraphics/nxwm_threading.html
similarity index 81%
copy from content/docs/latest/components/nxgraphics/sample.html
copy to content/docs/latest/components/nxgraphics/nxwm_threading.html
index 8d205a074..d63dba4a6 100644
--- a/content/docs/latest/components/nxgraphics/sample.html
+++ b/content/docs/latest/components/nxgraphics/nxwm_threading.html
@@ -25,7 +25,7 @@
<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>Sample Code — NuttX latest documentation</title>
+ <title>NxWM Threading — NuttX latest documentation</title>
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css" />
<link rel="stylesheet" type="text/css" href="../../_static/css/theme.css" />
<link rel="stylesheet" type="text/css" href="../../_static/copybutton.css" />
@@ -43,7 +43,7 @@
<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="Appendix" href="appendix.html" />
+ <link rel="next" title="Framebuffer Character Driver" href="framebuffer_char_driver.html" />
<link rel="prev" title="NX Cursor Support (NXCURSOR)" href="nxcursor.html" />
</head>
@@ -133,7 +133,9 @@
<li class="toctree-l4"><a class="reference internal" href="nxtk.html">NX Tool Kit (<code class="docutils literal notranslate"><span class="pre">NXTK</span></code>)</a></li>
<li class="toctree-l4"><a class="reference internal" href="nxfonts.html">NX Fonts Support (<code class="docutils literal notranslate"><span class="pre">NXFONTS</span></code>)</a></li>
<li class="toctree-l4"><a class="reference internal" href="nxcursor.html">NX Cursor Support (<code class="docutils literal notranslate"><span class="pre">NXCURSOR</span></code>)</a></li>
-<li class="toctree-l4 current"><a class="current reference internal" href="#">Sample Code</a></li>
+<li class="toctree-l4 current"><a class="current reference internal" href="#">NxWM Threading</a></li>
+<li class="toctree-l4"><a class="reference internal" href="framebuffer_char_driver.html">Framebuffer Character Driver</a></li>
+<li class="toctree-l4"><a class="reference internal" href="sample.html">Sample Code</a></li>
<li class="toctree-l4"><a class="reference internal" href="appendix.html">Appendix</a></li>
</ul>
</li>
@@ -181,9 +183,9 @@
<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"><a href="index.html">NX Graphics Subsystem</a></li>
- <li class="breadcrumb-item active">Sample Code</li>
+ <li class="breadcrumb-item active">NxWM Threading</li>
<li class="wy-breadcrumbs-aside">
- <a href="../../_sources/components/nxgraphics/sample.rst.txt" rel="nofollow"> View page source</a>
+ <a href="../../_sources/components/nxgraphics/nxwm_threading.rst.txt" rel="nofollow"> View page source</a>
</li>
</ul>
<hr/>
@@ -191,31 +193,18 @@
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
- <section id="sample-code">
-<h1>Sample Code<a class="headerlink" href="#sample-code" title="Permalink to this heading"></a></h1>
-<p><code class="docutils literal notranslate"><span class="pre">apps/examples/nx*</span></code>. No sample code is provided in this document.
-However, examples can be found in the NuttX source tree at the follow
-locations: That example code is intended to test NX. Since it is test
-code, it is designed to exercise functionality and does not necessarily
-represent best NX coding practices.</p>
-<ul class="simple">
-<li><p><code class="docutils literal notranslate"><span class="pre">apps/examples/nx</span></code>. This is a test of windows, optionally with
-toolbars. Two windows are created, re-sized, moved, raise lowered.
-Simulated mouse and keyboard input is provided.</p></li>
-<li><p><code class="docutils literal notranslate"><span class="pre">apps/examples/nxhello</span></code>. This is intended to be simplest NX test:
-It simply displays the words “Hello, World!” centered on the display.</p></li>
-<li><p><code class="docutils literal notranslate"><span class="pre">apps/examples/nxtext</span></code>. This illustrates how fonts may be managed
-to provide scrolling text windows. Pop-up windows are included to
-verify the clipping and re-drawing of the text display.</p></li>
-</ul>
-<p>In its current form, the NX graphics system provides a low level of
-graphics and window support. Most of the complexity of manage redrawing
-and handling mouse and keyboard events must be implemented by the NX
-client code.</p>
-<p><strong>Building</strong> <code class="docutils literal notranslate"><span class="pre">apps/examples/nx</span></code>. Testing was performed using the
-Linux/Cygwin-based NuttX simulator. Instructions are provided for
-building that simulation are provided in <a class="reference external" href="#testcoverage">Appendix C</a>
-of this document.</p>
+ <section id="nxwm-threading">
+<h1>NxWM Threading<a class="headerlink" href="#nxwm-threading" title="Permalink to this heading"></a></h1>
+<div class="admonition warning">
+<p class="admonition-title">Warning</p>
+<p>Migrated from:
+<a class="reference external" href="https://cwiki.apache.org/confluence/display/NUTTX/NxWM+Threading">https://cwiki.apache.org/confluence/display/NUTTX/NxWM+Threading</a></p>
+</div>
+<img alt="../../_images/nxwm_theading_model_page_0.png" src="../../_images/nxwm_theading_model_page_0.png" />
+<img alt="../../_images/nxwm_theading_model_page_1.png" src="../../_images/nxwm_theading_model_page_1.png" />
+<img alt="../../_images/nxwm_theading_model_page_2.png" src="../../_images/nxwm_theading_model_page_2.png" />
+<img alt="../../_images/nxwm_theading_model_page_3.png" src="../../_images/nxwm_theading_model_page_3.png" />
+<img alt="../../_images/nxwm_theading_model_page_4.png" src="../../_images/nxwm_theading_model_page_4.png" />
</section>
@@ -223,7 +212,7 @@ of this document.</p>
</div>
<footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
<a href="nxcursor.html" class="btn btn-neutral float-left" title="NX Cursor Support (NXCURSOR)" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
- <a href="appendix.html" class="btn btn-neutral float-right" title="Appendix" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
+ <a href="framebuffer_char_driver.html" class="btn btn-neutral float-right" title="Framebuffer Character Driver" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
</div>
<hr/>
diff --git a/content/docs/latest/components/nxgraphics/sample.html b/content/docs/latest/components/nxgraphics/sample.html
index 8d205a074..9402dcd00 100644
--- a/content/docs/latest/components/nxgraphics/sample.html
+++ b/content/docs/latest/components/nxgraphics/sample.html
@@ -44,7 +44,7 @@
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
<link rel="next" title="Appendix" href="appendix.html" />
- <link rel="prev" title="NX Cursor Support (NXCURSOR)" href="nxcursor.html" />
+ <link rel="prev" title="Framebuffer Character Driver" href="framebuffer_char_driver.html" />
</head>
<body class="wy-body-for-nav">
@@ -133,6 +133,8 @@
<li class="toctree-l4"><a class="reference internal" href="nxtk.html">NX Tool Kit (<code class="docutils literal notranslate"><span class="pre">NXTK</span></code>)</a></li>
<li class="toctree-l4"><a class="reference internal" href="nxfonts.html">NX Fonts Support (<code class="docutils literal notranslate"><span class="pre">NXFONTS</span></code>)</a></li>
<li class="toctree-l4"><a class="reference internal" href="nxcursor.html">NX Cursor Support (<code class="docutils literal notranslate"><span class="pre">NXCURSOR</span></code>)</a></li>
+<li class="toctree-l4"><a class="reference internal" href="nxwm_threading.html">NxWM Threading</a></li>
+<li class="toctree-l4"><a class="reference internal" href="framebuffer_char_driver.html">Framebuffer Character Driver</a></li>
<li class="toctree-l4 current"><a class="current reference internal" href="#">Sample Code</a></li>
<li class="toctree-l4"><a class="reference internal" href="appendix.html">Appendix</a></li>
</ul>
@@ -222,7 +224,7 @@ of this document.</p>
</div>
</div>
<footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
- <a href="nxcursor.html" class="btn btn-neutral float-left" title="NX Cursor Support (NXCURSOR)" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
+ <a href="framebuffer_char_driver.html" class="btn btn-neutral float-left" title="Framebuffer Character Driver" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
<a href="appendix.html" class="btn btn-neutral float-right" title="Appendix" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
</div>
diff --git a/content/docs/latest/index.html b/content/docs/latest/index.html
index 18fb785e3..3c23de14e 100644
--- a/content/docs/latest/index.html
+++ b/content/docs/latest/index.html
@@ -173,7 +173,7 @@ standards. Additional standard APIs from Unix and other common RTOS’s (such as
VxWorks) are adopted for functionality not available under these standards, or
for functionality that is not appropriate for deeply-embedded environments (such
as fork()).</p>
-<p>Last Updated: 10 November 24 at 00:24</p>
+<p>Last Updated: 11 November 24 at 00:24</p>
<div class="toctree-wrapper compound">
<p class="caption" role="heading"><span class="caption-text">Table of Contents</span></p>
<ul class="current">
diff --git a/content/docs/latest/objects.inv b/content/docs/latest/objects.inv
index 0e84d7028..2e899b30f 100644
Binary files a/content/docs/latest/objects.inv and b/content/docs/latest/objects.inv differ
diff --git a/content/docs/latest/searchindex.js b/content/docs/latest/searchindex.js
index fe4c04051..de7c71539 100644
--- a/content/docs/latest/searchindex.js
+++ b/content/docs/latest/searchindex.js
@@ -1 +1 @@
-Search.setIndex({"docnames": ["applications/audioutils/fmsynt/index", "applications/audioutils/index", "applications/audioutils/mml_parser/index", "applications/audioutils/nxaudio/index", "applications/benchmarks/cachespeed/index", "applications/benchmarks/coremark-pro/index", "applications/benchmarks/coremark/index", "applications/benchmarks/dhrystone/index", "applications/benchmarks/fio/index", "applications/benchmarks/index", "applications/benchmarks/iozone/index", "applications/bench [...]
\ No newline at end of file
+Search.setIndex({"docnames": ["applications/audioutils/fmsynt/index", "applications/audioutils/index", "applications/audioutils/mml_parser/index", "applications/audioutils/nxaudio/index", "applications/benchmarks/cachespeed/index", "applications/benchmarks/coremark-pro/index", "applications/benchmarks/coremark/index", "applications/benchmarks/dhrystone/index", "applications/benchmarks/fio/index", "applications/benchmarks/index", "applications/benchmarks/iozone/index", "applications/bench [...]
\ No newline at end of file
diff --git a/content/feed.xml b/content/feed.xml
index 7cd96999d..355552025 100644
--- a/content/feed.xml
+++ b/content/feed.xml
@@ -5,8 +5,8 @@
<description></description>
<link>/</link>
<atom:link href="/feed.xml" rel="self" type="application/rss+xml"/>
- <pubDate>Sun, 10 Nov 2024 00:26:29 +0000</pubDate>
- <lastBuildDate>Sun, 10 Nov 2024 00:26:29 +0000</lastBuildDate>
+ <pubDate>Mon, 11 Nov 2024 00:26:20 +0000</pubDate>
+ <lastBuildDate>Mon, 11 Nov 2024 00:26:20 +0000</lastBuildDate>
<generator>Jekyll v4.3.2</generator>
<item>