# tiny_kvdb **Repository Path**: hellowboy/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**: 5 - **Created**: 2024-07-01 - **Last Updated**: 2024-07-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 简介 tiny_kvdb是一款轻量级的key-value数据库,适用于嵌入式产品,用于对产品参数、用户配置等的存储。tiny_kvdb将整个数据库存储空间平均分为两个虚拟页面,一个为数据页,另一个为交换页。当数据页存满后,会进行垃圾回收,将有效数据复制到交换页,复制完成后,交换页会转换为数据页,原数据页擦除后转换为交换页,如此反复。 # 主要特性 * 资源占用少 * 支持多实例,各个实例可以使用不同的存储介质 * 支持cache,合理设计cache大小,可以大大加快读写速度 * 支持掉电数据恢复 * 支持简单的擦写均衡 # 使用方法 ## 定义存储设备接口 ```c typedef struct { uint32_t device_id; /* 用于区分应用程序中不同的存储设备类型,不要使用0 */ uint32_t start_addr; /* 存储设备的起始地址 */ uint32_t max_size; /* 存储设备的最大容量,单位字节 */ uint16_t sector_size; /* 存储设备的物理扇区大小 */ uint16_t write_unit; /* 存储设备的最小写单元, 单位字节, 仅支持 1, 2, 4, 8 */ /* 操作接口 api */ /* 返回值 >= 0, 表示操作成功; 返回值 < 0, 表示操作失败 */ int (*init)(void); /* 设备初始化,非必须 */ 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); /* 擦除 */ } tiny_db_device_t; ``` ***注意*** 如果数据库占用超过2个物理扇区,接口函数需要实现跨扇区读/写和擦除操作。 ## 数据库操作 ```c const tiny_db_device_t spi_flash_1M = { .device_id = 0x5346314D, /* "SF1M" */ .start_addr = 0, .max_size = 1024*1024, .sector_size = 4096, .write_unit = 1, .init = sflash_init, .read = sflash_read, .write = sflash_write, .erase = sflash_erase }; #define PARAM_KEY 0x5a5a uint32_t some_param; tiny_kvdb_t db; /* 初始化数据库,存储设备为spi_flash_1M,开始地址为0,占用2个扇区 */ tiny_kvdb_init(&db, &spi_flash_1M, spi_flash_1M.start_addr, 2 * spi_flash_1M.sector_size); /* 读取参数 */ 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); ```