我的做法是定义了一个块设备的接口(即B接口):
typedef unsigned short block_num_t;
struct _block_dev_t;
typedef struct _block_dev_t block_dev_t;
typedef block_num_t (*block_dev_get_block_nr_t)(block_dev_t* dev);
typedef bool_t (*block_dev_read_block_t)(block_dev_t* dev, block_num_t block_num, void* buff);
typedef bool_t (*block_dev_write_block_t)(block_dev_t* dev, block_num_t block_num, const void* buff);
typedef void (*block_dev_destroy_t)(block_dev_t* dev);
struct _block_dev_t {
block_dev_get_block_nr_t get_block_nr;
block_dev_write_block_t write_block;
block_dev_read_block_t read_block;
block_dev_destroy_t destroy;
};
在初始化文件系统时,把块设备注入进来:
bool_t sfs_init(sfs_t* fs, block_dev_t* dev);
这样,文件系统只与块设备接口交互,不需要关心实现是norflash、nandflash、内存还是磁盘。而且带来几个附加好处:
可以在PC上做文件系统的单元测试。在PC上,用内存模拟一个块设备,文件系统可以正常工作了。
可以通过装饰模式为块设备添加磨损均衡算法和坏块管理算法。这些算法和文件系统都可以独立重用。
『多态』让真正的重用成为可能,没有『多态』就没有各种框架。在C语言中,多态是通过函数指针实现的,而在C++中是通过虚函数,在Java中有专门的接口,在JS这种动态语言中,每个函数是多态的。『多态』虽然不是面向对象的『特有的』属性,但是面向对象的编程语言让『多态』更加简单和安全。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对ASPKU的支持。










