Skip to content

Commit 4cd62a9

Browse files
committed
add a Cargo feature, cm7-r0p1, to fix a Cortex-M7 BASEPRI erratum
1 parent bdc7ca9 commit 4cd62a9

File tree

4 files changed

+34
-5
lines changed

4 files changed

+34
-5
lines changed

Cargo.toml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,7 @@ version = "0.3.1"
1212
[dependencies]
1313
aligned = "0.1.1"
1414
bare-metal = "0.1.0"
15-
volatile-register = "0.2.0"
15+
volatile-register = "0.2.0"
16+
17+
[features]
18+
cm7-r0p1 = []

ci/script.sh

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@ set -euxo pipefail
22

33
main() {
44
case $TARGET in
5+
thumbv7em-none-eabi*)
6+
xargo check --target $TARGET --features cm7-r0p1
7+
xargo check --target $TARGET
8+
;;
59
thumbv*-none-eabi*)
610
xargo check --target $TARGET
711
;;

src/register/basepri.rs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,22 @@ pub fn read() -> u8 {
1818
}
1919

2020
/// Writes to the CPU register
21+
///
22+
/// **IMPORTANT** If you are using a Cortex-M7 device with revision r0p1 you MUST enable the
23+
/// `cm7-r0p1` Cargo feature or this function WILL misbehave.
24+
#[cfg_attr(not(target_arch = "arm"), allow(unused_variables))]
2125
#[inline]
22-
pub unsafe fn write(_basepri: u8) {
26+
pub unsafe fn write(basepri: u8) {
2327
match () {
2428
#[cfg(target_arch = "arm")]
25-
() => asm!("msr BASEPRI, $0" :: "r"(_basepri) : "memory" : "volatile"),
29+
() => match () {
30+
#[cfg(not(feature = "cm7-r0p1"))]
31+
() => asm!("msr BASEPRI, $0" :: "r"(basepri) : "memory" : "volatile"),
32+
#[cfg(feature = "cm7-r0p1")]
33+
() => asm!("cpsid i
34+
msr BASEPRI, $0
35+
cpsie i" :: "r"(basepri) : "memory" : "volatile"),
36+
},
2637
#[cfg(not(target_arch = "arm"))]
2738
() => unimplemented!(),
2839
}

src/register/basepri_max.rs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,23 @@
44
///
55
/// - `basepri != 0` AND `basepri::read() == 0`, OR
66
/// - `basepri != 0` AND `basepri < basepri::read()`
7+
///
8+
/// **IMPORTANT** If you are using a Cortex-M7 device with revision r0p1 you MUST enable the
9+
/// `cm7-r0p1` Cargo feature or this function WILL misbehave.
10+
#[cfg_attr(not(target_arch = "arm"), allow(unused_variables))]
711
#[inline]
8-
pub fn write(_basepri: u8) {
12+
pub fn write(basepri: u8) {
913
match () {
1014
#[cfg(target_arch = "arm")]
1115
() => unsafe {
12-
asm!("msr BASEPRI_MAX, $0" :: "r"(_basepri) : "memory" : "volatile");
16+
match () {
17+
#[cfg(not(feature = "cm7-r0p1"))]
18+
() => asm!("msr BASEPRI_MAX, $0" :: "r"(basepri) : "memory" : "volatile"),
19+
#[cfg(feature = "cm7-r0p1")]
20+
() => asm!("cpsid i
21+
msr BASEPRI_MAX, $0
22+
cpsie i" :: "r"(basepri) : "memory" : "volatile"),
23+
}
1324
},
1425
#[cfg(not(target_arch = "arm"))]
1526
() => unimplemented!(),

0 commit comments

Comments
 (0)