Example Component - RT-Thread Rust Component Example
Overview
example_component is a Rust component example based on RT-Thread, demonstrating how to implement, register, and manage Rust components in RT-Thread systems. This project adopts a unified component registration architecture that avoids component duplicate registration issues and supports conditional compilation based on RT-Thread configuration.
Project Structure
example_component/
├── SConscript # SCons build script
├── component_registry/ # Unified component registry
│ ├── Cargo.toml # Registry configuration
│ └── src/
│ └── lib.rs # Registry implementation
├── log/ # Log component example
│ ├── Cargo.toml # Log component configuration
│ └── src/
│ ├── lib.rs # Log component implementation
│ └── logging.rs # Logging functionality module
└── tools/ # Build tools
├── build_component.py # Component build tool
└── feature_config_component.py # Feature configuration
Core Features
1. Unified Component Registration Architecture
- Avoid Duplicate Registration: Unified management of all component registrations through
component_registry, avoiding conflicts caused by multiple component duplicate registrations - Conditional Compilation Support: Selectively compile and register components based on RT-Thread configuration
- Modular Design: Each component is implemented independently and managed uniformly through the registry
2. Feature Configuration System
- Based on RT-Thread Configuration: Feature enablement is entirely based on RT-Thread configuration items, requiring no additional configuration
- Automatic Feature Mapping: Build system automatically maps RT-Thread configuration to Rust features
- Dependency Checking: Automatically checks component dependencies to ensure build consistency
3. Build System Integration
- SCons Integration: Fully integrated with RT-Thread's SCons build system
- Incremental Build: Supports clean and incremental builds
- Cross Compilation: Supports cross-compilation for target architectures like RISC-V
Component Details
Component Registry
component_registry is the core of the entire architecture, responsible for unified management of all component registrations.
Main Functions
- Unified Entry Point: Provides
rust_component_registryas the unified registration entry for all components - Conditional Compilation: Only includes and registers corresponding components when respective features are enabled
- Avoid Conflicts: Ensures each component is registered only once
Log Component
The log component provides Rust-style logging functionality, including multiple log levels and command-line interface.
Main Functions
- Multi-level Logging: Supports INFO, WARN, ERROR, DEBUG, TRACE and other log levels
- Command-line Interface: Provides commands like
log_info,log_warn,log_error - Conditional Compilation: Only compiles when
enable-logfeature is enabled
Usage Examples
// Using log macros in code
info!("This is an info log");
warn!("This is a warning log");
error!("This is an error log");
Command-line Usage
# Using in RT-Thread command line
msh> log_info # Print info log
msh> log_warn # Print warning log
msh> log_error # Print error log
Feature Configuration
Configuration Mapping
The mapping from RT-Thread configuration to Rust features is defined in tools/feature_config_component.py:
CONFIG_COMPONENT_FEATURE_MAP = {
'RUST_LOG_COMPONENT': {
'feature': 'enable-log',
'dependency': 'em_component_log',
'description': 'Enable Rust log component integration'
}
}
Enabling Components
To enable the log component, set in RT-Thread configuration:
// Set through menuconfig
Enable Rust component support -> Auto-initialize Rust log component
Development Guide
Adding New Components
-
Create Component Directory
cargo new --lib example_component/new_component cd example_component/new_component -
Create Cargo.toml
[package] name = "em_component_new" version = "0.1.0" edition = "2021" [lib] name = "em_component_new" crate-type = ["staticlib"] [dependencies] rt-rust = { path = "../../rust" } macro_main = { path = "../../rust/macro-main" } [features] default = [] enable-new = [] -
Implement Component Functionality
// src/new.rs // New component implementation code // src/lib.rs #![no_std] // Export required libraries -
Update Feature Configuration
# Add to tools/feature_config_component.py CONFIG_COMPONENT_FEATURE_MAP = { # ... existing configuration ... 'RUST_NEW_COMPONENT': { 'feature': 'enable-new', 'dependency': 'em_component_new', 'description': 'Enable new component integration' } } -
Update Registry
# Add to component_registry/Cargo.toml [dependencies] em_component_new = { path = "../new_component", optional = true } [features] enable-new = ["em_component_new", "em_component_new/enable-new"]// Register in component_registry/src/lib.rs #[cfg(feature = "enable-new")] use em_component_new; fn component_registry_main() { #[cfg(feature = "enable-new")] { println!("Component registry: New component enabled"); } // ... other components ... }
Component Development Best Practices
- Use Conditional Compilation: All functionality should be wrapped with
#[cfg(feature = "...")] - Avoid Direct Registration: Don't use component registration macros directly in components, let
component_registrymanage uniformly - Provide Command Interface: Provide command-line interfaces for component functionality for easy testing and usage
- Complete Documentation: Provide detailed documentation and usage examples for each component
Troubleshooting
Common Issues
-
Compilation Failure
- Check if Rust toolchain is correctly installed
- Confirm target architecture (e.g.,
riscv64imac-unknown-none-elf) is installed - Check if dependency paths are correct
-
Features Not Enabled
- Confirm corresponding macro definitions are set in RT-Thread configuration
- Check mapping configuration in
feature_config_component.py - Review feature enablement information in build logs
-
Linking Errors
- Confirm all dependent components are correctly built
- Check dependency configuration in
Cargo.toml - Verify library file paths and names
Dependency Relationships
RT-Thread Config
↓
Feature Mapping
↓
Rust Features
↓
Component Registry ← Individual Components
↓
RT-Thread System