Feature Configuration

Relevant source files

This document covers the available feature flags, no_std compatibility settings, and build configuration options for the arm_pl031 crate. It explains how to customize the driver's functionality through feature selection and target-specific compilation settings.

For information about the chrono-specific functionality enabled by features, see Chrono Integration. For build and testing procedures across different targets, see Building and Testing.

Feature Flags Overview

The arm_pl031 crate provides a minimal set of feature flags to control optional functionality while maintaining a lightweight core driver suitable for embedded environments.

Available Features

FeatureDescriptionDefaultDependencies
chronoEnables DateTime integration with the chrono crate✓ Enabledchrono = "0.4.38"

Feature Dependencies Diagram

flowchart TD
subgraph subGraph1["Optional Enhancement"]
    CHRONO_IMPL["DateTime<Utc> support"]
end
subgraph subGraph0["Always Available"]
    BASIC_API["Unix timestamp API"]
    INTERRUPT_API["Interrupt management"]
    REGISTER_API["Register operations"]
end
DEFAULT["default features"]
CHRONO_FEAT["chrono feature"]
CHRONO_DEP["chrono crate v0.4.38"]
CORE["Core RTC Driver"]
NO_CHRONO["without chrono feature"]

CHRONO_DEP --> CHRONO_IMPL
CHRONO_FEAT --> CHRONO_DEP
CHRONO_IMPL --> CORE
CORE --> BASIC_API
CORE --> INTERRUPT_API
CORE --> REGISTER_API
DEFAULT --> CHRONO_FEAT
NO_CHRONO --> CORE

Sources: Cargo.toml(L17 - L19) 

Core Driver (Always Available)

The core functionality remains available regardless of feature selection:

  • Unix timestamp operations via get_unix_timestamp() and set_unix_timestamp()
  • Interrupt management through match registers
  • Direct register access for all PL031 hardware features
  • Memory-mapped I/O operations

Chrono Feature

When the chrono feature is enabled (default), the driver provides additional convenience methods:

  • get_time() returns Result<DateTime<Utc>, chrono::ParseError>
  • set_time() accepts DateTime<Utc> parameters
  • Automatic conversion between Unix timestamps and RFC 3339 formatted strings

Sources: Cargo.toml(L15)  Cargo.toml(L18) 

Default Configuration

The crate ships with the chrono feature enabled by default to provide the most user-friendly experience for common use cases.

Default Feature Resolution

flowchart TD
USER_PROJECT["User's Cargo.toml"]
DEPENDENCY_DECL["arm_pl031 dependency"]
DEFAULT_RESOLUTION["Resolve default features"]
CHRONO_ENABLED["chrono = true"]
ENHANCED_API["Enhanced DateTime API"]
OPT_OUT["default-features = false"]
MINIMAL_CONFIG["Core-only build"]
UNIX_TIMESTAMP_ONLY["Unix timestamp API only"]

CHRONO_ENABLED --> ENHANCED_API
DEFAULT_RESOLUTION --> CHRONO_ENABLED
DEPENDENCY_DECL --> DEFAULT_RESOLUTION
DEPENDENCY_DECL --> OPT_OUT
MINIMAL_CONFIG --> UNIX_TIMESTAMP_ONLY
OPT_OUT --> MINIMAL_CONFIG
USER_PROJECT --> DEPENDENCY_DECL

To use the default configuration:

[dependencies]
arm_pl031 = "0.2.1"

To disable default features:

[dependencies]
arm_pl031 = { version = "0.2.1", default-features = false }

Sources: Cargo.toml(L19) 

No-std Compatibility

The arm_pl031 crate is designed for no_std environments and embedded systems. All features maintain no_std compatibility.

No-std Design Principles

ComponentNo-std StatusImplementation Notes
Core driver✓ Full supportUsesvolatileoperations, no heap allocation
Chrono integration✓ CompatibleUseschronowithdefault-features = false
Error handling✓ CompatibleUsesResulttypes, no panic in normal operation
Memory management✓ CompatibleZero dynamic allocation, stack-based operations

No-std Compatibility Architecture

flowchart TD
subgraph subGraph2["Hardware Layer"]
    MMIO_REGISTERS["Memory-Mapped Registers"]
    PL031_HW["ARM PL031 Hardware"]
end
subgraph subGraph1["arm_pl031 Components"]
    CORE_DRIVER["Core RTC Driver"]
    CHRONO_NOSTD["chrono (no default features)"]
    VOLATILE_OPS["Volatile MMIO Operations"]
    RESULT_TYPES["Result-based Error Handling"]
end
subgraph subGraph0["no_std Environment"]
    EMBEDDED_TARGET["Embedded Target"]
    NO_HEAP["No Heap Allocation"]
    NO_STD_LIB["No Standard Library"]
end

CORE_DRIVER --> CHRONO_NOSTD
CORE_DRIVER --> VOLATILE_OPS
EMBEDDED_TARGET --> CORE_DRIVER
MMIO_REGISTERS --> PL031_HW
NO_HEAP --> VOLATILE_OPS
NO_STD_LIB --> RESULT_TYPES
VOLATILE_OPS --> MMIO_REGISTERS

Sources: Cargo.toml(L12)  Cargo.toml(L15) 

Build Configuration Options

Target Architecture Support

The driver supports multiple target architectures while maintaining consistent functionality:

Target TriplePurposeFeature Support
aarch64-unknown-none-softfloatBare metal ARM64All features
x86_64-unknown-noneBare metal x86_64 (testing)All features
riscv64gc-unknown-none-elfRISC-V embeddedAll features
x86_64-unknown-linux-gnuLinux development/testingAll features

Feature Selection Examples

Minimal embedded build:

[dependencies]
arm_pl031 = { version = "0.2.1", default-features = false }

Full-featured embedded build:

[dependencies]
arm_pl031 = "0.2.1"  # Includes chrono by default

Selective feature enabling:

[dependencies]
arm_pl031 = { version = "0.2.1", default-features = false, features = ["chrono"] }

Dependency Management

The chrono dependency is configured for embedded compatibility:

  • Version constraint: 0.4.38
  • default-features = false to avoid std dependencies
  • Optional inclusion based on feature flags

Dependency Resolution Flow

flowchart TD
CARGO_TOML["Cargo.toml feature selection"]
FEATURE_CHECK["chrono feature enabled?"]
CHRONO_DEP["Include chrono 0.4.38"]
MINIMAL_BUILD["Core driver only"]
NO_DEFAULT_FEATURES["chrono with default-features = false"]
COMPATIBLE_BUILD["no_std compatible build"]
TARGET_COMPILATION["Target-specific compilation"]

CARGO_TOML --> FEATURE_CHECK
CHRONO_DEP --> NO_DEFAULT_FEATURES
COMPATIBLE_BUILD --> TARGET_COMPILATION
FEATURE_CHECK --> CHRONO_DEP
FEATURE_CHECK --> MINIMAL_BUILD
MINIMAL_BUILD --> COMPATIBLE_BUILD
NO_DEFAULT_FEATURES --> COMPATIBLE_BUILD

Sources: Cargo.toml(L14 - L15)  Cargo.toml(L17 - L19) 

Configuration Best Practices

For Embedded Systems

  • Use default-features = false for smallest binary size
  • Enable only required features to minimize dependencies
  • Consider target-specific optimizations in your project's Cargo.toml

For Development and Testing

  • Use default features for convenient DateTime handling
  • Enable all features during development for full API access
  • Use hosted targets like x86_64-unknown-linux-gnu for rapid development

For Production Deployment

  • Carefully evaluate which features are needed for your use case
  • Test with the exact feature configuration used in production
  • Document feature selections in your project's dependency specifications

Sources: Cargo.toml(L1 - L20)