RIOT/doc/doxygen/src/getting-started.md
2021-10-19 11:26:42 +02:00

379 lines
16 KiB
Markdown

Getting started {#getting-started}
===============
[TOC]
Downloading RIOT code {#downloading-riot-code}
=====================
You can obtain the latest RIOT code from
our [Github](https://github.com/RIOT-OS/) repository either by
[downloading the latest tarball](https://github.com/RIOT-OS/RIOT/releases) or
by cloning the [git repository](https://github.com/RIOT-OS/RIOT).
In order to clone the RIOT repository, you need the
[Git revision control system](http://git-scm.com/) and run the following
command:
~~~~~~~~ {.sh}
git clone git://github.com/RIOT-OS/RIOT.git
~~~~~~~~
Compiling RIOT {#compiling-riot}
==============
Required Software for Development {#setting-up-a-toolchain}
-----------------------------------------------------------
A set of common tools and a toolchain for the hardware you target needs to be installed first.
### Choosing an Operating System for the Development PC
Most of the RIOT OS developers are using Linux on their development PCs, so you can expect the
most streamlined experience here. Other POSIX-compliant OSes such as current versions of Mac OS or
the various BSD flavours will also be fine - however, we rely on users to report bugs regarding
tooling incompatibilities here. So expect occasional issues for the development branch and please
help testing during the feature freeze period, if you develop on Mac OS or BSD.
Native development on Windows machines is not officially supported. What works well is using Linux
in a virtual machine, but at much lower performance than running Linux natively. For development
using the
[Windows Subsystem for Linux (WSL)](https://en.wikipedia.org/wiki/Windows_Subsystem_for_Linux)
is a good option
([installation instructions here](https://docs.microsoft.com/en-us/windows/wsl/install)), but it
is (as of October 2021) not possible to directly access USB devices from Linux. As a result,
accessing the serial connection to a board running RIOT, flashing it, and on-chip-debugging from WSL
will not be possible. (It is possible to pass through the file system of USB storage device. This
should allow flashing boards that have an [UF2 compatible](https://github.com/Microsoft/uf2) from
within WSL, but this has not been tested yet.) Hence, WSL users will have to use native Windows
tools for accessing the serial connection and flashing the board.
### Common Tools
The following tools are required or useful regardless of the architecture and board you are
developing for:
* Essential system development tools (GNU Make GCC, standard C library headers)
* git
* GDB in the multiarch variant (alternatively: install for each architecture you target the
corresponding GDB package)
* unzip or p7zip
* wget or curl
* python3
* pyserial (linux distro package often named python3-serial or py3-serial)
* Doxygen for building the documentation
@note For each architecture a default tool for flashing and on-chip debugging is listed below - in
most cases OpenOCD. However, some boards use different tools, e.g. because a bootloader is
installed that allows flashing via the serial interface. Check the board documentation for any
details on this. If that documentation contains no info about a flashing tool, the default
tool for its architecture is used.
@details Running `BOARD=<INSERT_TARGET_BOARD_HERE> make info-programmers-supported` in your
application folder lists the programmers supported by RIOT for the given board.
### Architecture: ARM7 and ARM Cortex M*
* GCC, binutils, and newlib for `arm-none-eabi`
* Alternatively: Install docker and export `BUILD_IN_DOCKER=1`
* OpenOCD for debugging/flashing (most boards)
* Some boards use UF2 based bootloaders, which require auto-mounting to work with `make flash`
* Some boards default to using J-Link for flashing/debugging. Either install that or export
`PROGRAMMER=openocd` to just use OpenOCD instead
* Optional: picolibc for `arm-none-eabi` to link against picolibc instead of newlib
* Optional: clang to build with `TOOLCHAIN=llvm`
* Optional: GDB multiarch for debugging
* If no multiarch package is available, use GDB for `arm-none-eabi` instead
### Architecture: Xtensa
#### ESP32
* @ref esp32_toolchain "Toolchain for ESP32"
* [esptool](https://github.com/espressif/esptool) for flashing
* Optional: OpenOCD and GDB (multiarch version) for @ref esp32_jtag_debugging "debugging via JTAG"
#### ESP8266
* @ref esp8266_toolchain "Toolchain for ESP8266"
* [esptool](https://github.com/espressif/esptool) for flashing
* Optional: GDB (multiarch version) for @ref esp8266_esp_gdbstub "debugging via the gdbstub"
interface for the ESP8266
### Architecture: AVR
* GCC and binutils for AVR and avrlibc
* Alternatively: Install docker and export `BUILD_IN_DOCKER=1`
* avrdude for flashing
* Optional: AVaRICE and GDB (multiarch version) for debugging
### Architecture: RISC-V
* GCC, binutils, and newlib for RISC-V (target triple should start with `riscv` and end with
`-none-elf` or `-unknown-elf`. Note that most packages are multilib, e.g. `riscv64-unknown-elf`
will likely work fine for 32 bit RISC-V boards)
* Alternatively: Install docker and export `BUILD_IN_DOCKER=1`
* OpenOCD for debugging/flashing (some new boards might require a patched version of OpenOCD or a
recent build from the git sources
* Optional: picolibc to link against picolibc instead of newlib (recommended)
* Optional: clang to build with `TOOLCHAIN=llvm`
* Optional: GDB multiarch for debugging
### Architecture: MSP430
* GCC, binutils, and newlib for MSP430
* Alternatively: Install docker and export `BUILD_IN_DOCKER=1`
* [mspdebug](https://github.com/dlbeer/mspdebug) for flashing/debugging
* Optional: [MSP Debug Stack](https://www.ti.com/tool/download/MSPDS-OPEN-SOURCE) for additional
board support
* Optional: GDB multiarch for debugging
### Architecture: MIPS
* GCC, binutils, and newlib for MIPS
* Alternatively: Install docker and export `BUILD_IN_DOCKER=1`
* Check board documentation for flashing and debugging
### Architecture: native
* On 64 bit systems: multilib versions for your host compilers, standard C library, and development
headers
* Alternatively: Compile with `BUILD_IN_DOCKER=1`. Note that for running the executable you
still need a multilib system (or 32 bit Linux) with glibc a standard C library.
* A C library supporting the deprecated POSIX.1-2001 ucontext library (e.g. glibc, FreeBSD's libc,
Mac OS's libc)
* Optional: GDB for debugging. (Prefer the multiarch version, this will also work for other boards)
The build system {#the-build-system}
----------------
RIOT uses [GNU make](https://www.gnu.org/software/make/) as build system. The
simplest way to compile and link an application with RIOT, is to set up a
Makefile providing at least the following variables:
* `APPLICATION`: should contain the (unique) name of your application
* `BOARD`: specifies the platform the application should be built for by
default
* `RIOTBASE`: specifies the path to your copy of the RIOT repository (note,
that you may want to use `$(CURDIR)` here, to give a relative path)
Additionally it has to include the `Makefile.include`, located in RIOT's root
directory:
~~~~~~~~ {.mk}
# a minimal application Makefile
APPLICATION = mini-makefile
BOARD ?= native
RIOTBASE ?= $(CURDIR)/../RIOT
include $(RIOTBASE)/Makefile.include
~~~~~~~~
You can use Make's `?=` operator in order to allow overwriting
variables from the command line. For example, you can easily specify the target
platform, using the sample Makefile, by invoking make like this:
~~~~~~~~ {.sh}
make BOARD=iotlab-m3
~~~~~~~~
Besides typical targets like `clean`, `all`, or `doc`, RIOT provides the
special targets `flash` and `term` to invoke the configured flashing and
terminal tools for the specified platform. These targets use the variable
`PORT` for the serial communication to the device. Neither this variable nor
the targets `flash` and `term` are mandatory for the native port.
For the native port, `PORT` has a special meaning: it is used to identify the
tap interface if the `netdev_tap` module is used. The target `debug` can be
used to invoke a debugger on some platforms. For the native port the additional
targets such as `all-valgrind` and `valgrind` exist. Refer to
`cpu/native/README.md` for additional information
Some RIOT directories contain special Makefiles like `Makefile.base`,
`Makefile.include` or `Makefile.dep`. The first one can be included into other
Makefiles to define some standard targets. The files called `Makefile.include`
are used in `boards` and `cpu` to append target specific information to
variables like `INCLUDES`, setting the include paths. `Makefile.dep` serves to
define dependencies.
Unless specified otherwise, make will create an elf-file as well as an Intel
hex file in the `bin` folder of your application directory.
Learn more about the build system in the
[Wiki](https://github.com/RIOT-OS/RIOT/wiki/The-Make-Build-System)
Building and executing an example {#building-and-executing-an-example}
---------------------------------
RIOT provides a number of examples in the `examples/` directory. Every example
has a README that documents its usage and its purpose. You can build them by
typing
~~~~~~~~ {.sh}
make BOARD=samr21-xpro
~~~~~~~~
or
~~~~~~~~ {.sh}
make all BOARD=samr21-xpro
~~~~~~~~
into your shell.
To flash the application to a board just type
~~~~~~~~ {.sh}
make flash BOARD=samr21-xpro
~~~~~~~~
You can then access the board via the serial interface:
~~~~~~~~ {.sh}
make term BOARD=samr21-xpro
~~~~~~~~
If you are using multiple boards you can use the `PORT` macro to specify the
serial interface:
~~~~~~~~ {.sh}
make term BOARD=samr21-xpro PORT=/dev/ttyACM1
~~~~~~~~
Note that the `PORT` macro has a slightly different semantic in `native`. Here
it is used to provide the name of the TAP interface you want to use for the
virtualized networking capabilities of RIOT.
We use `pyterm` as the default terminal application. It is shipped with RIOT in
the `dist/tools/pyterm/` directory. If you choose to use another terminal
program you can set `TERMPROG` (and if need be the `TERMFLAGS`) macros:
~~~~~~~~ {.sh}
make -C examples/gnrc_networking/ term \
BOARD=samr21-xpro \
TERMPROG=gtkterm \
TERMFLAGS="-s 115200 -p /dev/ttyACM0 -e"
~~~~~~~~
Configuring an application {#configuring-an-application}
--------------------------
Many modules in RIOT offer configuration options that will be considered during
compile-time.They are modeled as macros that can be overridden by the user.
Currently there are two ways of doing this: using `CFLAGS` or via
@ref kconfig-in-riot "Kconfig" (the last one is currently only possible for a
subset of modules).
For instructions on how to configure via `CFLAGS` check the
@ref config "identified compile-time configurations". To learn how to use
Kconfig in RIOT, please refer to the @ref kconfig-users-guide.
Default configurations {#default-configurations}
----------------------
When devices have a common access interface, having a default configuration to
enable them across platforms, without having to explicitly specify which modules
to include, comes in handy. For this, two pseudomodules are defined:
- `saul_default`: will enable all the drivers of sensors and actuators that are
present in the target platform.
- `netdev_default`: will enable all the drivers of network devices
present in the target platform.
Use Docker to build RIOT {#docker}
========================
[Docker](https://www.docker.com/) is a platform that allows packaging software into containers that can easily be run on any Linux that has Docker installed.
You can download a RIOT Docker container from the Docker Hub and then use that to build your project making use of all toolchains that we've preinstalled in the container.
Setup {#docker-setup}
-----
### Installing docker
To use the RIOT docker build image, the Docker application needs to be installed on your system.
To install Docker, depending on your operating system, use `sudo apt-get install docker` or a variant.
The user on your computer requires permission to access and use docker. There are two ways to manage this:
- Your OS distribution may create a group called `docker`. If so, then adding yourself to that group (and logging out and in again) should grant you permission.
- Execute docker with sudo. This is in fact the most secure and recommended setup (see [here](https://docs.docker.com/install/linux/linux-postinstall/), [here](https://docs.docker.com/engine/security/security/#docker-daemon-attack-surface), [here](https://www.projectatomic.io/blog/2015/08/why-we-dont-let-non-root-users-run-docker-in-centos-fedora-or-rhel/) and [here](https://fosterelli.co/privilege-escalation-via-docker.html)). No extra setup steps are needed. `make` should be instructed to use `sudo` by setting `DOCKER="sudo docker"` in the command line.
Finally, download the pre-built RIOT Docker container:
```console
# docker pull riot/riotbuild
```
This will take a while. If it finishes correctly, you can then use the toolchains contained in the Docker container:
(**from the riot root**):
```console
$ docker run --rm -i -t -u $UID -v $(pwd):/data/riotbuild riot/riotbuild ./dist/tools/compile_test/compile_test.py
```
# Usage
The RIOT build system provides support for using the Docker container to build RIOT projects, so you do not need to type the long docker command line every time:
(**from the directory you would normally run make, e.g. examples/default**)
```console
$ make BUILD_IN_DOCKER=1
```
If your user does not have permissions to access the Docker daemon:
```console
$ make BUILD_IN_DOCKER=1 DOCKER="sudo docker"
```
to always use Docker for building, set `BUILD_IN_DOCKER=1` (and if necessary `DOCKER="sudo docker"`) in the environment:
```console
$ export BUILD_IN_DOCKER=1
```
running make without specifying `BUILD_IN_DOCKER=1` will still use Docker (because of the environment variable)
Troubleshooting {#docker-troubleshooting}
---------------
On some Ubuntu versions a make with `BUILD_IN_DOCKER=1` can't resolve the host name of for example github.com. To fix this add the file `/etc/docker/daemon.json` with the address of your DNS Server.
Generating `compile_commands.json` e.g. for code completion in IDEs
===================================================================
A `compile_commands.json` for the selected board can be generated by running inside the application
folder the following:
```console
$ make compile-commands
```
This target will honor the variables controlling the build process such as `BOARD`, `TOOLCHAIN`,
`DEVELHELP`, etc. just like the usual build process. This works without actual compilation. By
default, the `compile_commands.json` is placed in the RIOT base directory. This behavior can be
overwritten using the `COMPILE_COMMANDS_PATH` variable by specifying the full absolute path
(including file name) of the `compile_commands.json` instead.
***Note:*** By default, the built-in include search directories of GCC will be explicitly added
and flags incompatible with `clangd` will be dropped. This will allow using `clangd` as language
server out of the box. If this is not desired, run `export COMPILE_COMMANDS_FLAGS=""` to turn
modification of the compile commands off. For a list of available flags, run
`./dist/tools/compile_commands/compile_commands.py --help` in the RIOT base directory.
Using the native port with networking
=====================================
If you compile RIOT for the native cpu and include the `netdev_tap` module,
you can specify a network interface like this: `PORT=tap0 make term`
Setting up a tap network
------------------------
There is a shell script in `RIOT/dist/tools/tapsetup` called `tapsetup` which
you can use to create a network of tap interfaces.
*USAGE*
To create a bridge and two (or `count` at your option) tap interfaces:
~~~~~~~{.sh}
sudo ./dist/tools/tapsetup/tapsetup [-c [<count>]]
~~~~~~~