libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
block_ops.hpp
1
19size_t AvailableSize() { return GetChecksumOffset() - GetUsedBlockSize(BlockType::MAIN); }
20
26size_t GetBlockOffset(BlockType block)
27{
28 return block == BlockType::BACKUP ? block_size_ : 0;
29}
30
35size_t GetChecksumOffset() { return block_size_ - GetChecksumSize(); }
36
41size_t GetChecksumSize() { return AlignSize(sizeof(CHECKSUM_BYTE)); }
42
51void InitBlock(BlockType block)
52{
53 const size_t offset = GetBlockOffset(block);
54 EraseFlashOrExit(offset, block_size_);
55
56 FlashInfo info; // padding filled with 0xFF by constructor
57 info.header = FLASH_HEADER;
58 KeyInfo& tmp_key = info.key;
62 tmp_key.SetNameLength(0);
63 tmp_key.SetDataSize(0);
64 WriteFlashOrExit(offset, {reinterpret_cast<uint8_t*>(&info), sizeof(FlashInfo)});
65 WriteFlashOrExit(offset + GetChecksumOffset(), {&CHECKSUM_BYTE, sizeof(CHECKSUM_BYTE)});
66}
67
73bool IsBlockInited(BlockType block)
74{
75 const size_t offset = GetBlockOffset(block);
76 FlashInfo flash_data;
77 ReadFlashOrExit(offset, flash_data);
78 return flash_data.header == FLASH_HEADER;
79}
80
90bool IsBlockEmpty(BlockType block)
91{
92 const size_t offset = GetBlockOffset(block);
93 FlashInfo flash_data;
94 ReadFlashOrExit(offset, flash_data);
96}
97
104bool IsBlockError(BlockType block)
105{
106 const size_t offset = GetBlockOffset(block);
107 uint32_t checksum = 0;
108 ReadFlashOrExit(offset + GetChecksumOffset(), checksum);
109 return checksum != CHECKSUM_BYTE;
110}
111
119bool IsBlockValid(BlockType block)
120{
121 return IsBlockInited(block) && !IsBlockError(block);
122}
123
128void InvalidateBlock(BlockType block)
129{
130 const uint32_t invalid_checksum = 0;
131 // Keep startup cleanup erase-free so same-bank MCUs only pay a single program op.
132 WriteFlashOrExit(GetBlockOffset(block) + GetChecksumOffset(),
133 {&invalid_checksum, sizeof(invalid_checksum)});
134}
135
149bool TryGetUsedBlockSize(BlockType block, size_t& used_size)
150{
151 const size_t block_offset = GetBlockOffset(block);
152 const size_t checksum_offset = block_offset + GetChecksumOffset();
153 size_t key_offset = block_offset + LibXR::OffsetOf(&FlashInfo::key);
154
155 while (true)
156 {
157 if (key_offset + AlignSize(sizeof(KeyInfo)) > checksum_offset)
158 {
159 return false;
160 }
161
162 KeyInfo key;
163 ReadFlashOrExit(key_offset, key);
164
165 // Recovery cannot trust erased or half-written key metadata to bound copies.
169 {
170 return false;
171 }
172
173 const size_t next_key_offset = key_offset + AlignSize(sizeof(KeyInfo)) +
174 AlignSize(key.GetNameLength()) +
175 AlignSize(key.GetDataSize());
176 if (next_key_offset > checksum_offset)
177 {
178 return false;
179 }
180
182 {
183 used_size = next_key_offset - block_offset;
184 return true;
185 }
186
187 key_offset = next_key_offset;
188 }
189}
190
197size_t GetUsedBlockSize(BlockType block)
198{
199 const size_t block_offset = GetBlockOffset(block);
200 const size_t first_key_offset = block_offset + LibXR::OffsetOf(&FlashInfo::key);
201
202 if (IsBlockEmpty(block))
203 {
204 return GetNextKey(first_key_offset) - block_offset;
205 }
206
207 return GetNextKey(GetLastKey(block)) - block_offset;
208}
209
219void CopyBlockPrefixAndChecksum(BlockType dst_block, BlockType src_block,
220 size_t used_size)
221{
222 const size_t dst_offset = GetBlockOffset(dst_block);
223 const size_t src_offset = GetBlockOffset(src_block);
224 const size_t checksum_offset = GetChecksumOffset();
225
226 ASSERT(used_size <= checksum_offset);
227 // Only the live key prefix and checksum are needed; erased tail bytes are irrelevant.
228 CopyFlashData(dst_offset, src_offset, used_size);
229 CopyFlashData(dst_offset + checksum_offset, src_offset + checksum_offset,
230 GetChecksumSize());
231}
读写对齐布尔位图块的工具 (Helpers for reading and writing aligned boolean flag blocks).
Definition layout.hpp:36
static void SetFlag(BlockBoolData< BlockSize > &obj, bool value)
把一个布尔值编码进位图块 (Encode one boolean value into a flag block).
Definition layout.hpp:43
static bool ReadFlag(const BlockBoolData< BlockSize > &obj)
从位图块读取布尔值 (Decode one boolean value from a flag block).
Definition layout.hpp:57
size_t OffsetOf(MemberType OwnerType::*member) noexcept
计算成员在宿主对象中的偏移量
Definition libxr_def.hpp:98
Flash 存储的块信息结构 (Structure representing a Flash storage block).
Definition layout.hpp:164
KeyInfo key
Definition layout.hpp:186
uint32_t header
Flash 块头签名 / Flash block-header signature.
Definition layout.hpp:182
键信息结构,存储键的元数据 (Structure containing key metadata).
Definition layout.hpp:106
BlockBoolData< MinWriteSize > uninit
该键是否未初始化
Definition layout.hpp:109
BlockBoolData< MinWriteSize > available_flag
该键是否有效
Definition layout.hpp:108
uint32_t GetDataSize() const
获取数据字节数 (Get the payload size in bytes).
Definition layout.hpp:154
void SetNameLength(uint8_t len)
设置键名长度 (Set the key name length).
Definition layout.hpp:130
BlockBoolData< MinWriteSize > no_next_key
是否是最后一个键
Definition layout.hpp:107
void SetDataSize(uint32_t size)
设置数据字节数 (Set the payload size in bytes).
Definition layout.hpp:145
uint8_t GetNameLength() const
获取键名长度 (Get the key name length).
Definition layout.hpp:139