FlashDB的TS数据库的标准ANSI C移植验证

本文目录


文章对应视频教程:

暂无,可以关注我的B站账号等待更新。


点击图片或链接访问我的B站主页~~~


1、引言

在当今数据驱动的时代,高效可靠的数据存储与管理对于嵌入式系统及物联网(IoT)应用至关重要。FlashDB数据库以其轻量级、高性能和低功耗的特性,在资源有限的嵌入式环境中脱颖而出。

由于最近需要在项目上进行日志存储,所以选择FlashDB的ts数据进行日志存储。

今天在标准ANSI C环境中进行验证。


2、环境准备

首先在下载FlashDB下载源码 FlashDB开源分支

选择2.1标签进行下载,下载后解压。

老规矩,创建一个cmake+kconfig的工程(看我往期的帖子)。

将FlashDB的代码已到工程中,具体的文件分布如下图:


3、修改驱动

FlashDB依赖的是flash的FAL层接口,我们需要修改source\flashDB\fal\fal_flash_port.c文件,完善驱动接口,让FlashDB数据库能运行在内存中,用于验证。

c 复制代码
/*
 * Copyright (c) 2006-2018, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2018-01-26     armink       the first version
 */

#include <fal.h>

// #ifdef FAL_USING_SFUD_PORT
// #ifdef RT_USING_SFUD
// #include <spi_flash_sfud.h>
// #endif

#ifndef FAL_USING_NOR_FLASH_DEV_NAME
#define FAL_USING_NOR_FLASH_DEV_NAME             "norflash0"
#endif

static int init(void);
static int read(long offset, uint8_t *buf, size_t size);
static int write(long offset, const uint8_t *buf, size_t size);
static int erase(long offset, size_t size);

char fbuff[1 * 1024 * 1024] = {0};

struct fal_flash_dev nor_flash0 =
{
    .name       = FAL_USING_NOR_FLASH_DEV_NAME,
    .addr       = 0,
    .len        = 1 * 1024 * 1024,
    .blk_size   = 512,
    .ops        = {init, read, write, erase},
    .write_gran = 1
};

static int init(void)
{
    // memset(fbuff, 0, sizeof(fbuff));
    return 0;
}

static int read(long offset, uint8_t *buf, size_t size)
{
    memcpy(buf,(char *)(fbuff + offset), size);
    return size;
}

static int write(long offset, const uint8_t *buf, size_t size)
{
    memcpy((char *)(fbuff + offset), buf, size);
    return size;
}

static int erase(long offset, size_t size)
{
    memset(fbuff+offset, 0xff, size);
    return size;
}

在工程目录下创建三个文件:
project\flash_pro\main.c
project\flash_pro\userApi.c
project\flash_pro\userApi.h

这三个文件实现了对FlashDB中ts数据的在我应用中的使用场景模拟。

project\flash_pro\main.c

c 复制代码
#include "stdio.h"
#include "userApi.h"
#include "flashdb.h"


fdb_time_t get_time(void)
{
    return 0;
}
extern char fbuff[1 * 1024 * 1024];
int main(int argc, char const *argv[])
{

    fdb_err_t ret =  fdb_tsdb_init(&qtsdb, "norflash0","log", get_time, 256, NULL);
    printf("fdb_tsdb_init = %d , cur_sec: %d\r\n",ret ,qtsdb.cur_sec.addr);
    char str[100] = "12313124";

    for(int i = 1;i<200;i++)
    {
        ret = saveLogDataToFlash(str, 40,i );
        printf("saveLogDataToFlash = %d \r\n",ret );
    }

    printf("-------------------------------------------------------------------\r\n");
    getLogDataByTimeFromFlash(0, 50);

    return 0;
}

project\flash_pro\userApi.c

c 复制代码
#include "userApi.h"
#include "fdb_def.h"
#include "stdint.h"

struct fdb_tsdb qtsdb;

uint32_t saveLogDataToFlash(uint8_t *buf,uint32_t size,fdb_time_t timestamp)
{
    uint32_t ret = 0u;
    struct fdb_blob blob;

    ret = fdb_tsl_append_with_ts(&qtsdb, fdb_blob_make(&blob, buf, size), timestamp);


    return ret;
}

static bool query_by_time_cb(fdb_tsl_t tsl, void *arg1, void *arg2)
{
    struct fdb_blob blob;
    fdb_tsdb_t db = arg1;
    log_record_t log = {0};

    log.len = fdb_blob_read((fdb_db_t) db, fdb_tsl_to_blob(tsl, fdb_blob_make(&blob, log.buf, 512)));
    log.timestamp = tsl->time;

    printf("len = %d, t = %d,log:%s \r\n",log.len,log.timestamp,log.buf);
    return false;
}

void getLogDataByTimeFromFlash(fdb_time_t fromTime, fdb_time_t toTime)
{
    uint32_t ret = 0u;
    struct fdb_blob blob;

    fdb_tsl_iter_by_time(&qtsdb, fromTime, toTime, query_by_time_cb, &qtsdb);
}

project\flash_pro\userApi.h

c 复制代码
#ifndef __USERAPI_H__
#define __USERAPI_H__

#include "stdint.h"
#include "fdb_def.h"
#include "flashdb.h"

typedef struct{
    uint32_t len;
    fdb_time_t timestamp;
    uint8_t buf[512];
}log_record_t;


extern struct fdb_tsdb qtsdb;
extern uint32_t saveLogDataToFlash(uint8_t *buf, uint32_t size, fdb_time_t timestamp);
extern void getLogDataByTimeFromFlash(fdb_time_t fromTime, fdb_time_t toTime);

#endif

4、验证

直接在工程路径下进行配置、构建、编译:


最后,验证程序:

FlashDB的ts数据库读写正常,验证成功。


时间流逝、年龄增长,是自己的磨炼、对知识技术的应用,还有那不变的一颗对嵌入式热爱的心!

到这里就结束了!希望大家给我的文章和B站视频
点赞o( ̄▽ ̄)d、关注(o)/~、评论(▽)!

相关推荐
档案宝档案管理2 小时前
档案宝:企业合同档案管理的“安全保险箱”与“效率加速器”
大数据·数据库·人工智能·安全·档案·档案管理
wangjialelele2 小时前
mysql库操作二
数据库·mysql
Chloeis Syntax2 小时前
MySQL初阶学习日记(1)--- 数据库的基本操作
数据库·学习·mysql
ACP广源盛139246256732 小时前
(ACP广源盛)GSV6172---MIPI/LVDS 信号转换为 Type-C/DisplayPort 1.4/HDMI 2.0 并集成嵌入式 MCU
c语言·开发语言·单片机·嵌入式硬件·音视频
workflower3 小时前
FDD(Feature Driven Development)特征驱动开发
大数据·数据库·驱动开发·需求分析·个人开发
im_AMBER3 小时前
算法笔记 09
c语言·数据结构·c++·笔记·学习·算法·排序算法
韩立学长4 小时前
基于Springboot的旧物公益捐赠管理系统3726v22v(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·后端
苦学编程的谢4 小时前
Redis_4_常见命令(完)+认识数据类型和编码方式
数据库·redis·缓存
小光学长4 小时前
基于Vue的儿童手工创意店管理系统as8celp7(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
前端·数据库·vue.js