# ROMEO Onboard Software (OBSW) ## What is ROMEO? [For a broader introduction and documentation refer to the OBSW Wiki in the ROMEO Knowledge Base](https://openproject.mm.intra.irs.uni-stuttgart.de/projects/romeo-phase-c/wiki/obsw). This README gives a very brief introduction and aims to document the compile process for experienced developers. [_Research and Observation in Medium Earth Orbit (ROMEO)_](https://www.irs.uni-stuttgart.de/en/research/satellitetechnology-and-instruments/smallsatelliteprogram/romeo/) is the third small satellite of the Institute of Space Systems (IRS), University of Stuttgart with the objective of technology demonstration in Medium and Low Earth Orbit (MEO/LEO) with a mission duration of 1 year. The Onboard Software (OBSW) is written in Rust for run-time stability. The implemented framework is losely based on the C++ Flight Software Framework (FSFW) developed at the IRS in cooperation with industry. The shift to Rust was discussed in Paul Nehlich's master thesis: [_Analysis and preparation of the transformation of the Flight Software Framework from C++ to Rust_](https://www.researchgate.net/publication/372439213_Analysis_and_preparation_of_the_transformation_of_the_Flight_Software_Framework_from_C_to_Rust). ROMEO Preliminary Design (design from IRS ROMEO Website) ## How to Configure This Repository? TODO # First Stage Bootloader (FSBL) FSBL code is at https://github.com/Xilinx/embeddedsw/tree/xilinx_v2024.1/lib/sw_apps/zynq_fsbl ## Scope This is the central repository for the flight software of the ROMEO satellite. It will eventually become the new base of a Rust Flight Software Framework replacing the C++ Flight Software Framework of the FLP, EIVE and SOURCE. The current working steps are: - Build Toolchain (Daniel Philipp) - Hardware itnerfaces (Paul Nehlich) - CAN Bus (Andy Hinkel) - RS422 (Paul Nehlich, Joris Janßen) - Device Handling Fundamentals (Joris Janßen) - Framework Core Component Implementation (Paul Nehlich, Ulrich Mohr) - Integration of Space Packets and PUS Services (to be scheduled, Paul Nehlich) - OBC Board support and Linux Boot Management (Michael Steinert) - Device Integration - AOCS - TCS - Communications Interfaces ## How to build the software? Consider using Docker or setting up a local compile toolchain. Please refer to [BUILD_WITH_DOCKER.md](./BUILD_WITH_DOCKER.md) or [BUILD_WITH_CMAKE.md](./BUILD_WITH_CMAKE.md). ### Compiling Annotations Bare metal rust on the Zynq requires the use of C-libraries, which affects the compilation. The current setup includes `cmake` which calls `cargo`to compile the rust `mission` and `framework` creates as `static libraries`. Then, `gcc` is used to link those two libraries , the `Xilinx Board Support Packages (BSP)` (incl. all hardware drivers), and supplier libraries in the final binary. The canocial compiler is debian bookkworm's `arm-none-eabi-gcc 12.2` using `newlib 3.3.0`. The **minimum** set of **compiler** (not linker) **flags** (as used by Xilinx to build the First Stage Bootloader (FSBL)) are + hardware (HW) type: `-mcpu=cortex-a9 -mfpu=vfpv3 -mfloat-abi=hard` + function and data sections, to be able to garbage-collect unused code: `-ffunction-sections -fdata-sections` + optimization for release: `-O2` Link Time Optimization (LTO) TBD ## How to debug on hardware? Please refer to [DEBUG_ON_ZEDBOARD.md](./DEBUG_ON_ZEDBOARD.md)