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

news2024/12/22 18:21:02

本文目录

  • 1、引言
  • 2、环境准备
  • 3、修改驱动
  • 4、验证


文章对应视频教程:

暂无,可以关注我的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数据库能运行在内存中,用于验证。

/*
 * 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

#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

#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

#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)/~、评论(▽)!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1821947.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DSP教学实验箱_数字图像处理_操作教程:5-1 图像旋转

一、实验目的 学习图像旋转的原理&#xff0c;掌握图像的读取方法&#xff0c;并实现图像旋转。 二、实验原理 图像旋转 图像的旋转是指以图像的某一点为原点以逆时针或顺时针旋转一定的角度。其本质是以图像的中心为原点&#xff0c;将图像上的所有像素都旋转一个相同的角…

Axure中继器交互效果

部件库预览链接&#xff1a; https://ezd11a.axshare.com&#xff08;请与班主任联系获取原型文档&#xff09; 支持版本: Axrure RP 8 文件大小: 109KB 文档内容介绍 “翻页”效果 “排序”效果 “全反选”效果 “筛选”效果 “删除”效果 免费领取资料 添加班主任回复 “…

ctfshow-web入门-命令执行(web43-web52)关于黑洞“ >/dev/null 2>1“的处理与绕过

目录 1、web43 2、web44 3、web45 4、web46 5、web47 6、web48 7、web49 8、web50 9、web51 10、web52 1、web43 在上一题 ‘黑洞’ 的基础上新增过滤&#xff1a; preg_match("/\;|cat/i", $c) 问题不大&#xff0c;我们不用分号和 cat 就行&#xff1a;…

Postman接口测试工具详解(高清图例)

一、引言 1. 介绍接口测试的重要性 在当今软件开发领域&#xff0c;接口&#xff08;API&#xff09;已成为不同系统、服务或组件之间交互的桥梁。随着微服务架构的普及&#xff0c;接口的重要性日益凸显。然而&#xff0c;接口的复杂性和多样性也带来了诸多挑战&#xff0c;其…

数据结构笔记补充问题

1、假设线性表L采用单链表存储结构&#xff0c;设计一个算法&#xff0c;在L的数据元素最大值之前插入&#xff08;假设L的各个数据元素值不同&#xff09;数据元素x。 基本思想&#xff0c;先查找到最大元素对应的结点&#xff0c;再在之前插入x对应的结点&#xff1b; 设计算…

我的创作纪念日(1825天)

Ⅰ、机缘 1. 记得是大一、大二的时候就听学校的大牛说&#xff0c;可以通过写 CSDN 博客&#xff0c;来提升自己的代码和逻辑能力&#xff0c;虽然即将到了写作的第六个年头&#xff0c;但感觉这句话依旧受用; 2、今年一整年的创作都没有停止&#xff0c;本年度几乎是每周都来…

DTU为何应用如此广泛?

1.DTU是什么 DTU(数据传输单元)是一种无线终端设备&#xff0c;它的核心功能是将串口数据转换为IP数据或将IP数据转换为串口数据&#xff0c;并通过无线通信网络进行传送。DTU通常内置GPRS模块&#xff0c;能够实现远程数据的实时传输&#xff0c;广泛应用于工业自动化、远程监…

抓包工具 Wireshark 的下载、安装、使用、快捷键

目录 一、什么是Wireshark&#xff1f;二、Wireshark下载三、Wireshark安装四、Wireshark使用4.1 基本使用4.2 过滤设置1&#xff09;捕获过滤器2&#xff09;显示过滤器 4.3 过滤规则1&#xff09;捕获过滤器-规则语法2&#xff09;显示过滤器-规则语法 4.4 常用的显示过滤器规…

纵深发力 持续推进,富格林平台发展势头喜人

自2024年2月1日正式上线以来,富格林互联网投融资平台已迅速崛起,吸引了业内专家学者的高度认可以及广大投资者的青睐。平台规模持续扩大,目前累计注册用户已超过10万人,总投资额突破50亿美元。这一卓越表现不仅体现了平台的稳健运营和出色的投资项目,也展示了其在互联网投融资领…

探索Napier:Kotlin Multiplatform的日志记录库

探索Napier&#xff1a;Kotlin Multiplatform的日志记录库 在现代软件开发中&#xff0c;日志记录是不可或缺的部分&#xff0c;它帮助开发者追踪应用的行为和调试问题。对于Kotlin Multiplatform项目而言&#xff0c;能够在多个平台上统一日志记录的方法显得尤为重要。Napier…

在IDEA中连接数据库

1.点击侧边栏的Database 2.选中你要连接的数据库类型 3.输入用户名、密码&#xff0c;测试连接&#xff0c;没有驱动的话先下载下驱动 4.发现没有数据库&#xff0c;点击1 of 14&#xff0c;选择All schemas&#xff0c;即可显示全部数据库 5.执行sql 如果对您有帮助的话记…

【通义灵码-你的智能编程助手】

通义灵码是由阿里云推出的智能编码辅助工具&#xff0c;基于通义大模型&#xff0c;旨在提高开发者的编码效率和流畅度。它具备以下功能&#xff1a; 「通义灵码&#xff0c;助力你高效 AI 编码」 点击前往使用 行级/函数级实时续写&#xff1a;在编码过程中&#xff0c;根据…

k8s 自动伸缩机制-------HPA 超详细解读

目录 在K8s中扩缩容分为两种&#xff1a; 前言 弹性伸缩是根据用户的业务需求和策略&#xff0c;自动“调整”其“弹性资源”的管理服务。通过弹性伸缩功能&#xff0c;用户可设置对定时、周期或监控策略&#xff0c;恰到好处地增加或减少“弹性资源”&#xff0c;并完成实例…

【ASE】笔记总结

这里写自定义目录标题 ASE 介绍ASE 的安装文件格式的转化命令行操作图形界面操作Python代码操作[2]支持的文件转化格式 ASE&#xff08;三&#xff09;&#xff1a;图形界面查看/建立/修改结构图形界面召唤查看结构 python代码查看/建立结构读写、查看结构建立结构分子 周期性体…

软件测试分类介绍

大家好&#xff0c;软件测试是确保软件质量的关键环节之一&#xff0c;通过对软件系统的各个方面进行测试&#xff0c;可以发现和解决潜在的问题&#xff0c;提高软件的稳定性、可靠性和用户满意度。在软件测试领域&#xff0c;根据测试的目的、方法和对象的不同&#xff0c;可…

Linux常⽤服务器构建-ssh和scp

目录 1.ssh <1>ssh介绍 <2>安装ssh A.安装ssh服务器 B.远程登陆 <3>使⽤ssh连接服务器 2.scp 本地⽂件复制到远程&#xff1a; 本地⽬录复制到远程&#xff1a; 远程⽂件复制到本地&#xff1a; 远程⽬录复制到本地&#xff1a; 1.ssh <1>…

VMware ESXi 8.0U2c macOS Unlocker OEM BIOS ConnectX-3 网卡定制版 (集成驱动版)

VMware ESXi 8.0U2c macOS Unlocker & OEM BIOS ConnectX-3 网卡定制版 (集成驱动版) 发布 ESXi 8.0U2 集成驱动版&#xff0c;在个人电脑上运行企业级工作负载 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-esxi-8-u2-sysin/&#xff0c;查看最新版。原创作…

ubuntu gitlab 部署 私有git库

我的版本 ubuntu-22.04.2-live-server-amd64 GitLab 社区版 v17.0.1 注意剩余硬盘需要3GB以上 一、更新软件 sudo apt update二、gitLab 需要一些依赖项才能正常运行 sudo apt install -y curl openssh-server ca-certificates postfix1、出现邮件 选择 “Internet Site”并…

农业领域科技查新点提炼方法附案例!

农业学科是人类通过改造和利用生物有机体(植物、动物、微生物等)及各种自然资源(光、热、水、土壤等)生产出人类需求的农产品的过程&#xff0c;人类在这一过程中所积累的科学原理、技术、工艺和技能&#xff0c;统称为农业科学技术&#xff0c;该领域具有研究范围广、综合性强…

el-date-picker 有效时间精确到时分秒 且给有效时间添加标记

el-date-picker实现有效日期做标记且时分秒限制选择范围 代码如下&#xff1a; // html部分 <el-date-pickerv-model"dateTime"type"datetime":picker-options"pickerOptions" > </el-date-picker>// js部分 /*** 回放有效日期开始时…