2224|1

41

帖子

2

TA的资源

一粒金砂(中级)

楼主
 

[平头哥RVB2601创意应用开发] RVB2601之KV组件介绍和使用 [复制链接]

 

一、KV组件介绍

  1. KV 组件是什么

    对于物联网RTOS的产品来说,KV 组件是一个不可获取的组件。无论Alios Things、RT-Thread还是LiteOS,都有KV相关的组件库。那么 KV 组件是用来做什么的呢?

    KV 存储系统是YOC中一个以Key-Value方式进行持久化存储的轻量级组件,主要为基于nor flash的小型MCU设备提供通用的Key-Value持久化存储接口。该系统采用极小的代码及内存开销,支持断电保护、磨损均衡等功能。 KV 存储系统支持只读模式与读写模式共存,只读模式可以用于工厂生产数据,读写模式可用于运行时的数据存储

  2. KV 组件在哪里会用到

    example:

    1. 设备属性中 当前温度为21,就可以通过定义一个键值对:{“Temperture”:21}来进行存储
    2. 存储 WiFi 设备需要连接的ssid和pwd,可用于 WiFi 设备重新上电时还可以连接之前的路由器

    用户无需关心具体的值被写到哪里了,仅需要通过对键的操作即可完成数据的存取。该组件目前针对Nor flash设备。

    可以看到 官方提供的 Demo《网络播放器设计》也使用到了 KV 组件,这里通过宏定义来确认KV生效的位置

       

  3. Alios-Things的 KV 组件目录

    │   ├── kv_adapt.c# kv和flash的适配层
    │   ├── kv_aos.c# kv的aos api接口
    │   ├── kv.c# kv的核心实现代码
    │   ├── kv_cli.c# kv cli注册命令
    │   └── kv_secure.c# kv的安全存储适配层
    ├── include
    │   ├── aos
    │   │   └── kv.h# kv的对外AOS API
    │   └── kv_api.h# kv_开头的API
    ├── internal# 内部头文件
    ├── package.yaml# 编译配置文件
    └── example
        └── kv_example.c# kv示例代码
    
  4. KV 组件的 API

    函数 说明
    aos_kv_init KV初始化
    aos_kv_flash_init KV初始化FLASH
    aos_kv_reset KV复位
    aos_kv_set KV项设置
    aos_kv_setfloat 设置浮点数类型的KV项
    aos_kv_setint 设置整数类型的KV项
    aos_kv_get 获取KV项
    aos_kv_getfloat 获取浮点数类型的KV项
    aos_kv_getint 获取整数类型的KV项
    aos_kv_setstring 设置字符串类型的KV项
    aos_kv_getstring 获取字符串类型的KV项
    aos_kv_del 删除KV项

二、KV组件移植:基于helloworld demo

  1. 头文件包含

       

  2. 硬件初始化

    1. 从 int parttion_init(void) 中初始化了flash,调用的 void *partition_flash_open(int id) 是在 库文件”parttion“下

       

    2. 然后调用了HAL 层的flash操作 hal_csi 里面的API,例如 int32_t hal_flash_info_get(hal_partition_t in_partition, hal_logic_partition_t *partition)

       

  3. 建立 KV 测试代码

    static void kv_comp_example(void)
    {
        char *key = "test_kv_key";
        char *set_value = "test_kv_value";
        int  set_len = strlen(set_value);
        char get_value[32] = {0};
        int  get_len = 32;
        int  ret = -1;
    
        ret = aos_kv_set(key, set_value, set_len, 1);
        if(ret){
            LOGD(TAG, "kv comp test fail! aos_kv_set ret:%d\r\n", ret);
            return;
        }else{
    		LOGD(TAG, "aos_kv_set key:%s\r\n", key);
    	}
    
        ret = aos_kv_get(key, get_value, &get_len);
        if(ret){
            LOGD(TAG, "kv comp test fail! aos_kv_get ret:%d\r\n", ret);
            return;
        }else{
    		LOGD(TAG, "aos_kv_get key_value:%s key_len:%d\r\n",get_value, get_len);
    	}
    
        if(get_len != set_len){
            LOGD(TAG, "kv comp test fail! get_len != set_len, get_len:%d\r\n", get_len);
            return;
        }
    
        if(strcmp(get_value, set_value)){
            LOGD(TAG, "kv comp test fail! get value not right! get_value:%s\r\n", get_value);
            return;
        }
    
        LOGD(TAG, "kv comp test success!\r\n");
        return;
    }
  4. main函数里调用,或调用cli使用

    int main(void)
    {
        board_yoc_init();
        LOGD(TAG, "%s\n", aos_get_app_version());
        oled_init();
        aos_kv_init("kv");// 初始化 KV 组件
        kv_comp_example();// 函数测试 KV 函数
        while (1) {
            LOGD(TAG, "Hello world! YoC");
            aos_msleep(1000);
        }
    
        return 0;
    }
  5. 调试、日志打印

     

三、感想

  1. 想做查询天气的,但因为时间关系,就先输出 KV 了,对于物联网的设备使用 KV 库是个很基本的操作,也很有必要。RVB2601刚好在YoC移植了 Alios-Things的内核和一些组件库,所以有了这篇文章,希望大家可以很好的来使用~

最新回复

感谢楼主的分享,让我们学习到KV库的使用,希望在这里普及更多的知识。非常感谢!   详情 回复 发表于 2022-3-22 10:42
点赞(1) 关注
 
 

回复
举报

6960

帖子

11

TA的资源

版主

沙发
 

感谢楼主的分享,让我们学习到KV库的使用,希望在这里普及更多的知识。非常感谢!

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表