libxr
Embedded C++ framework for bare-metal, RTOS and Linux
Loading...
Searching...
No Matches
layout.hpp
1
10enum class BlockType : uint8_t
11{
12 MAIN = 0,
13 BACKUP = 1
14};
15
16LIBXR_PACKED_BEGIN
22template <size_t BlockSize>
24{
25 uint8_t data[BlockSize];
26};
27LIBXR_PACKED_END
28
34template <size_t BlockSize>
36{
37 public:
43 static void SetFlag(BlockBoolData<BlockSize>& obj, bool value)
44 {
45 Memory::FastSet(obj.data, 0xFF, BlockSize);
46 if (!value)
47 {
48 obj.data[BlockSize - 1] &= 0xF0;
49 }
50 }
51
64 static bool ReadFlag(const BlockBoolData<BlockSize>& obj)
65 {
66 for (size_t i = 0; i < BlockSize; ++i)
67 {
68 if (obj.data[i] != 0xFF)
69 {
70 return false;
71 }
72 }
73 return true;
74 }
75
82 static bool Valid(const BlockBoolData<BlockSize>& obj)
83 {
84 if (BlockSize == 0)
85 {
86 return false;
87 }
88
89 for (size_t i = 0; i < BlockSize - 1; ++i)
90 {
91 if (obj.data[i] != 0xFF)
92 {
93 return false;
94 }
95 }
96
97 uint8_t last_byte = obj.data[BlockSize - 1];
98 if ((last_byte & 0xF0) != 0xF0)
99 {
100 return false;
101 }
102
103 uint8_t last_4bits = last_byte & 0x0F;
104 if (!(last_4bits == 0x0F || last_4bits == 0x00))
105 {
106 return false;
107 }
108
109 return true;
110 }
111};
112
113LIBXR_PACKED_BEGIN
119{
123
124 uint32_t raw_info =
125 0;
127
138
143 void SetNameLength(uint8_t len)
144 {
145 raw_info = (raw_info & 0x01FFFFFF) | ((len & 0x7F) << 25);
146 }
147
152 uint8_t GetNameLength() const { return (raw_info >> 25) & 0x7F; }
153
158 void SetDataSize(uint32_t size)
159 {
160 raw_info = (raw_info & 0xFE000000) | (size & 0x01FFFFFF);
161 }
162
167 uint32_t GetDataSize() const { return raw_info & 0x01FFFFFF; }
168};
169LIBXR_PACKED_END
170
171LIBXR_PACKED_BEGIN
177{
183 {
184 header = 0xFFFFFFFF;
185 Memory::FastSet(padding, 0xFF, MinWriteSize);
186 }
187
193 union
194 {
195 uint32_t header;
196 uint8_t padding[MinWriteSize];
198 };
201};
202LIBXR_PACKED_END
读写对齐布尔位图块的工具 Helpers for reading and writing aligned boolean flag blocks.
Definition layout.hpp:36
static bool Valid(const BlockBoolData< BlockSize > &obj)
检查位图块内容是否仍是合法编码 / Check whether a flag block still contains a valid encoding.
Definition layout.hpp:82
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:64
按最小写入单元存放布尔位图块 Boolean flag block stored in one aligned write unit span.
Definition layout.hpp:24
Flash 存储的块信息结构 Structure representing a Flash storage block.
Definition layout.hpp:177
uint8_t padding[MinWriteSize]
Definition layout.hpp:196
KeyInfo key
Definition layout.hpp:199
FlashInfo()
构造一个擦除态 FlashInfo 缓冲对象 Construct one erased-state FlashInfo buffer object.
Definition layout.hpp:182
uint32_t header
Flash 块头签名 / Flash block-header signature.
Definition layout.hpp:195
键信息结构,存储键的元数据 Structure containing key metadata.
Definition layout.hpp:119
BlockBoolData< MinWriteSize > uninit
该键是否未初始化
Definition layout.hpp:122
BlockBoolData< MinWriteSize > available_flag
该键是否有效
Definition layout.hpp:121
uint32_t GetDataSize() const
获取数据字节数 / Get the payload size in bytes.
Definition layout.hpp:167
uint32_t raw_info
Definition layout.hpp:124
void SetNameLength(uint8_t len)
设置键名长度 / Set the key name length.
Definition layout.hpp:143
BlockBoolData< MinWriteSize > no_next_key
是否是最后一个键
Definition layout.hpp:120
void SetDataSize(uint32_t size)
设置数据字节数 / Set the payload size in bytes.
Definition layout.hpp:158
KeyInfo()
构造一个默认可写的键头元数据 Construct one default writable key-header metadata object.
Definition layout.hpp:132
uint8_t GetNameLength() const
获取键名长度 / Get the key name length.
Definition layout.hpp:152