18 void ReadFlashOrExit(
size_t offset, RawData data)
20 REQUIRE(flash_.Read(offset, data) == ErrorCode::OK);
30 template <
typename Data>
31 void ReadFlashOrExit(
size_t offset, Data& data)
33 ReadFlashOrExit(offset, RawData(data));
42 void WriteFlashOrExit(
size_t offset, ConstRawData data)
44 REQUIRE(Write(offset, data) == ErrorCode::OK);
54 template <
typename Data>
55 void WriteFlashOrExit(
size_t offset,
const Data& data)
57 WriteFlashOrExit(offset, ConstRawData(data));
66 void EraseFlashOrExit(
size_t offset,
size_t size)
68 REQUIRE(flash_.Erase(offset, size) == ErrorCode::OK);
78 void CopyFlashData(
size_t dst_offset,
size_t src_offset,
size_t size)
80 for (
size_t i = 0; i < size; i += MinWriteSize)
82 ReadFlashOrExit(src_offset + i, {write_buffer_, MinWriteSize});
83 WriteFlashOrExit(dst_offset + i, {write_buffer_, MinWriteSize});
93 size_t AlignSize(
size_t size)
95 return static_cast<size_t>((size + MinWriteSize - 1) / MinWriteSize) * MinWriteSize;
108 ErrorCode Write(
size_t offset, ConstRawData data)
112 return ErrorCode::OK;
115 if (data.size_ % MinWriteSize == 0)
117 return flash_.Write(offset, data);
121 auto final_block_index = data.size_ - data.size_ % MinWriteSize;
122 if (final_block_index != 0)
124 auto ec = flash_.Write(offset, {data.addr_, final_block_index});
125 if (ec != ErrorCode::OK)
130 Memory::FastSet(write_buffer_, 0xff, MinWriteSize);
132 write_buffer_,
reinterpret_cast<const uint8_t*
>(data.addr_) + final_block_index,
133 data.size_ % MinWriteSize);
134 return flash_.Write(offset + final_block_index, {write_buffer_, MinWriteSize});
static void FastCopy(void *dst, const void *src, size_t size)
快速内存拷贝 / Fast memory copy