Skip to content

systick-64bit on armv7 can deadlock #1117

@liamkinne

Description

@liamkinne

It appears that using a 64-bit backed rtic-monotonics counter, on armv7 portable-atomics will polyfill with a AtomicU64 implementation that can deadlock.

To be fair this is expected behavior of portable-atomics, it's just that because the polyfill is automatic it's easy to not realise that you've introduced a deadlock.

Could this at least be outlined in the docs? Or even better, prevent armv7 targets from using 64bit systick at all? In either case I am happy to open the PR if someone is able to point me in the right direction.

Here's a stack trace from when using systick-64bit locks up:

#0  0x08017168 in core::iter::range::{impl#5}::spec_next<i32> (self=<optimized out>) at /Users/liam/.rustup/toolchains/stable-aarch64-apple-darwin/lib/rustlib/src/rust/library/core/src/iter/range.rs:764
#1  core::iter::range::{impl#6}::next<i32> (self=<optimized out>) at /Users/liam/.rustup/toolchains/stable-aarch64-apple-darwin/lib/rustlib/src/rust/library/core/src/iter/range.rs:849
#2  portable_atomic::imp::fallback::utils::Backoff::snooze (self=<optimized out>) at /Users/liam/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/portable-atomic-1.11.1/src/imp/fallback/utils.rs:138
#3  portable_atomic::imp::fallback::seq_lock::SeqLock::write (self=0x20007480 <portable_atomic::imp::fallback::lock::LOCKS+768>)
    at /Users/liam/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/portable-atomic-1.11.1/src/imp/fallback/seq_lock_wide.rs:97
#4  0x080170c4 in portable_atomic::imp::fallback::AtomicU64::fetch_add (self=0x200079e0 <rtic_monotonics::systick::SYSTICK_CNT>, val=1, _order=core::sync::atomic::Ordering::AcqRel)
    at /Users/liam/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/portable-atomic-1.11.1/src/imp/fallback/mod.rs:322
#5  portable_atomic::AtomicU64::fetch_add (self=0x200079e0 <rtic_monotonics::systick::SYSTICK_CNT>, val=1, order=core::sync::atomic::Ordering::AcqRel)
    at /Users/liam/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/portable-atomic-1.11.1/src/lib.rs:3241
#6  0x0800c720 in rtic_monotonics::systick::{impl#1}::on_interrupt () at /Users/liam/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rtic-monotonics-2.1.0/src/systick.rs:130
#7  rtic_time::timer_queue::TimerQueue<rtic_monotonics::systick::SystickBackend>::on_monotonic_interrupt<rtic_monotonics::systick::SystickBackend> (self=<optimized out>)
    at /Users/liam/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rtic-time-2.0.1/src/timer_queue.rs:102
#8  pdm_36::{impl#0}::start::SysTick () at /Users/liam/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rtic-monotonics-2.1.0/src/systick.rs:181

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions