Struct CpuControl

Source
pub struct CpuControl<'d> { /* private fields */ }
Available on crate feature unstable only.
Expand description

Control CPU Cores

§Examples

static mut APP_CORE_STACK: Stack<8192> = Stack::new();

let counter = Mutex::new(RefCell::new(0));

let mut cpu_control = CpuControl::new(peripherals.CPU_CTRL);
let cpu1_fnctn = || {
    cpu1_task(&delay, &counter);
};
let _guard = cpu_control
    .start_app_core(
        unsafe { &mut *addr_of_mut!(APP_CORE_STACK) },
        cpu1_fnctn
    )?;

loop {
    delay.delay(Duration::from_secs(1));
    let count = critical_section::with(|cs| *counter.borrow_ref(cs));
}

// Where `cpu1_task()` may be defined as:

fn cpu1_task(
    delay: &Delay,
    counter: &critical_section::Mutex<RefCell<i32>>,
) -> ! {
    loop {
        delay.delay(Duration::from_millis(500));

        critical_section::with(|cs| {
            let mut val = counter.borrow_ref_mut(cs);
            *val = val.wrapping_add(1);
        });
    }
}

§Stability

This API is marked as unstable and is only available when the unstable crate feature is enabled. This comes with no stability guarantees, and could be changed or removed at any time.

Implementations§

Source§

impl<'d> CpuControl<'d>

Source

pub fn new(cpu_control: CPU_CTRL<'d>) -> CpuControl<'d>

Creates a new instance of CpuControl.

§Stability

This API is marked as unstable and is only available when the unstable crate feature is enabled. This comes with no stability guarantees, and could be changed or removed at any time.

Source

pub unsafe fn park_core(&mut self, core: Cpu)

Park the given core

§Safety

The user must ensure that the core being parked is not the core which is currently executing their code.

§Stability

This API is marked as unstable and is only available when the unstable crate feature is enabled. This comes with no stability guarantees, and could be changed or removed at any time.

Source

pub fn unpark_core(&mut self, core: Cpu)

Unpark the given core

§Stability

This API is marked as unstable and is only available when the unstable crate feature is enabled. This comes with no stability guarantees, and could be changed or removed at any time.

Source

pub fn start_app_core<'a, const SIZE: usize, F>( &mut self, stack: &'static mut Stack<SIZE>, entry: F, ) -> Result<AppCoreGuard<'a>, Error>
where F: FnOnce() + Send + 'a,

Start the APP (second) core.

The second core will start running the closure entry. Note that if the closure exits, the core will be parked.

Dropping the returned guard will park the core.

§Stability

This API is marked as unstable and is only available when the unstable crate feature is enabled. This comes with no stability guarantees, and could be changed or removed at any time.

Auto Trait Implementations§

§

impl<'d> Freeze for CpuControl<'d>

§

impl<'d> RefUnwindSafe for CpuControl<'d>

§

impl<'d> Send for CpuControl<'d>

§

impl<'d> Sync for CpuControl<'d>

§

impl<'d> Unpin for CpuControl<'d>

§

impl<'d> !UnwindSafe for CpuControl<'d>

Blanket Implementations§

§

impl<T> Any for T
where T: 'static + ?Sized,

§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> Borrow<T> for T
where T: ?Sized,

§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
§

impl<T> BorrowMut<T> for T
where T: ?Sized,

§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> From<T> for T

§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T, U> Into<U> for T
where U: From<T>,

§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of [From]<T> for U chooses to do.

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.