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:
105
examples/kv/kv_sample.c
Normal file
105
examples/kv/kv_sample.c
Normal 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
|
||||
}
|
||||
|
Reference in New Issue
Block a user