[PATCH v2] user: Add docu for use of Rust with RTEMS
Frank Kühndel
frank.kuehndel at embedded-brains.de
Fri Mar 15 14:14:01 UTC 2024
Ping!
The last discussion of this patch was
https://lists.rtems.org/pipermail/devel/2024-February/077289.html
Does the fact that I recive no further comments to this patch mean it
can be pushed to the RTEMS User Manual as it is?
Greetings
Frank
On 2/23/24 17:29, Frank Kuehndel wrote:
> From: Frank Kühndel<frank.kuehndel at embedded-brains.de>
>
> ---
> user/index.rst | 3 +-
> user/overview/index.rst | 2 +
> user/rust/bare-metal.rst | 548 +++++++++++++++++++++++++++++++++++++++
> user/rust/index.rst | 64 +++++
> 4 files changed, 616 insertions(+), 1 deletion(-)
> create mode 100644 user/rust/bare-metal.rst
> create mode 100644 user/rust/index.rst
>
> diff --git a/user/index.rst b/user/index.rst
> index 5b7f3ce..0cc6b2c 100644
> --- a/user/index.rst
> +++ b/user/index.rst
> @@ -18,7 +18,7 @@ RTEMS User Manual (|version|).
> ||copy| 2018 Shashvat Jain
> ||copy| 2018 Vidushi Vashishth
> ||copy| 2017 Tanu Hari Dixit
> - ||copy| 2016, 2019 embedded brains GmbH & Co. KG
> + ||copy| 2016, 2024 embedded brains GmbH & Co. KG
> ||copy| 2016, 2019 Sebastian Huber
> ||copy| 2012, 2022 Chris Johns
> ||copy| 2012, 2020 Gedare Bloom
> @@ -51,5 +51,6 @@ RTEMS User Manual (|version|).
>
> tools/index
> rsb/index
> + rust/index
>
> glossary/index
> diff --git a/user/overview/index.rst b/user/overview/index.rst
> index 16389d9..cc292e1 100644
> --- a/user/overview/index.rst
> +++ b/user/overview/index.rst
> @@ -66,6 +66,8 @@ RTEMS provides the following basic feature set:
>
> - Python and MicroPython
>
> + - :ref:`Rust <Rust>`
> +
> - Parallel languages
>
> - :ref:term:`EMB²`
> diff --git a/user/rust/bare-metal.rst b/user/rust/bare-metal.rst
> new file mode 100644
> index 0000000..b1c3980
> --- /dev/null
> +++ b/user/rust/bare-metal.rst
> @@ -0,0 +1,548 @@
> +.. SPDX-License-Identifier: CC-BY-SA-4.0
> +
> +.. Copyright (C) 2024 embedded brains GmbH & Co. KG
> +
> +.. _RustBareMetal:
> +
> +Bare Metal Rust with RTEMS
> +==========================
> +
> +To develop with Rust and RTEMS together, you must find a Rust bare metal
> +target which matches an RTEMS BSP. The instructions in this section
> +are for a SPARC and a Risc-V*hello world* program. These examples use
> +the combinations shown in the table below:
> +
> ++--------------------+------------------+----------------------------+--------------+
> +| RTEMS Architecture | RTEMS BSP | Rust Target | Rust CPU |
> ++====================+==================+============================+==============+
> +| rtems-sparc | sparc/leon3 | sparc-unknown-none-elf | leon3 |
> ++--------------------+------------------+----------------------------+--------------+
> +| rtems-riscv | riscv/rv64imafdc | riscv64gc-unknown-none-elf | generic-rv64 |
> ++--------------------+------------------+----------------------------+--------------+
> +
> +The following sources may be helpful to find a matching BSP and target:
> +
> +- ``./waf bsplist`` -- executed in an RTEMS git clone
> +- ``source-builder/sb-set-builder --list-bsets`` -- executed in an
> + RTEMS source builder git clone
> +- `RTEMS Supported Architectures<https://devel.rtems.org/wiki/TBR/UserManual/SupportedCPUs>`_
> +- `RTEMS Board Support Packages<https://devel.rtems.org/wiki/TBR/Website/Board_Support_Packages>`_
> +- ``rustc --print target-list``
> +- ``rustc --target=riscv64gc-unknown-none-elf --print target-features``
> +- ``rustc --target=riscv64gc-unknown-none-elf --print target-cpus``
> +- `Rust Platform Support<https://doc.rust-lang.org/nightly/rustc/platform-support.html>`_
> +
> +The sample instructions which follow build two executables using the
> +same source code for the RTEMS configuration ``init.c`` and the Rust
> +hello-world application ``lib.rs``. Only the configuration as well as
> +the compile and link commands differ for SPARC Leon3 and RISC-V
> +64 bit. The Rust application uses ``printk()`` from RTEMS to print
> +text to the console.
> +
> +After building the RTEMS BSP and installing Rust, the basic steps are:
> +
> +1. Compile the RTEMS configuration in ``init.c`` into an object
> + file using the GNU C compiler from the RTEMS tool chain.
> +2. Compile the Rust code containing ``main()`` into a
> + static library using the Rust compiler.
> +3. Link the static library with the Rust code,
> + the RTEMS configuration and the RTEMS OS libraries
> + together into one single executable.
> +4. Finally run the executable on a simulator.
> +
> +You can build the examples in a container. This is optional. If you
> +prefer to follow these instructions directly on your machine simply
> +skip the section*Build a Container*. Just make sure that you machine
> +meets all prerequisites to build the RTEMS tools and install the Rust
> +tools.
> +
> +.. _RustBareMetal_Container:
> +
> +Build a Container
> +-----------------
> +
> +The container must be able to execute the RTEMS source builder and to
> +install and run the Rust tools. In an empty directory of your choice
> +create the following ``Dockerfile``.
> +
> +.. code-block:: shell
> +
> + cat >Dockerfile <<"EOF"
> + # Dockerfile to build a container image to use Rust on top of RTEMS
> + FROM ubuntu:22.04
> + RUN apt-get update && \
> + apt-get -y upgrade && \
> + apt-get install -y \
> + bison \
> + build-essential \
> + curl \
> + flex \
> + g++ \
> + gdb \
> + git \
> + libncurses5-dev \
> + ninja-build \
> + pax \
> + pkg-config \
> + python3-dev \
> + python-is-python3 \
> + qemu-system-misc \
> + texinfo \
> + unzip \
> + zlib1g-dev && \
> + apt-get clean && \
> + rm -rf/var/lib/apt/lists/*
> + RUN useradd -c "Rust Developer" -g "users" \
> + -d "/home/ferris" --create-home "ferris" && \
> + mkdir -p /opt/rtems && \
> + chown ferris:users /opt/rtems && \
> + runuser -u ferris echo 'export PATH=/opt/rtems/6/bin:${PATH}' \
> + >>/home/ferris/.bashrc
> + USER ferris
> + WORKDIR /home/ferris
> + CMD ["/bin/bash"]
> + EOF
> +
> +Podman is used in the shell commands below. If you prefer Docker
> +simply replace ``podman`` through ``docker``.
> +
> +Build the container image ``rtems_rust``, create and start a container
> +with these commands:
> +
> +.. code-block:: shell
> +
> + podman build -t rtems_rust .
> + podman run -it --name=rusty_rtems rtems_rust bash
> +
> +To follow the step-by-step instructions of the next sub-sections,
> +simply execute them as user ``ferris`` in the container. Note that
> +this container will not automatically be deleted on ``exit``.
> +The building of the RTEMS tools takes a while and you probably want
> +to keep the container for further experiments.
> +
> +.. _RustBareMetal_RTEMSTools:
> +
> +Build the RTEMS Tools
> +---------------------
> +
> +In an empty directory of your choice, clone the RTEMS source builder
> +git repository:
> +
> +.. code-block:: shell
> +
> + git clone git://git.rtems.org/rtems-source-builder.git rsb
> +
> +Next build the RTEMS tools. In this example, you need tools for
> +*SPARC* and*RISC-V* architectures. The source builder installs them
> +in the prefix directory ``/opt/rtems/6``. The directory ``/opt/rtems``
> +must exist and the user must have read and write access.
> +
> +.. code-block:: shell
> +
> + cd rsb/rtems
> + ../source-builder/sb-set-builder --prefix /opt/rtems/6 \
> + 6/rtems-sparc \
> + 6/rtems-riscv
> + cd ../..
> +
> +The tools will end up in ``/opt/rtems/6/bin`` and that directory
> +should be part of the ``$PATH`` environment variable of the user. For
> +example:
> +
> +.. code-block:: shell
> +
> + export PATH=/opt/rtems/6/bin:${PATH}
> +
> +The following commands should work:
> +
> +.. code-block:: shell
> +
> + sparc-rtems6-gcc --version
> + riscv-rtems6-gcc --version
> +
> +.. _RustBareMetal_RTEMSBSP:
> +
> +Build and Install the RTEMS BSPs
> +--------------------------------
> +
> +Clone the RTEMS git repository:
> +
> +.. code-block:: shell
> +
> + git clone git://git.rtems.org/rtems.git
> +
> +Create a ``config.ini`` file for the two BSPs for which your are going
> +to build RTEMS:
> +
> +.. code-block:: shell
> +
> + cd rtems
> +
> + cat >config.ini <<"EOF"
> + [sparc/leon3]
> + RTEMS_SMP = True
> + [riscv/rv64imafdc]
> + EOF
> +
> +Build and install RTEMS:
> +
> +.. code-block:: shell
> +
> + ./waf configure --prefix=/opt/rtems/6
> + ./waf
> + ./waf install
> +
> +Run some RTEMS tests to make sure the installation and the emulators
> +are working:
> +
> +.. code-block:: shell
> +
> + sparc-rtems6-sis -leon3 -nouartrx -r m 4 build/sparc/leon3/testsuites/samples/hello.exe
> + sparc-rtems6-sis -leon3 -nouartrx -r m 4 build/sparc/leon3/testsuites/samples/ticker.exe
> + qemu-system-riscv64 -M virt -nographic -bios build/riscv/rv64imafdc/testsuites/samples/hello.exe
> + qemu-system-riscv64 -M virt -nographic -bios build/riscv/rv64imafdc/testsuites/samples/ticker.exe
> +
> +Finally, leave the git working tree:
> +
> +.. code-block:: shell
> +
> + cd ..
> +
> +.. _RustBareMetal_InstallRust:
> +
> +Install and Setup Rust Tools
> +----------------------------
> +
> +Install Rust from the web-page with this command:
> +
> +.. code-block:: shell
> +
> + curl --proto '=https' --tlsv1.2 -sSfhttps://sh.rustup.rs | sh
> +
> +At this point you must setup the environment variables:
> +
> +.. code-block:: shell
> +
> + source "$HOME/.cargo/env"
> +
> +Check that rust is correctly setup:
> +
> +.. code-block:: shell
> +
> + rustup update
> + cargo --version
> +
> +.. _RustBareMetal_Sources:
> +
> +Setup a Rust Project and Create Sources
> +---------------------------------------
> +
> +Write a simple RTEMS ``init.c`` to configure RTEMS in a new directory:
> +
> +.. code-block:: shell
> +
> + mkdir example-rust
> + cd example-rust
> +
> + cat >init.c <<"EOF"
> + /*
> + * Simple RTEMS configuration
> + */
> +
> + #define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
> + #define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
> +
> + #define CONFIGURE_UNLIMITED_OBJECTS
> + #define CONFIGURE_UNIFIED_WORK_AREAS
> +
> + #define CONFIGURE_RTEMS_INIT_TASKS_TABLE
> +
> + #define CONFIGURE_INIT
> +
> + #include <rtems/confdefs.h>
> + EOF
> +
> +Create a new Rust project which produces a static linked library:
> +
> +.. code-block:: shell
> +
> + cargo new --lib --vcs=none hello-rtems
> + sed -i '/^#/ a \\n[lib]\ncrate-type = ["staticlib"]' hello-rtems/Cargo.toml
> +
> +Store the Rust application code:
> +
> +.. code-block:: rust
> +
> + cat >hello-rtems/src/lib.rs <<"EOF"
> + #![no_std]
> + #![no_main]
> +
> + use core::fmt::Write;
> + use core::ffi::c_char;
> +
> + extern "C" {
> + fn printk(fmt: *const core::ffi::c_char, ...) -> core::ffi::c_int;
> + fn rtems_panic(fmt: *const core::ffi::c_char, ...) -> !;
> + fn rtems_shutdown_executive(fatal_code: u32);
> + }
> +
> + /// Write text to the console using RTEMS `printk()` function
> + struct Console;
> +
> + impl core::fmt::Write for Console {
> + fn write_str(&mut self, message: &str) -> core::fmt::Result {
> + const FORMAT_STR: &core::ffi::CStr = {
> + let Ok(s) = core::ffi::CStr::from_bytes_with_nul(b"%.*s\0") else {
> + panic!()
> + };
> + s
> + };
> + if message.len() != 0 {
> + unsafe {
> + printk(FORMAT_STR.as_ptr(), message.len() as core::ffi::c_int, message.as_ptr());
> + }
> + }
> + Ok(())
> + }
> + }
> +
> + /// Our `Init()` calls `rust_main()` and handles errors
> + #[no_mangle]
> + pub extern "C" fn Init() {
> + if let Err(e) = rust_main() {
> + panic!("Main returned {:?}", e);
> + }
> + unsafe {
> + rtems_shutdown_executive( 0 );
> + }
> + }
> +
> + /// This is the main function of this program
> + fn rust_main() -> Result<(), core::fmt::Error> {
> + let mut console = Console;
> + writeln!(console, "Hello from Rust")?;
> + Ok(())
> + }
> +
> + /// Handle panic by forwarding it to the `rtems_panic()` handler
> + #[panic_handler]
> + fn panic(panic: &core::panic::PanicInfo) -> ! {
> + // The panic message can only be reached from libcore in unstable
> + // (i.e. nightly builds). Print at least the location raising the panic.
> + // Seehttps://www.ralfj.de/blog/2019/11/25/how-to-panic-in-rust.html
> + if let Some(location) = panic.location() {
> + const FORMAT_STR: *const c_char = {
> + const BYTES: &[u8] = b"Panic occurred at %.*s:%d:%d\n\0";
> + BYTES.as_ptr().cast()
> + };
> + if location.file().len() != 0 {
> + unsafe {
> + rtems_panic(FORMAT_STR,
> + location.file().len() as core::ffi::c_int,
> + location.file().as_ptr(),
> + location.line() as core::ffi::c_int,
> + location.column() as core::ffi::c_int,
> + );
> + }
> + }
> + }
> +
> + // If there is no location, fall back to the basic.
> + let message = "Panic occured!";
> + const FORMAT_PTR: *const c_char = {
> + const BYTES: &[u8] = b"%.*s\n\0";
> + BYTES.as_ptr().cast()
> + };
> + unsafe {
> + rtems_panic(FORMAT_PTR,
> + message.len() as core::ffi::c_int,
> + message.as_ptr());
> + }
> + }
> + EOF
> +
> +Create a configuration file for Cargo:
> +
> +.. code-block:: shell
> +
> + mkdir hello-rtems/.cargo
> +
> + cat >hello-rtems/.cargo/config.toml <<"EOF"
> + [target.riscv64gc-unknown-none-elf]
> + # Either kind should work as a linker
> + linker = "riscv-rtems6-gcc"
> + # linker = "riscv-rtems6-clang"
> + rustflags = [
> + # See `rustc --target=riscv64gc-unknown-none-elf --print target-cpus`
> + "-Ctarget-cpu=generic-rv64",
> + # The linker is a gcc compatible C Compiler
> + "-Clinker-flavor=gcc",
> + # Pass these options to the linker
> + "-Clink-arg=-march=rv64imafdc",
> + "-Clink-arg=-mabi=lp64d",
> + "-Clink-arg=-mcmodel=medany",
> + # Rust needs libatomic.a to satisfy Rust's compiler-builtin library
> + "-Clink-arg=-latomic",
> + ]
> + runner = "qemu-system-riscv64 -M virt -nographic -bios"
> +
> + # Target available in rust nightly from 2023-07-18
> + [target.sparc-unknown-none-elf]
> + # Either kind should work as a linker
> + linker = "sparc-rtems6-gcc"
> + # linker = "sparc-rtems6-clang"
> + rustflags = [
> + # The target is LEON3
> + "-Ctarget-cpu=leon3",
> + # The linker is a gcc compatible C Compiler
> + "-Clinker-flavor=gcc",
> + # Pass these options to the linker
> + "-Clink-arg=-mcpu=leon3",
> + # Rust needs libatomic.a to satisfy Rust's compiler-builtin library
> + "-Clink-arg=-latomic",
> + ]
> + runner = "sparc-rtems6-sis -leon3 -nouartrx -r m 4"
> +
> + [build]
> + target = ["riscv64gc-unknown-none-elf", "sparc-unknown-none-elf"]
> +
> + [unstable]
> + build-std = ["core"]
> + EOF
> +
> +.. _RustBareMetal_BuildRiscV:
> +
> +Build and Run on RISC-V
> +-----------------------
> +
> +First, download some additional files needed for this target:
> +
> +.. code-block:: shell
> +
> + rustup target add riscv64gc-unknown-none-elf
> +
> +Compile the Rust source file into a static library:
> +
> +.. code-block:: shell
> +
> + cd hello-rtems
> + cargo build --target=riscv64gc-unknown-none-elf
> + cd ..
> +
> +This should create
> +``hello-rtems/target/riscv64gc-unknown-none-elf/debug/libhello_rtems.
> +a``. Note that the project directory (``hello-rtems``) is written with
> +a minus "``-``" while the library (``libhello_rtems.a``) is written
> +with an underscore "``_``".
> +
> +Compile the RTEMS ``init.c`` file and link everything
> +together into a single executable:
> +
> +.. code-block:: shell
> +
> + export PKG_CONFIG_RISCV=/opt/rtems/6/lib/pkgconfig/riscv-rtems6-rv64imafdc.pc
> +
> + riscv-rtems6-gcc -Wall -Wextra -O2 -g -fdata-sections -ffunction-sections \
> + $(pkg-config --cflags ${PKG_CONFIG_RISCV}) init.c -c -o init_riscv.o
> +
> + riscv-rtems6-gcc init_riscv.o \
> + -Lhello-rtems/target/riscv64gc-unknown-none-elf/debug \
> + -lhello_rtems \
> + -ohello_rtems_riscv.exe \
> + $(pkg-config --variable=ABI_FLAGS ${PKG_CONFIG_RISCV}) \
> + $(pkg-config --libs ${PKG_CONFIG_RISCV})
> +
> +This should produce the executable file ``hello_rtems_riscv.exe``. Finally,
> +run the executable on an emulator (``qemu``):
> +
> +.. code-block:: shell
> +
> + rtems-run --rtems-bsp=rv64imafdc hello_rtems_riscv.exe
> +
> +The emulator run should produce the following output:
> +
> +.. code-block:: none
> +
> + RTEMS Testing - Run, 6.0.not_released
> + Command Line: /opt/rtems/6/bin/rtems-run --rtems-bsp=rv64imafdc hello_rtems_riscv.exe
> + Host: Linux 7319d7ad96ee 5.14.21-150500.228.g3903735-default #1 SMP PREEMPT_DYNAMIC Fri Jan 19 17:58:02 UTC 2024 (3903735) x86_64
> + Python: 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0]
> + Host: Linux-5.14.21-150500.228.g3903735-default-x86_64-with-glibc2.35 (Linux 7319d7ad96ee 5.14.21-150500.228.g3903735-default #1 SMP PREEMPT_DYNAMIC Fri Jan 19 17:58:02 UTC 2024 (3903735) x86_64 x86_64)
> + Hello from Rust
> +
> + [ RTEMS shutdown ]
> + RTEMS version: 6.0.0.b1fdf753387189afe720d3fa1ac13af5fb9943c2
> + RTEMS tools: 13.2.0 20230727 (RTEMS 6, RSB 43d029e85817bd78dc564ffa265c18fccc428dc4, Newlib 3cacedb)
> + executing thread ID: 0x0a010001
> + executing thread name: UI1
> + Run time : 0:00:00.255214
> +
> +.. _RustBareMetal_BuildSparc:
> +
> +Build and Run on SPARC
> +----------------------
> +
> +You need to use the Rust nightly build because the support for
> +Gaisler LEON3/4/5 was added in July 2023 and is not yet available
> +in stable Rust:
> +
> +.. code-block:: shell
> +
> + rustup toolchain add nightly
> + rustup component add rust-src --toolchain=nightly
> +
> +Compile the Rust source file into a static library:
> +
> +.. code-block:: shell
> +
> + cd hello-rtems
> + cargo +nightly build --target=sparc-unknown-none-elf
> + cd ..
> +
> +It should create
> +``hello-rtems/target/sparc-unknown-none-elf/debug/libhello_rtems.a``.
> +
> +Compile the RTEMS ``init.c`` file and link everything
> +together into an executable:
> +
> +.. code-block:: shell
> +
> + export PKG_CONFIG_SPARC=/opt/rtems/6/lib/pkgconfig/sparc-rtems6-leon3.pc
> +
> + sparc-rtems6-gcc -Wall -Wextra -O2 -g -fdata-sections -ffunction-sections \
> + $(pkg-config --cflags ${PKG_CONFIG_SPARC}) init.c -c -o init_sparc.o
> +
> + sparc-rtems6-gcc init_sparc.o \
> + -qnolinkcmds -T linkcmds.leon3 \
> + -Lhello-rtems/target/sparc-unknown-none-elf/debug \
> + -lhello_rtems \
> + -ohello_rtems_sparc.exe \
> + $(pkg-config --libs ${PKG_CONFIG_SPARC})
> +
> +This should produce the executable file ``hello_rtems_sparc.exe``. Finally,
> +run the executable on an emulator (``sis``):
> +
> +.. code-block:: shell
> +
> + rtems-run --rtems-bsp=leon3-sis hello_rtems_sparc.exe
> +
> +The emulator run should produce the following output:
> +
> +.. code-block:: none
> +
> + RTEMS Testing - Run, 6.0.not_released
> + Command Line: /opt/rtems/6/bin/rtems-run --rtems-bsp=leon3-sis hello_rtems_sparc.exe
> + Host: Linux 7319d7ad96ee 5.14.21-150500.228.g3903735-default #1 SMP PREEMPT_DYNAMIC Fri Jan 19 17:58:02 UTC 2024 (3903735) x86_64
> + Python: 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0]
> + Host: Linux-5.14.21-150500.228.g3903735-default-x86_64-with-glibc2.35 (Linux 7319d7ad96ee 5.14.21-150500.228.g3903735-default #1 SMP PREEMPT_DYNAMIC Fri Jan 19 17:58:02 UTC 2024 (3903735) x86_64 x86_64)
> +
> + SIS - SPARC/RISCV instruction simulator 2.30, copyright Jiri Gaisler 2020
> + Bug-reports tojiri at gaisler.se
> +
> + LEON3 emulation enabled, 4 cpus online, delta 50 clocks
> +
> + Loaded hello_rtems_sparc.exe, entry 0x40000000
> + Hello from Rust
> + cpu 0 in error mode (tt = 0x80)
> + 218400 40019fa0: 91d02000 ta 0x0
> + Run time : 0:00:00.255628
> diff --git a/user/rust/index.rst b/user/rust/index.rst
> new file mode 100644
> index 0000000..487d64a
> --- /dev/null
> +++ b/user/rust/index.rst
> @@ -0,0 +1,64 @@
> +.. SPDX-License-Identifier: CC-BY-SA-4.0
> +
> +.. Copyright (C) 2024 embedded brains GmbH & Co. KG
> +
> +.. index:: Rust
> +
> +.. _Rust:
> +
> +Rust
> +****
> +
> +The number of users of the modern programming language Rust grows
> +steadily. Fans can opt for RTEMS as OS when writing Rust
> +applications on embedded devices. The sections of this chapter
> +provide step by step instructions to get started.
> +
> +There are two basic approaches to use Rust together with RTEMS:
> +
> +Bare metal Rust
> + The Rust compiler translates the application code for a target
> + without operating system -- for example ``sparc-unknown-none-elf``.
> + The disadvantage of this approach is that no standard Rust library
> + is available (``#![no_std]`` in Rust code). The advantage is
> + that all targets supported by both Rust and RTEMS can
> + immediately be used.
> +
> +Rust with std lib
> + The Rust compiler translates the application code for an RTEMS
> + specific target -- for example ``armv7-unknown-rtems-eabi``.
> + The advantage is that all functions from the standard Rust library
> + are available. The disadvantage is that such targets are rare.
> +
> + At the time of writing no such target exists. A first target for ARM
> + is planed to be published soon. The reason for the lack of targets is
> + that one must be implemented for each architecture, published to the
> + Rust compiler sources and maintained by someone.
> +
> +Common to all approaches is the general way how Rust is used with RTEMS:
> +
> +1. The RTEMS tools for the architecture are needed. See
> + :ref:`Install the Tool Suite <QuickStartTools>`.
> +
> +2. The RTEMS kernel for the BSP is compiled to libraries. See
> + :ref:`Build a Board Support Package (BSP) <QuickStartBSPBuild>`.
> +
> +3. A Rust project for the application code is created and configured.
> +
> +4. The Rust code of the application is compiled into a library
> + for the target.
> +
> +5. The Rust application library and the RTEMS kernel libraries are
> + linked together into a single executable file.
> +
> +6. The executable file is either run in an emulator or loaded onto
> + the hardware and executed there.
> +
> +At the time of writing, there is no common Rust interface for the
> +pubic RTEMS functions available. Currently, developers must declare RTEMS
> +functions they want to call. This is especially relevant when the
> +*Bare metal Rust* approach is used.
> +
> +.. toctree::
> +
> + bare-metal
> -- 2.35.3 _______________________________________________ devel mailing
> list devel at rtems.org http://lists.rtems.org/mailman/listinfo/devel
>
--
embedded brains GmbH & Co. KG
Herr Frank KÜHNDEL
Dornierstr. 4
82178 Puchheim
Germany
email: frank.kuehndel at embedded-brains.de
phone: +49-89-18 94 741 - 23
mobile: +49-176-15 22 06 - 11
Registergericht: Amtsgericht München
Registernummer: HRA 117265
Vertretungsberechtigte Geschäftsführer: Peter Rasmussen, Thomas Dörfler
Unsere Datenschutzerklärung finden Sie hier:
https://embedded-brains.de/datenschutzerklaerung/
More information about the devel
mailing list