| Crates.io | osal-rs |
| lib.rs | osal-rs |
| version | 0.3.2 |
| created_at | 2025-12-30 10:16:52.021545+00 |
| updated_at | 2026-01-23 16:10:31.985614+00 |
| description | Operating System Abstraction Layer for Rust with support for FreeRTOS and POSIX |
| homepage | https://github.com/HiHappyGarden/osal-rs |
| repository | https://github.com/HiHappyGarden/osal-rs |
| max_upload_size | |
| id | 2012426 |
| size | 299,342 |
Operating System Abstraction Layer for Rust - A cross-platform compatibility layer for embedded and real-time systems development.
OSAL-RS provides a unified API for developing multi-platform embedded applications in Rust. It abstracts operating system-specific functionality, allowing you to write portable code that can run on different platforms with minimal changes.
A complete serialization framework designed specifically for embedded systems:
#[derive(Serialize, Deserialize)] implementationuse osal_rs_serde::{Serialize, Deserialize, to_bytes, from_bytes};
#[derive(Serialize, Deserialize, Debug, PartialEq)]
struct SensorData {
temperature: i16,
humidity: u8,
pressure: u32,
status: Option<u8>,
}
let data = SensorData {
temperature: 25,
humidity: 60,
pressure: 1013,
status: Some(0xFF),
};
// Serialize to stack buffer
let mut buffer = [0u8; 32];
let len = to_bytes(&data, &mut buffer).unwrap();
// Deserialize from buffer
let restored: SensorData = from_bytes(&buffer[..len]).unwrap();
assert_eq!(data, restored);
Perfect for inter-task communication:
use osal_rs::os::{Queue, QueueFn};
use osal_rs_serde::{Serialize, Deserialize, to_bytes, from_bytes};
#[derive(Serialize, Deserialize)]
struct Command {
id: u32,
params: [u16; 4],
}
fn sender_task(queue: &Queue) {
let cmd = Command { id: 42, params: [1, 2, 3, 4] };
let mut buffer = [0u8; 32];
let len = to_bytes(&cmd, &mut buffer).unwrap();
queue.post(&buffer[..len], 100).unwrap();
}
fn receiver_task(queue: &Queue) {
let mut buffer = [0u8; 32];
queue.fetch(&mut buffer, 100).unwrap();
let cmd: Command = from_bytes(&buffer).unwrap();
}
For comprehensive documentation, examples, and advanced features, see:
osal-rs-serde/examples/ - Working code examplesBefore using OSAL-RS in your project, ensure that:
osal-rs-porting must be compiled and linked to your projectOSAL-RS requires proper FreeRTOS configuration. Ensure your FreeRTOSConfig.h includes:
#define configUSE_MUTEXES 1
#define configUSE_RECURSIVE_MUTEXES 1
#define configUSE_COUNTING_SEMAPHORES 1
#define configUSE_TIMERS 1
#define configUSE_QUEUE_SETS 1
#define configSUPPORT_DYNAMIC_ALLOCATION 1
OSAL-RS is designed to be integrated into CMake-based projects. Here are several integration examples:
Important: Always ensure that the C porting layer files from osal-rs-porting/freertos/ are compiled and linked to your project, as they provide the necessary FFI bridge between Rust and FreeRTOS.
Add OSAL-RS to your existing CMake project:
cmake_minimum_required(VERSION 3.20)
project(my_embedded_project C CXX)
# Configure FreeRTOS (assuming it's already in your project)
add_subdirectory(freertos)
# Add OSAL-RS porting layer
add_library(osal_rs_porting STATIC
osal-rs-porting/freertos/src/osal_rs_freertos.c
)
target_include_directories(osal_rs_porting PUBLIC
osal-rs-porting/freertos/inc
${FREERTOS_INCLUDE_DIRS}
)
target_link_libraries(osal_rs_porting PUBLIC
freertos
)
# Configure Rust library
set(RUST_TARGET "thumbv7em-none-eabihf") # Adjust for your target
set(OSAL_RS_LIB "${CMAKE_CURRENT_SOURCE_DIR}/osal-rs/target/${RUST_TARGET}/release/libosal_rs.a")
# Custom command to build Rust library
add_custom_command(
OUTPUT ${OSAL_RS_LIB}
COMMAND cargo build --release --target ${RUST_TARGET} --features freertos
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/osal-rs
COMMENT "Building OSAL-RS library"
)
add_custom_target(osal_rs_build DEPENDS ${OSAL_RS_LIB})
# Create imported library for OSAL-RS
add_library(osal_rs STATIC IMPORTED GLOBAL)
set_target_properties(osal_rs PROPERTIES
IMPORTED_LOCATION ${OSAL_RS_LIB}
)
add_dependencies(osal_rs osal_rs_build)
# Your main application
add_executable(my_app
src/main.c
)
target_link_libraries(my_app PRIVATE
osal_rs
osal_rs_porting
freertos
)
# Function to build OSAL-RS for different configurations
function(add_osal_rs_library TARGET_NAME RUST_TARGET CARGO_PROFILE)
set(PROFILE_DIR ${CARGO_PROFILE})
if(CARGO_PROFILE STREQUAL "release")
set(CARGO_FLAGS "--release")
else()
set(CARGO_FLAGS "")
endif()
set(LIB_PATH "${CMAKE_CURRENT_SOURCE_DIR}/osal-rs/target/${RUST_TARGET}/${PROFILE_DIR}/libosal_rs.a")
add_custom_command(
OUTPUT ${LIB_PATH}
COMMAND cargo build ${CARGO_FLAGS} --target ${RUST_TARGET} --features freertos
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/osal-rs
COMMENT "Building OSAL-RS (${CARGO_PROFILE}) for ${RUST_TARGET}"
)
add_custom_target(${TARGET_NAME}_build DEPENDS ${LIB_PATH})
add_library(${TARGET_NAME} STATIC IMPORTED GLOBAL)
set_target_properties(${TARGET_NAME} PROPERTIES
IMPORTED_LOCATION ${LIB_PATH}
)
add_dependencies(${TARGET_NAME} ${TARGET_NAME}_build)
endfunction()
# Use it in your project
add_osal_rs_library(osal_rs "thumbv7em-none-eabihf" "release")
For a more seamless Rust-CMake integration, use Corrosion:
cmake_minimum_required(VERSION 3.20)
project(my_embedded_project C CXX)
# Include Corrosion
include(FetchContent)
FetchContent_Declare(
Corrosion
GIT_REPOSITORY https://github.com/corrosion-rs/corrosion.git
GIT_TAG v0.4
)
FetchContent_MakeAvailable(Corrosion)
# Import OSAL-RS crate
corrosion_import_crate(
MANIFEST_PATH osal-rs/Cargo.toml
FEATURES freertos
)
# Configure FreeRTOS
add_subdirectory(freertos)
# OSAL-RS porting layer
add_library(osal_rs_porting STATIC
osal-rs-porting/freertos/src/osal_rs_freertos.c
)
target_include_directories(osal_rs_porting PUBLIC
osal-rs-porting/freertos/inc
${FREERTOS_INCLUDE_DIRS}
)
target_link_libraries(osal_rs_porting PUBLIC
freertos
)
# Your application
add_executable(my_app src/main.c)
target_link_libraries(my_app PRIVATE
osal-rs
osal_rs_porting
freertos
)
Example CMake toolchain file for ARM Cortex-M:
# toolchain-arm-none-eabi.cmake
set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(CMAKE_C_COMPILER arm-none-eabi-gcc)
set(CMAKE_CXX_COMPILER arm-none-eabi-g++)
set(CMAKE_ASM_COMPILER arm-none-eabi-gcc)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
# Rust target
set(RUST_TARGET "thumbv7em-none-eabihf")
Use it with:
cmake -DCMAKE_TOOLCHAIN_FILE=toolchain-arm-none-eabi.cmake -B build
cmake --build build
By default, OSAL-RS looks for FreeRTOSConfig.h at <workspace_root>/inc/FreeRTOSConfig.h. You can override this path using the FREERTOS_CONFIG_PATH environment variable.
# Set custom path to FreeRTOSConfig.h
set(FREERTOS_CONFIG_PATH "${CMAKE_SOURCE_DIR}/inc/hhg-config/pico/FreeRTOSConfig.h")
# Pass to Cargo build via environment variable
add_custom_command(
OUTPUT ${OSAL_RS_LIB}
COMMAND ${CMAKE_COMMAND} -E env FREERTOS_CONFIG_PATH=${FREERTOS_CONFIG_PATH}
cargo build --release --target ${RUST_TARGET} --features freertos
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/osal-rs
COMMENT "Building OSAL-RS library"
)
# Set environment variable before building
export FREERTOS_CONFIG_PATH="/path/to/your/FreeRTOSConfig.h"
cargo build --release --target thumbv7em-none-eabihf --features freertos
# Set environment variable for Corrosion
set(FREERTOS_CONFIG_PATH "${CMAKE_SOURCE_DIR}/inc/custom/FreeRTOSConfig.h")
corrosion_import_crate(
MANIFEST_PATH osal-rs/Cargo.toml
FEATURES freertos
)
# Set environment for the build
corrosion_set_env_vars(osal-rs
FREERTOS_CONFIG_PATH=${FREERTOS_CONFIG_PATH}
)
Note: The build system will automatically regenerate Rust type bindings from the specified FreeRTOSConfig.h during the build process.
use osal_rs::os::*;
fn main() {
// Create a thread
let thread = Thread::new(
"my_thread",
4096,
ThreadPriority::Normal,
|| {
loop {
println!("Hello from thread!");
Duration::from_millis(1000).sleep();
}
}
);
// Create a mutex
let mutex = Mutex::new().unwrap();
// Use synchronization
{
let _guard = mutex.lock();
// Critical section
}
// Create a queue
let queue: Queue<u32> = Queue::new(10).unwrap();
queue.send(42, Duration::from_millis(100)).unwrap();
let value = queue.receive(Duration::from_millis(100)).unwrap();
println!("Received: {}", value);
}
# Install Rust target (example for ARM Cortex-M4F)
rustup target add thumbv7em-none-eabihf
# Build with FreeRTOS support
cargo build --release --target thumbv7em-none-eabihf --features freertos
# Build with POSIX support (when implemented)
cargo build --features posix,std
OSAL-RS provides several Cargo features to customize the build configuration for different platforms and use cases:
| Feature | Default | Description |
|---|---|---|
freertos |
✅ | Enable FreeRTOS backend implementation. This is the default and fully implemented feature for embedded RTOS development. |
posix |
❌ | Enable POSIX backend implementation. Currently planned for future releases to support Linux/Unix-like systems. |
std |
❌ | Enable standard library support. Automatically enables disable_panic. Use this for native development and testing environments. |
disable_panic |
❌ | Disable custom panic handler. Enabled automatically when std feature is active. Useful when you want to use the default panic behavior. |
serde |
❌ | Enable serialization/deserialization support via osal-rs-serde. Includes derive macros for automatic implementation. |
cargo build --target thumbv7em-none-eabihf --features freertos
cargo build --target thumbv7em-none-eabihf --features freertos,serde
cargo build --features posix,std
cargo build --features posix,std,serde
To use OSAL-RS in your project with specific features:
[dependencies]
osal-rs = { version = "0.3", features = ["freertos"] }
# Or with serialization support
osal-rs = { version = "0.3", features = ["freertos", "serde"] }
osal-rs/
├── osal-rs/ # Main library crate
├── osal-rs-build/ # Build utilities
├── osal-rs-tests/ # Test suite
└── osal-rs-porting/ # Platform-specific C/C++ code
└── freertos/ # FreeRTOS porting layer
├── inc/ # Header files
└── src/ # Implementation
This project is licensed under the GPL-3.0 License - see the LICENSE file for details.
Contributions are welcome! Please feel free to submit pull requests or open issues for bugs and feature requests.
Antonio Salsi
https://github.com/HiHappyGarden/osal-rs