#exception #aarch64 #deadlock

no-std percore

通过异常屏蔽在no_std平台上实现安全的每个CPU核心可变状态

1个不稳定版本

0.1.0 2024年7月22日

#1590 in 嵌入式开发

Download history 128/week @ 2024-07-22 3/week @ 2024-07-29

131 每月下载量

MIT/Apache

13KB
98

percore

crates.io page docs.rs page

通过异常屏蔽在no_std平台上实现安全的每个CPU核心可变状态。

此包提供两种主要包装类型:PerCore 提供每个CPU核心的值实例,其中每个核心只能访问其自己的实例,以及 ExceptionLock 用来保护值,使得只有当异常被屏蔽时才能访问。这些可以与 RefCell 结合使用,以提供安全的每个核心可变状态。

ExceptionLock 还可以与基于自旋锁的互斥锁(如由 spin 包提供的)结合使用,以避免从异常处理程序访问全局可变状态时的死锁。

示例

use core::cell::RefCell;
use percore::{exception_free, Cores, ExceptionLock, PerCore};

/// The total number of CPU cores in the target system.
const CORE_COUNT: usize = 2;

struct CoresImpl;

unsafe impl Cores for CoresImpl {
    fn core_index() -> usize {
        todo!("Return the index of the current CPU core, 0 or 1")
    }
}

struct CoreState {
    // Your per-core mutable state goes here...
    foo: u32,
}

const EMPTY_CORE_STATE: ExceptionLock<RefCell<CoreState>> =
    ExceptionLock::new(RefCell::new(CoreState { foo: 0 }));
static CORE_STATE: PerCore<ExceptionLock<RefCell<CoreState>>, CoresImpl, CORE_COUNT> =
    PerCore::new([EMPTY_CORE_STATE; CORE_COUNT]);

fn main() {
    // Mask exceptions while accessing mutable state.
    exception_free(|token| {
        // `token` proves that interrupts are masked, so we can safely access per-core mutable
        // state.
        CORE_STATE.get().borrow_mut(token).foo = 42;
    });
}

这不是一个官方支持的Google产品。

支持架构

目前仅完全支持aarch64。该包将为其他架构构建,但您需要提供自己的 exception_free 函数实现。欢迎补丁以添加对其他架构的支持。

许可

以下任一许可下提供

由您选择。

贡献

如果您想为此项目做出贡献,请参阅我们接受贡献的详细信息

无运行时依赖