diff options
| author | okhsunrog <[email protected]> | 2025-05-21 21:30:23 +0300 |
|---|---|---|
| committer | okhsunrog <[email protected]> | 2025-05-21 21:30:23 +0300 |
| commit | e4a6d7aeddd686e47e1a26cd129e7bb646dcb0be (patch) | |
| tree | 707028eb0e68b5dee81ed6947e19f079655d1a5b | |
| parent | 966186064ebf36634e9930dd4b2d83ed675f6eb0 (diff) | |
fix: lock on early return
| -rw-r--r-- | embassy-stm32/src/flash/eeprom.rs | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/embassy-stm32/src/flash/eeprom.rs b/embassy-stm32/src/flash/eeprom.rs index 68bcc6c15..cc3529eb9 100644 --- a/embassy-stm32/src/flash/eeprom.rs +++ b/embassy-stm32/src/flash/eeprom.rs | |||
| @@ -1,3 +1,5 @@ | |||
| 1 | use embassy_hal_internal::drop::OnDrop; | ||
| 2 | |||
| 1 | use super::{family, Blocking, Error, Flash, EEPROM_BASE, EEPROM_SIZE}; | 3 | use super::{family, Blocking, Error, Flash, EEPROM_BASE, EEPROM_SIZE}; |
| 2 | 4 | ||
| 3 | #[cfg(eeprom)] | 5 | #[cfg(eeprom)] |
| @@ -68,8 +70,8 @@ impl<'d> Flash<'d, Blocking> { | |||
| 68 | self.check_eeprom_offset(offset, 1)?; | 70 | self.check_eeprom_offset(offset, 1)?; |
| 69 | unsafe { | 71 | unsafe { |
| 70 | family::unlock(); | 72 | family::unlock(); |
| 73 | let _on_drop = OnDrop::new(|| family::lock()); | ||
| 71 | self.eeprom_write_u8_slice_unlocked(offset, core::slice::from_ref(&value))?; | 74 | self.eeprom_write_u8_slice_unlocked(offset, core::slice::from_ref(&value))?; |
| 72 | family::lock(); | ||
| 73 | } | 75 | } |
| 74 | Ok(()) | 76 | Ok(()) |
| 75 | } | 77 | } |
| @@ -84,8 +86,8 @@ impl<'d> Flash<'d, Blocking> { | |||
| 84 | self.check_eeprom_offset(offset, 2)?; | 86 | self.check_eeprom_offset(offset, 2)?; |
| 85 | unsafe { | 87 | unsafe { |
| 86 | family::unlock(); | 88 | family::unlock(); |
| 89 | let _on_drop = OnDrop::new(|| family::lock()); | ||
| 87 | self.eeprom_write_u16_slice_unlocked(offset, core::slice::from_ref(&value))?; | 90 | self.eeprom_write_u16_slice_unlocked(offset, core::slice::from_ref(&value))?; |
| 88 | family::lock(); | ||
| 89 | } | 91 | } |
| 90 | Ok(()) | 92 | Ok(()) |
| 91 | } | 93 | } |
| @@ -100,8 +102,8 @@ impl<'d> Flash<'d, Blocking> { | |||
| 100 | self.check_eeprom_offset(offset, 4)?; | 102 | self.check_eeprom_offset(offset, 4)?; |
| 101 | unsafe { | 103 | unsafe { |
| 102 | family::unlock(); | 104 | family::unlock(); |
| 105 | let _on_drop = OnDrop::new(|| family::lock()); | ||
| 103 | self.eeprom_write_u32_slice_unlocked(offset, core::slice::from_ref(&value))?; | 106 | self.eeprom_write_u32_slice_unlocked(offset, core::slice::from_ref(&value))?; |
| 104 | family::lock(); | ||
| 105 | } | 107 | } |
| 106 | Ok(()) | 108 | Ok(()) |
| 107 | } | 109 | } |
| @@ -111,8 +113,8 @@ impl<'d> Flash<'d, Blocking> { | |||
| 111 | self.check_eeprom_offset(offset, data.len() as u32)?; | 113 | self.check_eeprom_offset(offset, data.len() as u32)?; |
| 112 | unsafe { | 114 | unsafe { |
| 113 | family::unlock(); | 115 | family::unlock(); |
| 116 | let _on_drop = OnDrop::new(|| family::lock()); | ||
| 114 | self.eeprom_write_u8_slice_unlocked(offset, data)?; | 117 | self.eeprom_write_u8_slice_unlocked(offset, data)?; |
| 115 | family::lock(); | ||
| 116 | } | 118 | } |
| 117 | Ok(()) | 119 | Ok(()) |
| 118 | } | 120 | } |
| @@ -127,8 +129,8 @@ impl<'d> Flash<'d, Blocking> { | |||
| 127 | self.check_eeprom_offset(offset, data.len() as u32 * 2)?; | 129 | self.check_eeprom_offset(offset, data.len() as u32 * 2)?; |
| 128 | unsafe { | 130 | unsafe { |
| 129 | family::unlock(); | 131 | family::unlock(); |
| 132 | let _on_drop = OnDrop::new(|| family::lock()); | ||
| 130 | self.eeprom_write_u16_slice_unlocked(offset, data)?; | 133 | self.eeprom_write_u16_slice_unlocked(offset, data)?; |
| 131 | family::lock(); | ||
| 132 | } | 134 | } |
| 133 | Ok(()) | 135 | Ok(()) |
| 134 | } | 136 | } |
| @@ -143,8 +145,8 @@ impl<'d> Flash<'d, Blocking> { | |||
| 143 | self.check_eeprom_offset(offset, data.len() as u32 * 4)?; | 145 | self.check_eeprom_offset(offset, data.len() as u32 * 4)?; |
| 144 | unsafe { | 146 | unsafe { |
| 145 | family::unlock(); | 147 | family::unlock(); |
| 148 | let _on_drop = OnDrop::new(|| family::lock()); | ||
| 146 | self.eeprom_write_u32_slice_unlocked(offset, data)?; | 149 | self.eeprom_write_u32_slice_unlocked(offset, data)?; |
| 147 | family::lock(); | ||
| 148 | } | 150 | } |
| 149 | Ok(()) | 151 | Ok(()) |
| 150 | } | 152 | } |
| @@ -154,7 +156,6 @@ impl<'d> Flash<'d, Blocking> { | |||
| 154 | /// This method will write unaligned prefix and suffix as bytes, and aligned middle as u32. | 156 | /// This method will write unaligned prefix and suffix as bytes, and aligned middle as u32. |
| 155 | pub fn eeprom_write_slice(&mut self, offset: u32, data: &[u8]) -> Result<(), Error> { | 157 | pub fn eeprom_write_slice(&mut self, offset: u32, data: &[u8]) -> Result<(), Error> { |
| 156 | self.check_eeprom_offset(offset, data.len() as u32)?; | 158 | self.check_eeprom_offset(offset, data.len() as u32)?; |
| 157 | |||
| 158 | let start = offset; | 159 | let start = offset; |
| 159 | let misalign = (start % 4) as usize; | 160 | let misalign = (start % 4) as usize; |
| 160 | let prefix_len = if misalign == 0 { | 161 | let prefix_len = if misalign == 0 { |
| @@ -168,6 +169,8 @@ impl<'d> Flash<'d, Blocking> { | |||
| 168 | 169 | ||
| 169 | unsafe { | 170 | unsafe { |
| 170 | family::unlock(); | 171 | family::unlock(); |
| 172 | let _on_drop = OnDrop::new(|| family::lock()); | ||
| 173 | |||
| 171 | if !prefix.is_empty() { | 174 | if !prefix.is_empty() { |
| 172 | self.eeprom_write_u8_slice_unlocked(start, prefix)?; | 175 | self.eeprom_write_u8_slice_unlocked(start, prefix)?; |
| 173 | } | 176 | } |
| @@ -187,7 +190,6 @@ impl<'d> Flash<'d, Blocking> { | |||
| 187 | let suffix_offset = start + (prefix_len + aligned_len) as u32; | 190 | let suffix_offset = start + (prefix_len + aligned_len) as u32; |
| 188 | self.eeprom_write_u8_slice_unlocked(suffix_offset, suffix)?; | 191 | self.eeprom_write_u8_slice_unlocked(suffix_offset, suffix)?; |
| 189 | } | 192 | } |
| 190 | family::lock(); | ||
| 191 | } | 193 | } |
| 192 | Ok(()) | 194 | Ok(()) |
| 193 | } | 195 | } |
