libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
ramfs.hpp
1#pragma once
2
3#include <functional>
4
5#include "libxr_assert.hpp"
6#include "libxr_def.hpp"
7#include "libxr_rw.hpp"
8#include "libxr_type.hpp"
9#include "rbt.hpp"
10
11namespace LibXR
12{
19class RamFS
20{
21 public:
28 RamFS(const char *name = "ramfs");
29
37 static int CompareStr(const char *const &a, const char *const &b);
38
44 enum class FsNodeType : uint8_t
45 {
46 FILE,
47 DIR,
48 DEVICE,
49 STORAGE,
50 UNKNOW,
51 };
52
58 enum class FileType : uint8_t
59 {
60 READ_ONLY,
62 EXEC,
63 };
64
65 class Dir;
66
72 class FsNode
73 {
74 public:
75 const char *name;
76 FsNodeType type;
77 Dir *parent;
78 };
79
85 typedef class FileNode : public FsNode
86 {
87 public:
88 union
89 {
90 void *addr;
91 const void *addr_const;
92 int (*exec)(void *raw, int argc,
93 char **argv);
94 };
95
96 union
97 {
98 size_t size;
99 void *arg;
100 };
101
103
111 int Run(int argc, char **argv);
112
120 template <typename DataType, SizeLimitMode LimitMode = SizeLimitMode::MORE>
121 const DataType &GetData()
122 {
125 {
126 return *reinterpret_cast<DataType *>(addr);
127 }
128 else if (type == FileType::READ_ONLY)
129 {
130 return *reinterpret_cast<const DataType *>(addr_const);
131 }
132 else
133 {
134 ASSERT(false);
135 const void *addr = nullptr;
136 return *reinterpret_cast<const DataType *>(addr);
137 }
138 }
139 } FileNode;
140
141 typedef RBTree<const char *>::Node<FileNode> File;
142
153
159 class Device : public RBTree<const char *>::Node<DeviceNode>
160 {
161 public:
169 Device(const char *name, const ReadPort &read_port = ReadPort(),
170 const WritePort &write_port = WritePort());
171
180 template <typename ReadOperation>
181 ErrorCode Read(ReadOperation &&op, RawData data)
182 {
183 return data_.read_port(data, std::forward<ReadOperation>(op));
184 }
185
194 template <typename WriteOperation>
195 ErrorCode Write(WriteOperation &&op, ConstRawData data)
196 {
197 return data_.write_port(data, std::forward<WriteOperation>(op));
198 }
199
200 uint32_t device_type;
201 };
202
203 typedef struct
204 {
205 // TODO:
206 uint32_t res;
207 } StorageBlock;
208
214 class DirNode : public FsNode
215 {
216 public:
218
220 };
221
228 class Dir : public RBTree<const char *>::Node<DirNode>
229 {
230 public:
236 void Add(File &file)
237 {
238 (*this)->rbt.Insert(file, file->name);
239 file->parent = this;
240 }
246 void Add(Dir &dir)
247 {
248 (*this)->rbt.Insert(dir, dir->name);
249 dir->parent = this;
250 }
256 void Add(Device &dev)
257 {
258 (*this)->rbt.Insert(dev, dev->name);
259 dev->parent = this;
260 }
261
269 File *FindFile(const char *name);
270
278 File *FindFileRev(const char *name);
279
287 Dir *FindDir(const char *name);
288
296 Dir *FindDirRev(const char *name);
297
305 Device *FindDeviceRev(const char *name);
306
314 Device *FindDevice(const char *name);
315 };
316
325 template <typename DataType>
326 static File CreateFile(const char *name, DataType &raw)
327 {
328 File file;
329 char *name_buff = new char[strlen(name) + 1];
330 strcpy(name_buff, name);
331 file->name = name_buff;
332
333 if (std::is_const<DataType>())
334 {
335 file->type = FileType::READ_ONLY;
336 file->addr_const = &raw;
337 }
338 else
339 {
340 file->type = FileType::READ_WRITE;
341 file->addr = &raw;
342 }
343
344 file->size = sizeof(DataType);
345
346 return file;
347 }
348
358 template <typename ArgType>
359 static File CreateFile(const char *name,
360 int (*exec)(ArgType arg, int argc, char **argv), ArgType &&arg)
361 {
362 typedef struct
363 {
364 ArgType arg;
365 decltype(exec) exec_fun;
366 } FileBlock;
367
368 File file;
369
370 char *name_buff = new char[strlen(name) + 1];
371 strcpy(name_buff, name);
372 file->name = name_buff;
373 file->type = FileType::EXEC;
374
375 auto block = new FileBlock;
376 block->arg = std::forward<ArgType>(arg);
377 block->exec_fun = exec;
378 file->arg = block;
379
380 auto fun = [](void *arg, int argc, char **argv)
381 {
382 auto block = reinterpret_cast<FileBlock *>(arg);
383 return block->exec_fun(block->arg, argc, argv);
384 };
385
386 file->exec = fun;
387
388 return file;
389 }
390
397 static Dir CreateDir(const char *name)
398 {
399 Dir dir;
400
401 char *name_buff = new char[strlen(name) + 1];
402 strcpy(name_buff, name);
403 dir->name = name_buff;
404 dir->type = FsNodeType::DIR;
405
406 return dir;
407 }
408
414 void Add(File &file) { root_.Add(file); }
420 void Add(Dir &dir) { root_.Add(dir); }
426 void Add(Device &dev) { root_.Add(dev); }
427
435 File *FindFile(const char *name) { return root_.FindFileRev(name); }
443 Dir *FindDir(const char *name) { return root_.FindDirRev(name); }
451 Device *FindDevice(const char *name) { return root_.FindDeviceRev(name); }
452
458
464
470};
471} // namespace LibXR
static void SizeLimitCheck(size_t limit, size_t size)
在非调试模式下的占位大小检查函数(无实际作用)。 Dummy size limit check for non-debug builds.
常量原始数据封装类。 A class for encapsulating constant raw data.
size_t size
节点大小 (Size of the node).
Definition rbt.hpp:46
BaseNode * parent
父节点 (Parent node).
Definition rbt.hpp:45
红黑树的泛型数据节点,继承自 BaseNode (Generic data node for Red-Black Tree, inheriting from BaseNode).
Definition rbt.hpp:64
红黑树实现,支持泛型键和值,并提供线程安全操作 (Red-Black Tree implementation supporting generic keys and values with thread...
Definition rbt.hpp:24
设备类,继承自红黑树节点 DeviceNode Device class inheriting from Red-Black tree node DeviceNode
Definition ramfs.hpp:160
Device(const char *name, const ReadPort &read_port=ReadPort(), const WritePort &write_port=WritePort())
设备构造函数 Device constructor
Definition ramfs.cpp:20
uint32_t device_type
设备类型 Device type
Definition ramfs.hpp:200
ErrorCode Write(WriteOperation &&op, ConstRawData data)
向设备写入数据 Writes data to the device
Definition ramfs.hpp:195
ErrorCode Read(ReadOperation &&op, RawData data)
读取设备数据 Reads data from the device
Definition ramfs.hpp:181
目录类,继承自 RBTree 节点,用于管理文件、子目录和设备 Directory class, inheriting from RBTree node, used for managing files...
Definition ramfs.hpp:229
Device * FindDeviceRev(const char *name)
递归查找设备 Recursively searches for a device
Definition ramfs.cpp:142
void Add(Dir &dir)
添加子目录到当前目录 Adds a subdirectory to the current directory
Definition ramfs.hpp:246
void Add(Device &dev)
添加设备到当前目录 Adds a device to the current directory
Definition ramfs.hpp:256
File * FindFile(const char *name)
查找当前目录中的文件 Finds a file in the current directory
Definition ramfs.cpp:32
Dir * FindDir(const char *name)
查找当前目录中的子目录 Finds a subdirectory in the current directory
Definition ramfs.cpp:81
Device * FindDevice(const char *name)
在当前目录中查找设备 Finds a device in the current directory
Definition ramfs.cpp:184
File * FindFileRev(const char *name)
递归查找文件 Recursively searches for a file
Definition ramfs.cpp:45
void Add(File &file)
添加文件到当前目录 Adds a file to the current directory
Definition ramfs.hpp:236
Dir * FindDirRev(const char *name)
递归查找子目录 Recursively searches for a subdirectory
Definition ramfs.cpp:105
目录节点,继承自 FsNode Directory node, inheriting from FsNode
Definition ramfs.hpp:215
RBTree< const char * > rbt
目录中的文件树 File tree in the directory
Definition ramfs.hpp:219
文件节点类,继承自 FsNode,表示文件 File node class, inheriting from FsNode, representing a file
Definition ramfs.hpp:86
int(* exec)(void *raw, int argc, char **argv)
可执行文件指针 Executable function pointer
Definition ramfs.hpp:92
void * addr
读写地址 Read/Write address
Definition ramfs.hpp:90
FileType type
文件类型 File type
Definition ramfs.hpp:102
void * arg
可执行文件参数 Executable file argument
Definition ramfs.hpp:99
const DataType & GetData()
获取文件数据 Retrieves file data
Definition ramfs.hpp:121
int Run(int argc, char **argv)
运行可执行文件 Runs an executable file
Definition ramfs.cpp:14
const void * addr_const
只读地址 Read-only address
Definition ramfs.hpp:91
size_t size
文件大小 File size
Definition ramfs.hpp:98
文件系统节点基类,所有文件和目录均继承自该类 Base class for file system nodes; all files and directories inherit from this
Definition ramfs.hpp:73
轻量级的内存文件系统,实现基本的文件、目录和设备管理 A lightweight in-memory file system implementing basic file,...
Definition ramfs.hpp:20
Dir * FindDir(const char *name)
在整个文件系统中查找目录 Finds a directory in the entire file system
Definition ramfs.hpp:443
Device * FindDevice(const char *name)
在整个文件系统中查找设备 Finds a device in the entire file system
Definition ramfs.hpp:451
static File CreateFile(const char *name, DataType &raw)
创建一个新的文件 Creates a new file
Definition ramfs.hpp:326
RamFS(const char *name="ramfs")
构造函数,初始化内存文件系统的根目录 Constructor that initializes the root directory of the in-memory file system
Definition ramfs.cpp:5
void Add(Dir &dir)
向文件系统的根目录添加子目录 Adds a subdirectory to the root directory of the file system
Definition ramfs.hpp:420
FsNodeType
文件系统节点类型 Types of file system nodes
Definition ramfs.hpp:45
@ UNKNOW
未知 Unknown
@ STORAGE
存储 Storage
@ DIR
目录 Directory
static Dir CreateDir(const char *name)
创建一个新的目录 Creates a new directory
Definition ramfs.hpp:397
void Add(Device &dev)
向文件系统的根目录添加设备 Adds a device to the root directory of the file system
Definition ramfs.hpp:426
static int CompareStr(const char *const &a, const char *const &b)
比较两个字符串 Compares two strings
Definition ramfs.cpp:12
Dir dev_
dev 目录,用于存放设备文件 dev directory for storing device files
Definition ramfs.hpp:469
FileType
文件类型 Types of files
Definition ramfs.hpp:59
@ READ_ONLY
只读 Read-only
@ READ_WRITE
读写 Read/Write
@ EXEC
可执行 Executable
Dir bin_
bin 目录,用于存放可执行文件 bin directory for storing executable files
Definition ramfs.hpp:463
static File CreateFile(const char *name, int(*exec)(ArgType arg, int argc, char **argv), ArgType &&arg)
创建一个可执行文件 Creates an executable file
Definition ramfs.hpp:359
void Add(File &file)
向文件系统的根目录添加文件 Adds a file to the root directory of the file system
Definition ramfs.hpp:414
Dir root_
文件系统的根目录 Root directory of the file system
Definition ramfs.hpp:457
File * FindFile(const char *name)
在整个文件系统中查找文件 Finds a file in the entire file system
Definition ramfs.hpp:435
原始数据封装类。 A class for encapsulating raw data.
ReadPort class for handling read operations.
Definition libxr_rw.hpp:268
WritePort class for handling write operations.
Definition libxr_rw.hpp:402
LibXR 命名空间
Definition ch32_gpio.hpp:9
设备节点,继承自 FsNode Device node, inheriting from FsNode
Definition ramfs.hpp:149
ReadPort read_port
读端口 Read port
Definition ramfs.hpp:150
WritePort write_port
写端口 Write port
Definition ramfs.hpp:151