34 Must Know Terms for Embedded Rust Newbies
7 min read
When I first started out in embedded Rust and engaged with the community, I found myself in the midst of some specific jargon and acronyms. At the time, some of that jargon flew ✈ over my head 👱♂️ faster than a speeding bullet 🔫.
In this post, I try to aggregate many of those terms that I saw/read frequently in the hope to create a quick reference for someone new to the space. Note not all are specific to embedded-Rust and some are already common terms, however, one would see most mentioned ever so often in association.
I used the following icons in an attempt to somewhat categorize the different terms:
- 🛠 Tools (Debug, Flash, Protocol, or Utility)
- 🖼 Framework/Runtime
- 🏗 Repository/Project
- 📁 File Extension
- 🦀 Rust Keyword/Trait/Type
- 📦 Library/Crate
If you want to read more about a particular term, many of the terms have embedded links if you click on the term itself.
Here it goes:
🖼 RTIC - Short for Real-Time Interrupt-driven Concurrency which is a framework (Not an Operating System) for building real-time systems. As a starter, you'd probably get introduced to this framework as an alternative for implementing interrupt-based applications. RTIC provides a less verbose and more structured way of dealing with interrupts in Rust.
🖼 RTFM - Short for Real-Time for the Masses, this was the older naming for the RTIC framework.
async- Used in the context of multi-threaded applications,
asyncis a keyword used in Rust ahead of a function to make it return a
Futureor promise to resolve.
await- Also used in the context of multi-threaded applications,
awaitis a keyword used inside an
asyncblock/function that makes the application wait until the
Futureor promise resolves.
awaitare commonly mentioned in conjunction with each other as
Future- Is used in asynchronous programming and is a trait representing a value that might not have finished computation yet. A
Futuremakes it possible for a thread to continue doing useful work until a value becomes available.
🖼 Tokio - Tokio is a Rust runtime for writing multi-threaded asynchronous applications. Tokio builds on Rust's asynchronous features to provide a runtime, APIs (networking, filesystem operations..etc.), and asynchronous task tools among others.
🖼 Embassy - Can be considered as the embedded version of Tokio albeit more compact and with fewer features. Embassy is a more encompassing HAL and also can serve as an alternative to the RTIC framework.
🖼 uAMP (microAMP) - A (micro) framework for building bare-metal AMP (Asymmetric Multi-Processing) applications. It's the core foundation of the multi-core version of (RTIC).
Cow- This one is probably a bit out of context but I saw it way too often that I had to mention it. The naming is quite confusing obviously 🐄. It turns out that
Cowis a type of smart pointer similar to
Arc, where it stands for clone-on-write.
🏗 Knurling - The term is used in reference to the Knurling-rs project created by Ferrous Systems, a consulting firm specialized in Rust. The goal of the Knurling project is to enhance bare metal development using Rust by providing training material and tools.
🛠 Probe-run - is one of the Knurling tools introduced to easily flash and run embedded applications on baremetal devices. Probe-run also provides stack backtraces that mimic Rust panicking behavior to see where things go wrong. Additional detail here.
🛠 Defmt - is also part of the Knurling tools and is logging framework for microcontrollers. Sort of an efficient alternative for the traditional serial monitor using UART. defmt stands for "deferred formatting". Additional detail here.
🛠 Flip-Link - Another Kunrling tool that is a linker wrapper that adds stack overflow protection to embedded applications. Additional detail here.
🦀 FFI - Short for Foreign Function Interface which is a function interface that allows calls to C library functions from within Rust.
🛠 RTT - Short for Real-Time Transfer and refers to a protocol created by J-Link used in debugging microcontroller devices.
📦 rtt_target - Crate that provides the target side implementation of the RTT protocol.
📦 defmt-rtt - Crate that supports transmitting defmt log messages over the RTT (Real-Time Transfer) protocol.
📦 PAC - Short for peripheral access crate and is a lower layer of abstraction that provides a wrapper around microcontroller peripherals memory mapped registers. Typically each microcontroller has its own PAC.
📦 HAL - Short for Hardware Abstraction Layer which provides a higher level of abstraction and is the layer that sits on top of the PAC. Several microcontrollers can be bundled under one HAL.
📁 SVD - Short for System View Description and is a file format that formalizes the description of the system contained in microcontrollers, in particular, the memory mapped registers of peripherals. The detail contained in system view descriptions is comparable to the data in device reference manuals.
🛠 SVD2Rust - Is a command line tool that transforms SVD files into crates that expose a type safe API to access the peripherals of the device.
🛠 cargo-embed - Part of probe-rs, cargo-embed is a cargo subcommand that supports flashing and debug logging of embedded targets.
🛠 cargo-flash - Also part probe-rs, and is a cargo subcommand for flashing embedded targets.
🛠 OpenOCD - Short for Open On-Chip Debugger and is a program that provides an interface between a debug adapter and a host computer. OpenOCD provides debug, test, and programming capabilities for microcontrollers.
🛠 GDB - Part of a debugging toolchain and short for GNU Debugger. GDB is a popular platform used in debugging applications. It provides a user interface to debug microcontroller applications. GDB typically connects to a microcontroller through OpenOCD.
🛠 ITM - Short for Instrumentation Trace Macrocell and is a debug feature/tool available in particular on ARM Cortex-M devices and is an application driven microcontroller trace source for debugging embedded applications. Also one of the possible options to replace traditional serial monitoring.
🛠 Semihosting - is another logging mechanism/framework for embedded systems application debugging. Also another alternative for traditional serial communication logging.
It's probably obvious at this point that there are many logging mechanisms/frameworks. The choice typically would depend on the speed and features of a mechanism. Some are considered slower than others and some also consume more application overhead than others. Here is a blog post from 2017 that nicely explains the differences.
📦 nalgebra - is the name for a linear algebra library written using Rust. This library is commonly used with the Rust-embedded graphics library.
🖼 WASM - is short for Web Assembly and provides a standard for writing applications in a particular format known as a binary instruction format. Technically, application code in any programming language can be compiled into WASM. The generated bytecode, as a result, needs to run in a virtualized environment that can execute the WASM bytecode. This means that WASM can also technically execute on any platform. WASM is commonly referred to as a build target for a conceptual machine.
🖼 WASI - is short for web assembly system interface and enables the usage of WASM outside the context of the web. Essentially WASI provides a mechanism (or standard to be more accurate) for WASM to access system functions. It is often mentioned that WASI provides the view of a conceptual operating system withing WASM. For more on the difference between WASM and WASI here is a useful Stackoverflow post.
📁 witx is a file format based on the WASM text format. witx is also supposed to provide a set of specifications for embedded device interfaces.
🏗 esp-rs - Name of the project containing libraries, crates, and examples for using Rust on Espressif SoC's
🏗 rp-rs - Name of the project containing libraries, crates, and examples for using Rust on the rasberry pi series of microcontrollers.
🏗 stm32-rs - Name of the project containing libraries, crates, and examples for using Rust on STM32 microcontrollers
Monitoring embedded Rust community chatter can be challenging for a noob that isnt familiar with many terms. As I've progressed in embedded Rust myself, I've made a list of terms that I found useful and summarized in this post. I hope for the new learners to be able to leverage this list and find it useful. What was your experience like? Are there different terms you encountered? Share your thoughts in the comments 👇.
Did you find this article valuable?
Support Omar Hiari by becoming a sponsor. Any amount is appreciated!