# tiny_kvdb **Repository Path**: li-kai0728/tiny_kvdb ## Basic Information - **Project Name**: tiny_kvdb - **Description**: tiny_kvdb是一款轻量级的key-value数据库,适用于嵌入式产品,用于对产品参数、用户配置等的存储。 - **Primary Language**: C - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 6 - **Created**: 2023-11-24 - **Last Updated**: 2023-11-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 简介 tiny_kvdb是一款轻量级的key-value数据库,适用于嵌入式产品,用于对产品参数、用户配置等的存储。tiny_kvdb将整个数据库存储空间平均分为两个虚拟页面,一个为数据页,另一个为交换页。当数据页存满后,会进行垃圾回收,将有效数据复制到交换页,复制完成后,交换页会转换为数据页,原数据页擦除后转换为交换页,如此反复。 # 主要特性 * 资源占用少 * 支持多实例,各个实例可以使用不同的存储介质 * 支持cache,合理设计cache大小,可以大大加快读写速度 * 支持掉电数据恢复 * 支持简单的擦写均衡 # 使用方法 ## 定义flash接口 ```c typedef struct { uint8_t device_id; /* 用于区分应用程序中不同的flash类型,不要使用0 */ uint8_t write_unit; /* flash最小的写单元, 仅支持 1, 2, 4, 8 */ uint16_t sector_size; /* flash的物理扇区大小 */ /* 操作接口 api */ /* 返回值 >= 0, 表示操作成功; 返回值 < 0, 表示操作失败 */ int (*init)(void); /* flash初始化,非必须 */ int (*read)(uint32_t addr, void * p_dst, uint32_t len); /* 读 */ int (*write)(uint32_t addr, void * p_src, uint32_t len); /* 写 */ int (*erase)(uint32_t addr, uint32_t len); /* 擦除 */ }flash_param_t; ``` ***注意*** 如果数据库占用超过2个物理扇区,接口函数需要实现跨扇区读/写和擦除操作。 ## 数据库操作 ```c const flash_param_t spi_flash = { 0xaa, 1, 4096, sflash_init, sflash_read, sflash_write, sflash_erase }; #define PARAM_KEY 0x5a5a uint32_t some_param; tiny_kvdb_t db; /* 初始化数据库,开始地址为0,占用2个扇区, 接口为spi flash */ tiny_kvdb_init(&db, 0x0, 2, &spi_flash); /* 读取参数 */ tiny_kvdb_read(&db, PARAM_KEY, &some_param, sizeof(some_param)); /* 更改参数 */ some_param = 0x12345678; tiny_kvdb_write(&db, PARAM_KEY, &some_param, sizeof(some_param)); /* 删除参数 */ tiny_kvdb_delete(&db, PARAM_KEY); ```