# mos-renode
**Repository Path**: Eplankton/mos-renode
## Basic Information
- **Project Name**: mos-renode
- **Description**: MOS emulation on Renode π
- **Primary Language**: C/C++
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 4
- **Forks**: 1
- **Created**: 2024-10-04
- **Last Updated**: 2026-06-14
## Categories & Tags
**Categories**: Uncategorized
**Tags**: RTOS, Cpp, ζδ½η³»η», ε΅ε
₯εΌ
## README
**[δΈζ](https://gitee.com/Eplankton/mos-renode) | [English](https://github.com/Eplankton/mos-renode)**
> [!NOTE]
> This project is currently under actively developing and improving, some APIs and interfaces may change as the design continues to mature.
## About π
- **MOS** is a Real-Time Operating System (RTOS) project built in C++/Rust, which consists of a preemptive kernel and a command-line shell with other applications (e.g., **GuiLite** and **FatFS**).
- [**Renode**](https://renode.io/) is a virtual development tool created by [**Antmicro**](https://antmicro.com/) for multi-node embedded networks (both wired and wireless) and is intended to enable a scalable workflow for creating effective, tested and secure IoT systems.
## Repository π
- `mos-core` - The Kernel and the Shell, check **[here](https://github.com/Eplankton/mos-core)**.
- `mos-stm32` - Running on STM32 series, check **[here](https://github.com/Eplankton/mos-stm32)**.
- `mos-renode` - Test on Renode emulation, check **[here](https://github.com/Eplankton/mos-renode)**.
- `mos-rust` - A "Vibe Coding" Chimera, check **[here](https://github.com/Eplankton/mos-rust)**.
## Start π¦
- ### Use CMake
- Install the **CMake** and the `Arm GNU Toolchain`
- Run `./build.sh` to call **CMake Tools** and build the project
- ### Use EIDE
- Run `git submodule init && git submodule update` to pull the submodule `core`
- Install **[EIDE](https://em-ide.com)** extension and the `Arm GNU Toolchain`, then open `*.code-workspace` using `VS Code`
- ### Renode Emulation
- Install the **[Renode](https://github.com/renode/renode?tab=readme-ov-file#installation)** platform, and add `renode` to the `/usr/bin` path or environment variables
- Run `Start Debugging` or press `F5` to start, open a `TCP` connection on `localhost:3333`, and observe the serial output
## Manual π
- **[η¨ζ·ζε(δΈζ)](manual_zh.pdf) | [Manual(English) from **DeepWiki**](https://deepwiki.com/Eplankton/mos-renode)**
## Architecture π
```
.
βββ π emulation // Renode emulation script
βββ π vendor // Vendor HALs
βββ π core
β βββ π external // External Library
β βββ π arch // Architecture-Specific Code
β β βββ cpu.hpp // Initialization/Context Switch assembly code
β β
β βββ π kernel // Kernel Layer
β β βββ macro.hpp // Kernel Constants Macro
β β βββ type.hpp // Basic Types
β β βββ concepts.hpp // Type Constraints
β β βββ data_type.hpp // Basic Data Structures
β β βββ alloc.hpp // Memory Management
β β βββ global.hpp // Kernel Global Variables
β β βββ printf.h/.c // Thread-Safe printf
β β βββ task.hpp // Task Management
β β βββ sync.hpp // Synchronization Primitives
β β βββ async.hpp // Asynchronous Stackless Coroutines
β β βββ scheduler.hpp // Scheduler
β β βββ ipc.hpp // Inter-Process Communication
β β βββ utils.hpp // Other Utilities
β β
β βββ config.h // System Configuration
β βββ kernel.hpp // Kernel Modules
β βββ shell.hpp // Shell Command Line
β
βββ π app // User Code
βββ main.cpp // Entry Function
βββ test.hpp // Test Code
```
## Example π
`Shell Test`

`Mutex Test(Priority Ceiling Protocol)`

`LCD Driver & GUI Demo`
`Concurrent Task Period & Time Sequence`
```C++
// MOS Kernel & Shell
#include "mos/kernel.hpp"
#include "mos/shell.hpp"
// HAL and Device
#include "drivers/stm32f4xx/hal.hpp"
#include "drivers/device/led.hpp"
```
```C++
namespace MOS::User::Global
{
using namespace HAL::STM32F4xx;
using namespace Driver::Device;
using namespace DataType::SyncUartDev_t;
// Shell I/O UART and Buffer
auto stdio = SyncUartDev_t<32> {USARTx};
// LED red, green, blue
Device::LED_t leds[] = {...};
}
```
```C++
namespace MOS::User::BSP
{
using namespace Driver;
using namespace Global;
void LED_Config()
{
for (auto& led: leds) {
led.init();
}
}
void USART_Config()
{
stdio.init(9600-8-1-N)
.rx_config(PXa) // RX -> PXa
.tx_config(PYb) // TX -> PYb
.it_enable(RXNE) // Enable RXNE interrupt
.enable(); // Enable UART
}
...
}
```
```C++
namespace MOS::User::App
{
// Blinky by Task::delay() -> Thread Model
void red_blink(Device::LED_t leds[])
{
while (true) {
leds[0].toggle(); // red
Task::delay(500_ms);
}
}
// Blinky by Async::delay() -> Coroutine Model
Async::Future_t blue_blink(Device::LED_t leds[])
{
while (true) {
leds[1].toggle(); // blue
co_await Async::delay(500_ms);
}
}
...
}
```
```C++
int main()
{
using namespace MOS;
using namespace Kernel;
using namespace User::Global;
BSP::config(); // Init periphs and clocks
Task::create( // Create a calendar with RTC
App::time_init, nullptr, 0, "time/init"
);
Task::create( // Create a shell on stdio
Shell::launch, &stdio.buf, 1, "shell"
);
/* User Tasks */
Task::create(App::red_blink, &leds, 2, "blinky");
...
/* Test examples */
Test::MutexTest();
Test::MsgQueueTest();
Test::AsyncTest();
...
// Launch Scheduler, never return
Scheduler::launch();
}
```
## Boot Up β‘
```plain
A_A _ [name] @ x.x.x(Version)
o'' )_____// Build @ TIME, DATE
`_/ MOS ) Chip @ MCU, ARCH
(_(_/--(_/ 2023-2026 Copyright by Eplankton
---------------------------------------
#0 idle 15 READY 10%
#1 shell 1 BLOCKED 21%
#2 blinky 2 RUNNING 9%
---------------------------------------
```
## Milestone π§Ύ
π¦ `v0.5`
> β
DoneοΌ
> - **[Experimental]** Port to `ESP32-C6(RISC-V)`
> - **[Experimental]** Rewrite it in Rust
π¦ `v0.4`
> β
DoneοΌ
>
> - Add Hardware `FPU` support
> - **CMake Tools** are now available for compiling the project
> - Add external library [**ETL**](https://www.etlcpp.com/), a C++ template library for embedded applications
> - Add `Renode` emulation platform, add stable support for `Cortex-M` series
> - **[Experimental]** Add scheduler lock `Scheduler::suspend()`
> - **[Experimental]** Add Asynchronous stackless coroutines `Async::{Executor, Future_t, co_await/yield/return}`
>
> π Planned:
>
> - Shift from `FatFS` to `LittleFS`
π¦ `v0.3`
> β
Done:
>
> - Mapping `Tids` to `BitMap_t`
> - Message queue `IPC::MsgQueue_t`
> - `Task::create` allows generic function signatures as `void fn(auto argv)` with type checker
> - Add `ESP32-C3` as a `WiFi` component
> - Add `Driver::Device::SD_t`, `SD` card driver, porting `FatFs` file system
> - Add `Shell::usr_cmds` for user-registered commands
> - **[Experimental]** Atomic types ``
> - **[Experimental]** `Utils::IrqGuard_t`, nested interrupt critical sections
> - **[Experimental]** Simple formal verification of `Scheduler + Mutex`
>
> π Planned:
>
> - Inter-Process Communication: pipes/channels
> - `FPU` hardware float support
> - Performance benchmarking
> - Error handling with `Result`, `Option`
> - `DMA_t` DMA Driver
> - Software/hardware timers `Timer`
> - **[Experimental]** Adding `POSIX` support
> - **[Experimental]** More real-time scheduling algorithms
π¦ `v0.2`
> β
Done:
>
> - Synchronization primitives `Sync::{Sema_t, Lock_t, Mutex_t, CondVar_t, Barrier_t}`
> - `Scheduler::Policy::PreemptPri` with `RoundRobin` scheduling for same priority levels
> - `Task::terminate` implicitly called upon task exit to reclaim resources
> - Simple command-line interaction `Shell::{Command, CmdCall, launch}`
> - `HAL::STM32F4xx::SPI_t` and `Driver::Device::ST7735S_t`, porting the `GuiLite` graphics library
> - Blocking delay with `Kernel::Global::os_ticks` and `Task::delay`
> - Refactored project organization into `{kernel, arch, drivers}`
> - Support for `GCC` compilation, compatible with `STM32Cube HAL`
> - Real-time calendar `HAL::STM32F4xx::RTC_t`, `CmdCall::date_cmd`, `App::Calendar`
> - `idle` uses `Kernel::Global::zombie_list` to reclaim inactive pages
> - Three basic page allocation policies `Page_t::Policy::{POOL, DYNAMIC, STATIC}`
π¦ `v0.1`
> β
Done:
>
> - Basic data structures, scheduler, and task control, memory management
>
> π Planned:
>
> - Timers, round-robin scheduling
> - Inter-Process Communication (IPC), pipes, message queues
> - Process synchronization (Sync), semaphores, mutexes
> - Design a simple Shell
> - Variable page sizes, memory allocator
> - SPI driver, porting GuiLite/LVGL graphics libraries
> - Porting to other boards/arch, e.g., ESP32-C3 (RISC-V)
## References πΈ
- [How to build a Real-Time Operating System(RTOS)](https://medium.com/@dheeptuck/building-a-real-time-operating-system-rtos-ground-up-a70640c64e93)
- [PeriodicScheduler_Semaphore](https://github.com/Dungyichao/PeriodicScheduler_Semaphore)
- [STM32F4-LCD_ST7735s](https://github.com/Dungyichao/STM32F4-LCD_ST7735s)
- [A printf/sprintf Implementation for Embedded Systems](https://github.com/mpaland/printf)
- [GuiLite](https://github.com/idea4good/GuiLite)
- [STMViewer](https://github.com/klonyyy/STMViewer)
- [FatFs](http://elm-chan.org/fsw/ff)
- [The Zephyr Project](https://www.zephyrproject.org/)
- [Eclipse ThreadX](https://github.com/eclipse-threadx/threadx)
- [Embassy](https://embassy.dev/)
- [Renode](https://renode.io/)
- [Embedded Template Library (ETL)](https://www.etlcpp.com)
---
```plain
I hope the Pacific is as blue as it has been in my dreams.
I hope.
-- Stephen King's "Rita Hayworth and the Shawshank Redemption", 1982
```