Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Mutex::borrow only gives an immutable reference? #224

Open
inodentry opened this issue Jun 8, 2020 · 3 comments
Open

Mutex::borrow only gives an immutable reference? #224

inodentry opened this issue Jun 8, 2020 · 3 comments

Comments

@inodentry
Copy link

It seems like the cortex_m::interrupt::Mutex type only gives an immutable reference? What's the point of the mutex then? How can I get a mutable reference to the value?

@jonas-schievink
Copy link
Contributor

Mutex makes Send data Sync. You can use cell-based interior mutability inside it.

The reason it is done this way is because the user knows best which cell type to use (eg. RefCell is more costly than Cell but allows obtaining references to the inner value).

@Wassasin
Copy link

Wassasin commented Jun 9, 2020

You can nest two CriticalSections, possibly yielding multiple instances of &mut T if borrow_mut were possible. You can use Mutex<UnsafeCell<T>> and get a mutable reference that way if you take care to never nest the CriticalSections. Even now you can call borrow multiple times concurrently with the same CriticalSection if you so desire. If CriticalSections are not nestable we could perhaps use mutable references to CriticalSections to enforce that your mutex is the only one active. However, this would disallow borrowing from multiple different mutexes at the same time.

Basically Mutex provides a reminder that you have to access the value in a CriticalSection, which ensures single thread access to that variable. In turn this will allow you to safely use cell types, as mentioned earlier.

@TDHolmes
Copy link
Contributor

TDHolmes commented Dec 15, 2021

Related: #208

adamgreig pushed a commit that referenced this issue Jan 12, 2022
224: Allow general exception / interrupt discovery in cortex-m-rt-macros r=korken89 a=mciantyre

We propose changes to the `cortex-m-rt-macros` crate that should help us use the macros independent of the `cortex-m-rt` runtime. The changes in this PR should be backwards compatible for all `cortex-m-rt` users, while expanding the utility of the macros beyond the cortex-m-rt repository.

In the [Teensy 4 libraries](https://github.com/mciantyre/teensy4-rs) we're developing, we've opted to create our own runtime crate, `teensy4-rt`. We require more support than what's available in `cortex-m-rt` to boot and take advantage of NXP iMXRT106x variants. Specifically, we have a unique start-up process, and a custom memory layout with tightly-couple memory (TCM) regions. As discussed in #164, the `cortex-m-rt` crate does not support custom memory layouts. To address the limitations and provide a faster proof-of-concept, we forked the `cortex-m-rt` crate, focusing on the runtime needs of our specific system.

Despite the fork, we strive for compatibility with the `cortex-m-rt` crate. Our eventual goal is to drop the `teensy4-rt` crate, and rely on a future version of the `cortex-m-rt` crate that supports our use-case. Compatibility means supporting the macros; just as the `cortex-m-rt` crate exports the macros, the `teensy4-rt` crate exports the same macros. By requiring that the macros maintain `extern crate cortex_m_rt` declarations, we assume that the `cortex_m_rt` crate is available. However, we don't believe this is a necessary requirement.

To take advantage of the `#[interrupt]` and `#[exception]` macros, a set of crates need to export two identifiers: `interrupt`, an enumeration of valid interrupt handlers; and `exception`, an enumeration of exceptions for the Cortex M variant. We have a precedent for this pattern, in that crates generated by `svd2rust` export the enumeration of valid interrupt handlers (provided the correct features are enabled) for discovery by the `#[interrupt]` macros. The PR proposes a similar strategy: export the `Exceptions` enumeration as `exception` (lower case) from the `cortex-m-rt` crate, so that exception variant discovery occurs the same as it does for interrupts.

After the rename, and with the removal of `extern crate cortex_m_rt` in the two macros, it doesn't matter where the `exception` or `interrupt` enums are defined. The changes let us define a similar `exception` enumeration in our `teensy4-rt` crate, which may be picked up by the `#[exception]` macro. We've shown this to be a successful strategy in the Teensy 4 Rust libraries, which are based on our fork of the macros crate.

We realize that the macros are a feature of the `cortex-m-rt` crate, not a library that others should directly depend on. Ideally, we rally around the `cortex-m-rt` crate, and keep the macros coupled to that implementation. But until we reach that point, having the macros defined without expectations of the `cortex-m-rt` crate lets us bring up new embedded targets faster while maintaining compatibility with the existing ecosystem.

Co-authored-by: Ian McIntyre <ianpmcintyre@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants