add kv fs component

1. a true wear-leveling kv fs for norflash, especially optimize for some onchip norflash with "write once on one single write unit" like stm32l4, a true "no earse before write" flash algorithm.
2. an "as less as possible" gc strategy, do best to save norflash's life.
3. full "power down protection" support
4. see "examples" of kv, project in "TencentOS_tiny_EVB_MX_Plus", with onchip flash and qspiflash sample.
This commit is contained in:
daishengdong
2019-12-19 16:08:42 +08:00
parent e1c19fd194
commit febcf10911
23 changed files with 8674 additions and 10 deletions

105
examples/kv/kv_sample.c Normal file
View File

@@ -0,0 +1,105 @@
#include "tos_kv.h"
#include "cmsis_os.h"
#define TASK_STK_SIZE 2048
void task(void *arg);
osThreadDef(task, osPriorityNormal, 1, TASK_STK_SIZE);
// #define USING_ONCHIP_FLASH
#ifdef USING_ONCHIP_FLASH
extern kv_flash_drv_t stm32l4_norflash_onchip_drv;
extern kv_flash_prop_t stm32l4_norflash_onchip_prop;
#else
extern kv_flash_drv_t stm32l4_qspiflash_drv;
extern kv_flash_prop_t stm32l4_qspiflash_prop;
#endif
void disp_value(uint8_t *value, uint32_t value_len)
{
int i = 0;
printf("value_len: %d\n", value_len);
printf("\"");
for (i = 0; i < value_len; ++i) {
printf("%c", value[i]);
}
printf("\"\n\n");
}
void task(void *arg)
{
int has_key;
kv_err_t err;
uint8_t value_buf[40];
uint32_t value_len;
#ifndef USING_ONCHIP_FLASH // use qspiflash
extern void MX_QUADSPI_Init(void);
MX_QUADSPI_Init();
#endif
#if 0
stm32l4_norflash_onchip_erase(0x803d000, 2048);
stm32l4_norflash_onchip_erase(0x803d000 + 2048, 2048);
return;
#endif
#ifdef USING_ONCHIP_FLASH
err = tos_kv_init(&stm32l4_norflash_onchip_drv, &stm32l4_norflash_onchip_prop);
printf("kv init, rc: %d\n", err);
#else
err = tos_kv_init(&stm32l4_qspiflash_drv, &stm32l4_qspiflash_prop);
printf("kv init, rc: %d\n", err);
#endif
has_key = tos_kv_has_key("key00");
printf("has key[%s] ? %s\n\n", "key00", has_key ? "True" : "False");
err = tos_kv_set("key00", "value_00", strlen("value_00"));
printf("kv set(%s), rc: %d\n\n", "key00", err);
has_key = tos_kv_has_key("key00");
printf("has key[%s] ? %s\n\n", "key00", has_key ? "True" : "False");
if (err == KV_ERR_NONE) {
err = tos_kv_get("key00", value_buf, sizeof(value_buf), &value_len);
printf("kv get(%s), rc: %d\n\n", "key00", err);
if (err == KV_ERR_NONE) {
disp_value(value_buf, value_len);
}
tos_kv_walkthru();
}
err = tos_kv_set("key00", "value_xx", strlen("value_xx"));
printf("kv set(%s), rc: %d\n\n", "key00", err);
if (err == KV_ERR_NONE) {
err = tos_kv_get("key00", value_buf, sizeof(value_buf), &value_len);
printf("kv get(%s), rc: %d\n\n", "key00", err);
if (err == KV_ERR_NONE) {
disp_value(value_buf, value_len);
}
tos_kv_walkthru();
}
err = tos_kv_del("key00");
printf("kv del(%s), rc: %d\n\n", "key00", err);
has_key = tos_kv_has_key("key00");
printf("has key[%s] ? %s\n\n", "key00", has_key ? "True" : "False");
tos_kv_walkthru();
}
void application_entry(void *arg)
{
osThreadCreate(osThread(task), NULL); // Create task1
}