mirror of
https://github.com/embassy-rs/embassy.git
synced 2025-10-02 14:44:32 +00:00
fix: lock on early return
This commit is contained in:
parent
966186064e
commit
e4a6d7aedd
@ -1,3 +1,5 @@
|
|||||||
|
use embassy_hal_internal::drop::OnDrop;
|
||||||
|
|
||||||
use super::{family, Blocking, Error, Flash, EEPROM_BASE, EEPROM_SIZE};
|
use super::{family, Blocking, Error, Flash, EEPROM_BASE, EEPROM_SIZE};
|
||||||
|
|
||||||
#[cfg(eeprom)]
|
#[cfg(eeprom)]
|
||||||
@ -68,8 +70,8 @@ impl<'d> Flash<'d, Blocking> {
|
|||||||
self.check_eeprom_offset(offset, 1)?;
|
self.check_eeprom_offset(offset, 1)?;
|
||||||
unsafe {
|
unsafe {
|
||||||
family::unlock();
|
family::unlock();
|
||||||
|
let _on_drop = OnDrop::new(|| family::lock());
|
||||||
self.eeprom_write_u8_slice_unlocked(offset, core::slice::from_ref(&value))?;
|
self.eeprom_write_u8_slice_unlocked(offset, core::slice::from_ref(&value))?;
|
||||||
family::lock();
|
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
@ -84,8 +86,8 @@ impl<'d> Flash<'d, Blocking> {
|
|||||||
self.check_eeprom_offset(offset, 2)?;
|
self.check_eeprom_offset(offset, 2)?;
|
||||||
unsafe {
|
unsafe {
|
||||||
family::unlock();
|
family::unlock();
|
||||||
|
let _on_drop = OnDrop::new(|| family::lock());
|
||||||
self.eeprom_write_u16_slice_unlocked(offset, core::slice::from_ref(&value))?;
|
self.eeprom_write_u16_slice_unlocked(offset, core::slice::from_ref(&value))?;
|
||||||
family::lock();
|
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
@ -100,8 +102,8 @@ impl<'d> Flash<'d, Blocking> {
|
|||||||
self.check_eeprom_offset(offset, 4)?;
|
self.check_eeprom_offset(offset, 4)?;
|
||||||
unsafe {
|
unsafe {
|
||||||
family::unlock();
|
family::unlock();
|
||||||
|
let _on_drop = OnDrop::new(|| family::lock());
|
||||||
self.eeprom_write_u32_slice_unlocked(offset, core::slice::from_ref(&value))?;
|
self.eeprom_write_u32_slice_unlocked(offset, core::slice::from_ref(&value))?;
|
||||||
family::lock();
|
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
@ -111,8 +113,8 @@ impl<'d> Flash<'d, Blocking> {
|
|||||||
self.check_eeprom_offset(offset, data.len() as u32)?;
|
self.check_eeprom_offset(offset, data.len() as u32)?;
|
||||||
unsafe {
|
unsafe {
|
||||||
family::unlock();
|
family::unlock();
|
||||||
|
let _on_drop = OnDrop::new(|| family::lock());
|
||||||
self.eeprom_write_u8_slice_unlocked(offset, data)?;
|
self.eeprom_write_u8_slice_unlocked(offset, data)?;
|
||||||
family::lock();
|
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
@ -127,8 +129,8 @@ impl<'d> Flash<'d, Blocking> {
|
|||||||
self.check_eeprom_offset(offset, data.len() as u32 * 2)?;
|
self.check_eeprom_offset(offset, data.len() as u32 * 2)?;
|
||||||
unsafe {
|
unsafe {
|
||||||
family::unlock();
|
family::unlock();
|
||||||
|
let _on_drop = OnDrop::new(|| family::lock());
|
||||||
self.eeprom_write_u16_slice_unlocked(offset, data)?;
|
self.eeprom_write_u16_slice_unlocked(offset, data)?;
|
||||||
family::lock();
|
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
@ -143,8 +145,8 @@ impl<'d> Flash<'d, Blocking> {
|
|||||||
self.check_eeprom_offset(offset, data.len() as u32 * 4)?;
|
self.check_eeprom_offset(offset, data.len() as u32 * 4)?;
|
||||||
unsafe {
|
unsafe {
|
||||||
family::unlock();
|
family::unlock();
|
||||||
|
let _on_drop = OnDrop::new(|| family::lock());
|
||||||
self.eeprom_write_u32_slice_unlocked(offset, data)?;
|
self.eeprom_write_u32_slice_unlocked(offset, data)?;
|
||||||
family::lock();
|
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
@ -154,7 +156,6 @@ impl<'d> Flash<'d, Blocking> {
|
|||||||
/// This method will write unaligned prefix and suffix as bytes, and aligned middle as u32.
|
/// This method will write unaligned prefix and suffix as bytes, and aligned middle as u32.
|
||||||
pub fn eeprom_write_slice(&mut self, offset: u32, data: &[u8]) -> Result<(), Error> {
|
pub fn eeprom_write_slice(&mut self, offset: u32, data: &[u8]) -> Result<(), Error> {
|
||||||
self.check_eeprom_offset(offset, data.len() as u32)?;
|
self.check_eeprom_offset(offset, data.len() as u32)?;
|
||||||
|
|
||||||
let start = offset;
|
let start = offset;
|
||||||
let misalign = (start % 4) as usize;
|
let misalign = (start % 4) as usize;
|
||||||
let prefix_len = if misalign == 0 {
|
let prefix_len = if misalign == 0 {
|
||||||
@ -168,6 +169,8 @@ impl<'d> Flash<'d, Blocking> {
|
|||||||
|
|
||||||
unsafe {
|
unsafe {
|
||||||
family::unlock();
|
family::unlock();
|
||||||
|
let _on_drop = OnDrop::new(|| family::lock());
|
||||||
|
|
||||||
if !prefix.is_empty() {
|
if !prefix.is_empty() {
|
||||||
self.eeprom_write_u8_slice_unlocked(start, prefix)?;
|
self.eeprom_write_u8_slice_unlocked(start, prefix)?;
|
||||||
}
|
}
|
||||||
@ -187,7 +190,6 @@ impl<'d> Flash<'d, Blocking> {
|
|||||||
let suffix_offset = start + (prefix_len + aligned_len) as u32;
|
let suffix_offset = start + (prefix_len + aligned_len) as u32;
|
||||||
self.eeprom_write_u8_slice_unlocked(suffix_offset, suffix)?;
|
self.eeprom_write_u8_slice_unlocked(suffix_offset, suffix)?;
|
||||||
}
|
}
|
||||||
family::lock();
|
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user