Documentation: various improvements to quickstart section

This commit is contained in:
Matias N 2020-11-21 19:55:16 -03:00 committed by Brennan Ashton
parent ce146e91ef
commit 3aacc506dc
7 changed files with 186 additions and 306 deletions

View File

@ -1,59 +0,0 @@
.. include:: /substitutions.rst
.. _build_and_make:
Build and Make Details
======================
This is included for reference, and it's not necessary to know all these details.
As described in :ref:`compiling`, you use ``make`` at the root ``nuttx/`` directory to build NuttX. This is also
referenced as ``$(TOPDIR)`` in the ``Makefile``.
Root Directory
--------------
The ``$(TOPDIR)`` directory holds:
- The top level ```Makefile`` <#topmakefile>`__ that controls the
NuttX build.
That directory also holds:
- The makefile fragment :ref:`.config <nuttx_boards>`
that describes the current configuration, and
- The makefile fragment :ref:`Make.defs <nuttx_boards>`
that provides customized build targets.
Environment Variables
---------------------
The specific environmental definitions
are unique for each board but should include, as a minimum,
updates to the ``PATH`` variable to include the full path to the
architecture-specific toolchain identified in
:ref:`Make.defs <nuttx_boards>`.
First Time Make
---------------
Additional configuration actions will be taken the first time that system is built. These additional steps
include:
- Auto-generating the file ``include/nuttx/config.h`` using the
``$(TOPDIR)/.config`` file.
- Auto-generating the file ``$(TOPDIR)/.version`` with version
0.0 if one does not exist.
- Auto-generating the file ``include/nuttx/version.h`` using the
``$(TOPDIR)/.version`` file.
- Creating a link to
``$(TOPDIR)/arch/``\ *<arch-name>*\ ``/include`` at
``$(TOPDIR)/include/arch``.
- Creating a link to
``$(TOPDIR)/boards/``\ *<arch-name>*\ ``/``\ *<chip-name>*\ ``/``\ *<board-name>*\ ``/include``
at ``$(TOPDIR)/include/arch/board``.
- Creating a link to
``$(TOPDIR)/boards/``\ *<arch-name>*\ ``/``\ *<chip-name>*\ ``/``\ *<board-name>*\ ``/src``
at ``$(TOPDIR)/arch/``\ *<arch-name>*\ ``/src/board``
- Creating a link to ``${APPDIR}/include`` at
``$(TOPDIR)/include/apps``
- Creating make dependencies.

View File

@ -36,23 +36,15 @@ to ``configure.sh`` and indicate your host platform, such as:
The ``-l`` tells use that we're on Linux (macOS and Windows builds are
possible). Use the ``-h`` argument to see all available options.
Customize Your Configuration (Optional)
=======================================
This step is optional. Right now, this is mainly to get familiar with how it
works you don't need to change any of the options now, but knowing how
to do this will come in handy later.
There are a lot of options. We'll cover a few of them here.
Don't worry about the complexity you don't have to use most of the options.
You can then customize this configuration by using the menu based
configuration system with:
.. code-block:: console
$ cd nuttx/
$ make menuconfig
.. todo::
Explain some useful options.
Modifying the configuration is covered in :doc:`configuring`.
Build NuttX
===========
@ -62,11 +54,11 @@ We can now build NuttX. To do so, you can simply run:
.. code-block:: console
$ cd nuttx/
$ make make
$ make
The build will complete by generating the binary outputs
inside `nuttx` directory. Typically this includes the `nuttx`
ELF file (suitable for debugging using `gdb`) and a `nuttx.bin`
inside ``nuttx`` directory. Typically this includes the ``nuttx``
ELF file (suitable for debugging using ``gdb``) and a ``nuttx.bin``
file that can be flashed to the board.
To clean the build, you can do:
@ -75,11 +67,6 @@ To clean the build, you can do:
$ make clean
.. warning::
At the moment it is recommended that after modifying the
configuration you first clean before building again. This
is currently worked on.
----
Next up is :ref:`running`.

View File

@ -6,48 +6,31 @@ Configuring
Apache NuttX is a very configurable operating system. Nearly all features can be configured in or
out of the system. This makes it possible to compile a build tailored for your hardware and
application. It also makes configuring the system complex at times.
There is a configuration system that can be used on the commandline or in a GUI. I've found
the easiest way to configured Apache NuttX is to use the ``menuconfig`` system. This is used
via a terminal program and allows quick access to all of Apache NuttX's features via a system of
menus.
application.
The Apache NuttX configuration system uses Linux's
`kconfig system <https://www.kernel.org/doc/Documentation/kbuild/kconfig-language.txt>`_ adapted for use with Apache
NuttX. Here's info on Linux's kconfig `menuconfig <https://en.wikipedia.org/wiki/Menuconfig>`_ system.
`kconfig system <https://www.kernel.org/doc/Documentation/kbuild/kconfig-language.txt>`_ which
includes various frontends that allow you to modify configuration easily. Usually, the ``menuconfig``
frontend is used, which is a console based menu system (more info `here <https://en.wikipedia.org/wiki/Menuconfig>`_).
After you've configured your board (see :ref:`compiling`), you can use the menuconfig system
to change the configuration. Once you've configured, you can compile to make a build that
has your configuration options selected.
As previously explained in :doc:`compiling`, the first step is to load a premade configuration for
your board. Then, you can modify this configuration to your liking.
In this example, we will show how you modify the default configuration of the ``sim`` build.
#. Initialize Board Configuration
Here we'll use the simulator since that's the simplest to explain. You can do this with
any board and base configuration. Note here you should be supplying `configure.sh` the correct flag
for your build environment:
.. code-block:: bash
-l selects the Linux (l) host environment.
-m selects the macOS (m) host environment.
-c selects the Windows host and Cygwin (c) environment.
-g selects the Windows host and MinGW/MSYS environment.
-n selects the Windows host and Windows native (n) environment.
Select the simulator configuration for a Linux host:
.. code-block:: bash
.. code-block:: console
$ cd nuttx
$ make distclean # make a clean start, clearing out old configurations
$ ./tools/configure.sh -l sim:nsh
Copy files
Select CONFIG_HOST_LINUX=y
Refreshing...
#. Make
#. Build & run
.. code-block:: bash
.. code-block:: console
$ make clean; make
$ ./nuttx
@ -55,15 +38,16 @@ has your configuration options selected.
From another terminal window, kill the simulator:
.. code-block:: bash
.. code-block:: console
$ pkill nuttx
#. Menu Configuration
#. Modify configuration
Showing that ``login:`` is annyoing. Let's use the ``menuconfig`` system to turn it off.
In this case we will remove the login feature (which will boot straight to the prompt). To
do so, we use the ``menuconfig`` frontend.
.. code-block:: bash
.. code-block:: console
$ make menuconfig
@ -76,27 +60,24 @@ has your configuration options selected.
|br|
#. Application Configuration
The NSH Login setting is under :menuselection:`Application Configuration --> NSH Library`. You
can use :kbd:`🢁` and :kbd:`🢃` keys to navigate and :kbd:`↵` to enter a submenu.
To disable the corresponding setting go to :menuselection:`Console Login` and press :kbd:`spacebar` to
it (so that it has a blank space instead of a star in it).
The NSH Login setting is under ``Application Configuration > NSH Library``. Use
the up and down arrows to navigate to ``Application Configuration``; hit ``<return>`` to
select it. Now you're in the ``Application Configuration`` menu. Use the arrows to go
down to ``NSH Library`` and select that. Now navigate down to ``Console Login`` and use
the spacebar to uncheck that setting (so that it has a blank space instead of a star in it).
Now you need to exit ``menuconfig`` and save the modified configuration. Use the :kbd:`🡸` and
:kbd:`🡺` arrow keys to navigate the lower menu. If you select :menuselection:`Exit` you will be
prompted to save the config.
Now let's save. Use the right and left arrow keys to select the ``Exit`` menu item at the
bottom of the screen. Hit ``<return>`` to select it, hit ``<return>`` again, and again, finally
hitting ``<return>`` in the ``Save Configuration`` dialog box.
#. Build with the new Configuration
#. Make the New Configuration
.. code-block:: console
.. code-block:: bash
$ make clean; make
$ make
#. Run
.. code-block:: bash
.. code-block:: console
$ ./nuttx
NuttShell (NSH) NuttX-8.2
@ -104,8 +85,42 @@ has your configuration options selected.
Success!
.. tip::
If you find that message of the day (MOTD) annoying and want to turn that off, it's
configured in ``Application Configuration > NSH Library >> Message of the Day (MOTD)``.
configured in :menuselection:`Application Configuration --> NSH Library --> Message of the Day (MOTD)`.
Fast configuration changes
--------------------------
If you know exactly which configuration symbol you want to change, you can use the ``kconfig-tweak`` tool (comes with the ``kconfig-frontends`` package) to quickly change a setting without going into the configuration frontend. This is useful to change settings such as debug options:
.. code-block:: console
$ kconfig-tweak --disable CONFIG_DEBUG_NET
$ make olddefconfig # needed to have the kconfig system check the config
$ kconfig-tweak --enable CONFIG_DEBUG_NET
$ make olddefconfig
This is also useful to script configuration changes that you perform often:
.. code-block:: console
#!/bin/bash
kconfig-tweak --disable CONFIG_DEBUG_ALERT
kconfig-tweak --disable CONFIG_DEBUG_FEATURES
kconfig-tweak --disable CONFIG_DEBUG_ERROR
kconfig-tweak --disable CONFIG_DEBUG_WARN
kconfig-tweak --disable CONFIG_DEBUG_INFO
kconfig-tweak --disable CONFIG_DEBUG_ASSERTIONS
kconfig-tweak --disable CONFIG_DEBUG_NET
kconfig-tweak --disable CONFIG_DEBUG_NET_ERROR
kconfig-tweak --disable CONFIG_DEBUG_NET_WARN
kconfig-tweak --disable CONFIG_DEBUG_NET_INFO
kconfig-tweak --disable CONFIG_DEBUG_SYMBOLS
kconfig-tweak --disable CONFIG_DEBUG_NOOPT
kconfig-tweak --disable CONFIG_SYSLOG_TIMESTAMP
make oldconfig
----

View File

@ -14,11 +14,7 @@ Debug Logging
NuttX has a powerful system logging facility (syslog) with ``info``, ``warn``, and ``error`` levels. You can enable
debugging for your build for the subsystem or feature by using the ``menuconfig`` system.
.. code-block:: console
$ make menuconfig
The debug options are available under ``Build Setup`` > ``Debug Options``. You will most likely have to enable the
The debug options are available under :menuselection:`Build Setup --> Debug Options`. You will most likely have to enable the
following options:
* ``Enable Debug Features`` — selecting this will turn on subsystem-level debugging options, they will become visible
@ -44,82 +40,140 @@ the area you're interested in, and leave the rest disabled, save the config, and
list of debug feature logging functions in the file
`debug.h <https://github.com/apache/incubator-nuttx/blob/master/include/debug.h>`__.
Syslog timestamps can be enabled in the ``menuconfig`` system using ``Device Drivers`` > ``System Logging`` > ``Prepend
timestamp to syslog message`` (``CONFIG_SYSLOG_TIMESTAMP``).
Syslog timestamps can be enabled in the configuration in :menuselection:`Device Drivers --> System Logging --> Prepend
timestamp to syslog message` (``CONFIG_SYSLOG_TIMESTAMP``).
You may need to do a little bit of experimenting to find the combination of logging settings that work for the problem
you're trying to solve. See the file `debug.h <https://github.com/apache/incubator-nuttx/blob/master/include/debug.h>`_
for available debug settings that are available. This can also be configured via the ``menuconfig`` system.
for available debug settings that are available.
There are also subsystems that enable USB trace debugging, and you can log to memory too, if you need the logging to be
faster than what the console can output.
Changing Debug Settings Quickly
-------------------------------
Debugging with ``openocd`` and ``gdb``
--------------------------------------
You can use the ``kconfig-tweak`` script that comes with the ``kconfig-frontends`` tools to quickly change debug settings,
for instance turning them on or off before doing a build:
To debug our Nucleo board using its embedded SWD debug adapter,
start ``openocd`` with the following command:
.. code-block:: console
$ kconfig-tweak --disable CONFIG_DEBUG_NET
$ make olddefconfig # needed to have the kconfig system check the config
$ kconfig-tweak --enable CONFIG_DEBUG_NET
$ make olddefconfig
$ openocd -f interface/st-link-v2.cfg -f target/stm32f1x.cfg
You can put a bunch of these into a simple script to configure the logging the way you want:
This will start a ``gdb`` server. Then, start ``gdb`` with:
.. code-block:: console
#!/bin/bash
$ cd nuttx/
$ gdb-multiarch nuttx/nuttx
kconfig-tweak --disable CONFIG_DEBUG_ALERT
kconfig-tweak --disable CONFIG_DEBUG_FEATURES
kconfig-tweak --disable CONFIG_DEBUG_ERROR
kconfig-tweak --disable CONFIG_DEBUG_WARN
kconfig-tweak --disable CONFIG_DEBUG_INFO
kconfig-tweak --disable CONFIG_DEBUG_ASSERTIONS
kconfig-tweak --disable CONFIG_DEBUG_NET
kconfig-tweak --disable CONFIG_DEBUG_NET_ERROR
kconfig-tweak --disable CONFIG_DEBUG_NET_WARN
kconfig-tweak --disable CONFIG_DEBUG_NET_INFO
kconfig-tweak --disable CONFIG_DEBUG_SYMBOLS
kconfig-tweak --disable CONFIG_DEBUG_NOOPT
kconfig-tweak --disable CONFIG_SYSLOG_TIMESTAMP
make oldconfig
Inside ``gdb`` console, connect to the ``gdb`` server with:
.. code-block::
JTAG/SWD Debugging
------------------
(gdb) target extended-remote :3333
`JTAG <https://en.wikipedia.org/wiki/JTAG>`_ is a set of standards that specify a way to attach a hardware device to
your embedded board, and then remotely control the CPU. You can load code, start, stop, step through the program, and
examine variables and memory. `SWD <https://en.wikipedia.org/wiki/JTAG#Similar_interface_standards>`_ is an
Arm-specific interface with a reduced number of signals which can be used alternatively.
You can now use standard ``gdb`` commands.
The NuttX operating system uses `threads <https://en.wikipedia.org/wiki/Thread_(computing)>`_, so you need a
thread-aware debugger to do more than load code, start, and stop it. A thread-aware debugger will allow you to switch
threads to the one that is running the code you're interested in, for instance your application, or an operating system
network thread. So far, `OpenOCD <http://openocd.org/>`_ is the only supported NuttX thread-aware debugger.
Debugging with an external JTAG adapter
---------------------------------------
.. note::
OpenOCD hasn't announced a stable release for a few years but the development remains active. You'll need to use a
version of OpenOCD recent enough so that it includes NuttX support as `contributed by Sony upstream
<http://openocd.zylin.com/#/c/4103/>`_. The version included in official OS repositories will probably be too old.
You should build from source or use one of the unofficial, more recent builds. See `Getting OpenOCD
<http://openocd.org/getting-openocd/>`_ for more details.
.. todo::
Explain this with openocd. It gives the impression that JTAG requires
a specific tool. Also, some of the example commands apply to both cases.
This repeats some of the above.
You will need a board with a JTAG or SWD connector and an `OpenOCD-compatible hardware adapter
<http://openocd.org/supported-jtag-interfaces/>`_, ideally a fast one (USB 2.0 High Speed). For example an `Olimex
ARM USB TINY H <https://www.olimex.com/Products/ARM/JTAG/ARM-USB-TINY-H/>`_ or a `Segger J-Link
<https://www.segger.com/products/debug-probes/j-link/>`_. Many other adapters work too, follow the OpenOCD
instructions and the instructions that came with your adapter.
If your board does not have an embedded programmer and uses
`JTAG <https://en.wikipedia.org/wiki/JTAG>`_ connector instead,
things are a bit different. This guide assumes you have a JTAG hardware debugger like a
`Segger J-Link <https://www.segger.com/products/debug-probes/j-link/>`_.
JTAG is a set of standards that let you
attach a hardware device to your embedded board, and then remotely control the CPU.
You can load code, start, stop, step through the program, and examine variables and memory.
#. Attach the Debugger Cables
#. Start the Debugger
Refer to your JTAG debugger's documentation for information on how to start a GDB Server process that gdb can
communicate with to load code and start, stop, and step the embedded board's CPU. Your command line may be
different from this one.
.. code-block:: console
$ JLinkGDBServer -device ATSAMA5D27 -if JTAG -speed 1000 -JTAGConf -1,-1
#. Launch the GNU Debugger
In another terminal window, launch the GDB. In the case of this guide, this came with the
ARM Embedded GNU Toolchain we downloaded in the Install step.
.. code-block:: console
$ cd nuttx/
$ gdb-multiarch nuttx/nuttx
#. Set gdb to talk with the J-Link
::
(gdb) target extended-remote :2331
#. Reset the board
::
(gdb) mon reset
#. You may need to switch to the serial console to hit a key to stop the board from booting from its boot monitor
(U-Boot, in the case of the SAMA5 boards from Microchip).
#. Halt the board
::
(gdb) mon halt
#. Load nuttx
::
(gdb) load nuttx
`/home/adamf/src/nuttx-sama5d36-xplained/nuttx/nuttx' has changed; re-reading symbols.
Loading section .text, size 0x9eae4 lma 0x20008000
Loading section .ARM.exidx, size 0x8 lma 0x200a6ae4
Loading section .data, size 0x125c lma 0x200a6aec
Start address 0x20008040, load size 654664
Transfer rate: 75 KB/sec, 15587 bytes/write.
(gdb)
#. Set a breakpoint
::
(gdb) breakpoint nsh_main
#. Start nuttx
::
(gdb) continue
Continuing.
Breakpoint 1, nsh_main (argc=1, argv=0x200ddfac) at nsh_main.c:208
208 sched_getparam(0, &param);
(gdb) continue
Continuing.
Debugging Shortcuts
-------------------
Note that you can abbreviate ``gdb`` commands, ``info b`` is a shortcut for
``information breakpoints``; ``c`` works the same as ``continue``, etc.
See this article for more info:
`Debugging a Apache NuttX target with GDB and OpenOCD <https://micro-ros.github.io/docs/tutorials/advanced/nuttx/debugging/>`_.
See the section :ref:`Running <running>` for a brief tutorial on how to use GDB.
----
Next up is :ref:`organization`.

View File

@ -22,5 +22,4 @@ to build NuttX.
configuring.rst
debugging.rst
organization.rst
build_and_make.rst

View File

@ -1,4 +1,9 @@
.. include:: /substitutions.rst
.. todo::
This is mostly untouched from the original documentation. It does
not really belong to "quickstart". Also, this needs cleanup.
.. _organization:
===================
@ -506,10 +511,5 @@ support.
==================
The top-level ``Makefile`` in the ``$(TOPDIR)`` directory contains
all of the top-level control logic to build NuttX. Use of this
``Makefile`` to build NuttX is described
`below <#buildingnuttx>`__.
all of the top-level control logic to build NuttX.
----
Next up is :ref:`build_and_make`.

View File

@ -40,7 +40,7 @@ latest Git version. To install it you should:
$ git clone git://git.code.sf.net/p/openocd/code openocd
$ cd openocd
$ ./bootstrap
$ ./configure --prefix install/
$ ./configure --prefix=install/
$ make install
The resulting installation will be under ``openocd/install``. You can add
@ -71,122 +71,6 @@ of your choice where you will see the ``nsh>`` prompt:
$ gtkterm -s 115200 -p /dev/ttyUSB0
Debugging
=========
Using ``openocd`` you can also debug NuttX. To do so, first run:
.. code-block:: console
$ openocd -f interface/st-link-v2.cfg -f target/stm32f1x.cfg
which will start a GDB server. Then, start ``gdb`` as:
.. code-block:: console
$ cd nuttx/
$ gdb-multiarch nuttx/nuttx
Inside ``gdb`` console, connect to the ``openocd`` server with:
.. code-block::
(gdb) target extended-remote :3333
You can debug using standard ``gdb`` commands.
Advanced Debugging with JTAG
----------------------------
If your board does not have an embedded programmer and uses
`JTAG <https://en.wikipedia.org/wiki/JTAG>`_ connector instead,
things are a bit different. This guide assumes you have a JTAG hardware debugger like a
`Segger J-Link <https://www.segger.com/products/debug-probes/j-link/>`_.
JTAG is a set of standards that let you
attach a hardware device to your embedded board, and then remotely control the CPU.
You can load code, start, stop, step through the program, and examine variables and memory.
#. Attach the Debugger Cables
#. Start the Debugger
Refer to your JTAG debugger's documentation for information on how to start a GDB Server process that gdb can
communicate with to load code and start, stop, and step the embedded board's CPU. Your command line may be
different from this one.
.. code-block:: console
$ JLinkGDBServer -device ATSAMA5D27 -if JTAG -speed 1000 -JTAGConf -1,-1
#. Launch the GNU Debugger
In another terminal window, launch the GDB. In the case of this guide, this came with the
ARM Embedded GNU Toolchain we downloaded in the Install step.
.. code-block:: console
$ cd nuttx/
$ gdb-multiarch nuttx/nuttx
#. Set gdb to talk with the J-Link
::
(gdb) target extended-remote :2331
#. Reset the board
::
(gdb) mon reset
#. You may need to switch to the serial console to hit a key to stop the board from booting from its boot monitor
(U-Boot, in the case of the SAMA5 boards from Microchip).
#. Halt the board
::
(gdb) mon halt
#. Load nuttx
::
(gdb) load nuttx
`/home/adamf/src/nuttx-sama5d36-xplained/nuttx/nuttx' has changed; re-reading symbols.
Loading section .text, size 0x9eae4 lma 0x20008000
Loading section .ARM.exidx, size 0x8 lma 0x200a6ae4
Loading section .data, size 0x125c lma 0x200a6aec
Start address 0x20008040, load size 654664
Transfer rate: 75 KB/sec, 15587 bytes/write.
(gdb)
#. Set a breakpoint
::
(gdb) breakpoint nsh_main
#. Start nuttx
::
(gdb) continue
Continuing.
Breakpoint 1, nsh_main (argc=1, argv=0x200ddfac) at nsh_main.c:208
208 sched_getparam(0, &param);
(gdb) continue
Continuing.
Debugging Shortcuts
-------------------
Note that you can abbreviate ``gdb`` commands, ``info b`` is a shortcut for
``information breakpoints``; ``c`` works the same as ``continue``, etc.
----
Next up is :ref:`configuring`.