【Alios-things笔记】EMW3060 Flash用户数据存储KV

[KV介绍]
KV组件是AliOS Things中一个以Key-Value方式进行持久化存储的轻量级组件,主要为基于nor flash的小型MCU设备(Micro Control Unit)提供通用的Key-Value持久化存储接口。KV组件支持写平衡(磨损平衡)、掉电保护特性,且具有相当低的footprint。

Alios-things中的kv实现位于kernel/rhino/fs/kv/目录下,通过查看kv.mk文件可以找到主要文件是kvmgr.c和kv_osal.c文件。
在EMW3060模块的配置中,使用了KV组件,其描述信息位于platform/mcu/moc108/moc108.mk文件中

... ...
#启用rhino.fs.kv组件
$(NAME)_COMPONENTS += libc rhino yloop rhino.fs.kv alicrypto digest_algorithm

# kv组件相关的配置
#使能hal_flash.c中关于kv组件的操作
GLOBAL_DEFINES += CONFIG_AOS_KV_MULTIPTN_MODE
#定义KV组件将数据存储到FLASH的那个分区,这里使用HAL_PARTITION_PARAMETER_2分区(具体的分区信息可以到board/mk3060/board.c文件中查看)
GLOBAL_DEFINES += CONFIG_AOS_KV_PTN=6
#第二分区
GLOBAL_DEFINES += CONFIG_AOS_KV_SECOND_PTN=7
#每个Flash块的大小
GLOBAL_DEFINES += CONFIG_AOS_KV_PTN_SIZE=4096
#KV组件可操作的FLASH总大小
GLOBAL_DEFINES += CONFIG_AOS_KV_BUFFER_SIZE=8192
... ...

kv组件提供如下几个接口

/**
 * Add a new KV pair.
 *
 * @param[in]  key    the key of the KV pair.
 * @param[in]  value  the value of the KV pair.
 * @param[in]  len    the length of the value.
 * @param[in]  sync   save the KV pair to flash right now (should always be 1).
 *
 * @return  0 on success, negative error on failure.
 */
int aos_kv_set(const char *key, const void *value, int len, int sync);

/**
 * Get the KV pair's value stored in buffer by its key.
 *
 * @note: the buffer_len should be larger than the real length of the value,
 *        otherwise buffer would be NULL.
 *
 * @param[in]      key         the key of the KV pair to get.
 * @param[out]     buffer      the memory to store the value.
 * @param[in-out]  buffer_len  in: the length of the input buffer.
 *                             out: the real length of the value.
 *
 * @return  0 on success, negative error on failure.
 */
int aos_kv_get(const char *key, void *buffer, int *buffer_len);

/**
 * Delete the KV pair by its key.
 *
 * @param[in]  key  the key of the KV pair to delete.
 *
 * @return  0 on success, negative error on failure.
 */
int aos_kv_del(const char *key);

/**
 - Delete the KV pair by its prefix.
 -  * @param[in]  prefix  the prefix of the kv pair which is need to delete.
 -  * @return  0 on success, negative error on failure.
 */
int aos_kv_del_by_prefix(const char *prefix);

注意事项:

  • 开发者需要实现相关flash hal层接口;
  • 开发者需通过在Makefile中声明组件依赖关系$(NAME)_COMPONENTS += modules.fs.kv;
  • 开发者需通过CONFIG_AOS_KV_PTN宏定义指定KV组件所使用的flash分区号;
  • 若开发者所使用的flash介质的最小擦除单位大于4096 bytes,需调整KV组件内的逻辑块大小(默认为4096 bytes);
  • 开发者需通过CONFIG_AOS_KV_BUFFER_SIZE宏定义指定KV组件所使用的flash分区大小(不能小于2个kv组件的逻辑块大小,默认值为8192 bytes);
  • kv键值长度限制:
    最大键(key)长度小于255 bytes;
    最大值(value)长度可通过ITEM_MAX_VAL_LEN宏定义进行设置,预设值为512 bytes。

你可能感兴趣的:(Alios-things,Alios-things)