基于Openharmony轻量级操作系统的分布式数据管理开发案例 原创

福州市凌睿智捷电子有限公司
发布于 2024-8-6 13:41
浏览
0收藏

实验内容

本例程演示如何在小凌派-RK2206开发板上使用OpenHarmony轻量级操作系统进行KvStore(即分布式数据管理)数据读写。

例程:

(1)创建两个线程,一个负责写入KvStore存储,一个负责读取KvStore存储;

(2)每1秒进行1次读写操作;

程序设计

在本章节中,我们将了解OpenHarmony KvStore存储接口,如文件如何获取数据、设置数据、删除数据和清除缓存。

API分析

头文件

//utils/native/lite/include/kv_store.h

UtilsGetValue()

int UtilsGetValue(const char* key, char* value, unsigned int len);

描述:

从文件系统或缓存中获取与指定键匹配的值。

参数:

名字 描述
key 键值
value 获取数据
len 数据长度

返回值:

返回值 描述
0 成功
其它 见utils/native/lite/include/ohos_errno.h

UtilsSetValue()

int UtilsSetValue(const char* key, const char* value);

描述:

添加或更新与文件系统或缓存中的指定键匹配的值。

参数:

名字 描述
key 键值
value 写入数据

返回值:

返回值 描述
0 成功
其它 见utils/native/lite/include/ohos_errno.h

UtilsDeleteValue()

int UtilsDeleteValue(const char* key);

描述:

从文件系统或缓存中删除与指定键匹配的值。

参数:

名字 描述
key 键值

描述:

从缓存中清除所有键值对。

返回值:

返回值 描述
0 成功
其它 见utils/native/lite/include/ohos_errno.h

软件设计

主要代码分析

在kv_store_example函数中通过LOS_TaskCreate函数创建两个线程:kv_store_write_thread、kv_store_read_thread。

void kv_store_example()
{
    unsigned int thread_id1;
    unsigned int thread_id2;
    TSK_INIT_PARAM_S task1 = {0};
    TSK_INIT_PARAM_S task2 = {0};
    unsigned int ret = LOS_OK;

    task1.pfnTaskEntry = (TSK_ENTRY_FUNC)kv_store_write_thread;
    task1.uwStackSize = 1024 * 10;
    task1.pcName = "kv_store_write_thread";
    task1.usTaskPrio = 25;
    ret = LOS_TaskCreate(&thread_id1, &task1);
    if (ret != LOS_OK)
    {
        printf("Falied to create kv_store_write_thread ret:0x%x\n", ret);
        return;
    }

    task2.pfnTaskEntry = (TSK_ENTRY_FUNC)kv_store_read_thread;
    task2.uwStackSize = 1024 * 10;
    task2.pcName = "kv_store_read_thread";
    task2.usTaskPrio = 25;
    ret = LOS_TaskCreate(&thread_id2, &task2);
    if (ret != LOS_OK)
    {
        printf("Falied to create kv_store_read_thread ret:0x%x\n", ret);
        return;
    }
}

APP_FEATURE_INIT(kv_store_example);

kv_store_write_thread线程负责创建/更新KV存储,每1秒写入一段内容,重复以上流程。

void kv_store_write_thread()
{
    int ret = 0;
    char defValue[50] = {0};
    int current = 0;

    while (1)
    {
        snprintf(defValue, sizeof(defValue), "test value %d.", current);
        int ret = UtilsSetValue(key, defValue);
        if (ret < 0)
        {
            printf("[error] %d\r\n", ret);
        }
        else
        {
            printf("[write] write success\r\n");
        }

        current++;
        LOS_Msleep(1000);
    }
}

kv_store_read_thread线程负责读取KV存储,每1秒读取一段内容,重复以上流程。

void kv_store_read_thread()
{
    int ret = 0;
    char value1[50] = {0};

    while (1)
    {
        ret = UtilsGetValue(key, value1, sizeof(value1));
        if (ret < 0)
        {
            printf("[error] %d\r\n", ret);
        }
        else
        {
            printf("[read] key: %s value:%s\r\n", key, value1);
        }

        LOS_Msleep(1000);
    }
}

编译调试

修改 BUILD.gn 文件

修改 vendor/lockzhiner/rk2206/sample 路径下 BUILD.gn 文件,指定 a10_kv_store 参与编译。

"./a10_kv_store:kv_store_example",

修改 device/rockchip/rk2206/sdk_liteos 路径下 Makefile 文件,添加 -lkv_store_example 参与编译。

app_LIBS = -lkv_store_example

运行结果

示例代码编译烧录代码后,按下开发板的RESET按键,通过串口助手查看日志。

HalFileInit: Flash Init Successful!
[write] write success
[read] key: key_sample value:test value 0.
[write] write success
[read] key: key_sample value:test value 1.
[write] write success
[read] key: key_sample value:test value 2.
[write] write success
[read] key: key_sample value:test value 3.

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
1
收藏
回复
举报
回复
    相关推荐