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

本文目录

  • 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"
#endifstatic 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.mzph.cn/web/26869.shtml

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

相关文章

非计算机专业可以考“软考”吗?

全国计算机软件水平考试对报名条件没有学历、资历、年龄以及专业等限制&#xff0c;非计算机专业的人员也可以报考。证书长期有效&#xff0c;考生可根据个人需求选择合适的级别和资格进行报考。报名方式包括网上报名和考生本人到指定地点报名两种。 考试范围 (1) 高级资格包括…

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

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

数据库什么情况使用索引(附MYSQL示例)

数据库什么情况使用索引 1. 提高查询性能频繁查询的列排序操作聚集操作 2. 支持快速数据查找唯一值查找范围查找 3. 联接操作外键列联接列 4. 覆盖索引5. 全文搜索6. 复合索引7. 频繁更新的列8. 空间索引9. 哈希索引 1. 提高查询性能 频繁查询的列 假设有一个用户表users&…

多模态革新:Ferret-v2在高分辨率图像理解与细粒度交互的突破

在多模态大模型&#xff08;MLLMs&#xff09;的研究中&#xff0c;如何将视觉理解能力与语言模型相结合&#xff0c;以实现更精细的区域描述和推理&#xff0c;是一个重要的研究方向。先前的工作如Ferret模型&#xff0c;通过整合区域理解能力&#xff0c;提升了模型在对话中的…

3-异常-出现 PSQLException: Connection refused的8种可能

3-异常-出现 PSQLException: Connection refused的8种可能 更多内容欢迎关注我&#xff08;持续更新中&#xff0c;欢迎Star✨&#xff09; Github&#xff1a;CodeZeng1998/Java-Developer-Work-Note 技术公众号&#xff1a;CodeZeng1998&#xff08;纯纯技术文&#xff09…

问题(05)elementui 输入框里面禁止浏览器自动填充用户名密码、弹出浏览器历史密码提示框

问题描述 el-input&#xff0c;非密码框&#xff0c;在输入时&#xff0c; 问题1&#xff1a; 浏览器自动填充用户名密码。问题2&#xff1a;右边显示浏览器历史密码提示框。 问题解决 问题1&#xff1a;使用auto-complete"new-password" <input type"te…

Rust基础学习-ModulesPackage

在Rust中&#xff0c;模块有助于将程序分割成逻辑单元&#xff0c;以提高可读性和组织性。一旦程序变得更大&#xff0c;将其拆分为多个文件或命名空间非常重要。 模块有助于构建我们的程序。模块是项目的集合&#xff1a;包括函数、结构体甚至其他模块。 Module 定义模块 在…

cleanmymacX和腾讯柠檬到底哪个好用 2024最新使用测评

CleanMyMac X和腾讯柠檬都是Mac系统清理软件&#xff0c;各有其特点和优势&#xff0c;选择哪个更好用取决于用户的具体需求和使用习惯。 经常有新关注的粉丝问&#xff0c;同样做为垃圾清理软件&#xff0c;付费CleanMyMac和免费的柠檬清理哪个更好用&#xff1f;其实&#xf…

Spark 面试题(八)

1. 简述Stage内部逻辑 &#xff1f; 在Spark中&#xff0c;一个Stage由多个Task组成&#xff0c;这些Task是并行执行的。Stage内部的逻辑主要涉及以下几个方面&#xff1a; 任务分配&#xff1a;当一个Stage开始时&#xff0c;它的所有Task被分配给集群中的不同节点执行。每个…

为什么你应该在代码中消除 “context deadline exceeded“ 错误

在 Go 语言中&#xff0c;context 包提供了一种跨 API 和进程边界传递请求作用域值、取消信号以及超时信号的方式。使用 context 可以帮助我们更好地控制 goroutine&#xff0c;避免 goroutine 泄漏等问题。 出现 “context deadline exceeded” 错误通常是因为在请求上下文中…

大数据集成平台建设方案(Word方案)

基础支撑平台主要承担系统总体架构与各个应用子系统的交互&#xff0c;第三方系统与总体架构的交互。需要满足内部业务在该平台的基础上&#xff0c;实现平台对于子系统的可扩展性。基于以上分析对基础支撑平台&#xff0c;提出了以下要求&#xff1a; 基于平台的基础架构&…

手机照片怎么恢复?10个照片恢复应用程序

如今&#xff0c;安卓智能手机为您提供了一系列出色的摄像头。其中一些有四个摄像头&#xff0c;而另一些有两个。 现在&#xff0c;智能手机摄像头的强大功能足以与单反相机竞争&#xff0c;这促使我们拍摄越来越多的照片。捕捉图片可能是一项简单的任务&#xff0c;但管理图…

为什么选择 ABBYY FineReader PDF ?

帮助用户们对PDF文件进行快速的编辑处理&#xff0c;同时也可以快速识别PDF文件里的文字内容&#xff0c;并且可以让用户们进行文本编辑&#xff0c;所以可以有效提升办公效率。 ABBYY-ABBYY Finereader 15 Win-安装包&#xff1a;https://souurl.cn/OY2L3m 高级转换功能 ABBY…

【Python】Python 2 测试网络连通性脚本

文章目录 前言1. 命令行传参2. 代码 前言 最近在只有python2的服务器上部署服务&#xff0c;不能用三方类库&#xff0c;这里出于好奇心学习下python。这里简单做个脚本&#xff0c;实现了检验网络连通性的功能&#xff08;类似于curl&#xff09;。 1. 命令行传参 使用命令…

成功塑造领军人物形象,对企业带来哪些好处?

在企业的完整形象中&#xff0c;产品、品牌、高管是最重要的组成部分。小马识途建议中小企业在成长过程中及早对高管形象进行包装&#xff0c;成功塑造企业的领军人物&#xff0c;不单单是企业高管个人的形象提升&#xff0c;对企业经营发展带来诸多益处。小马识途营销顾问简单…

ug编程怎么进入编程模式:一步步深入探索与操作指南

ug编程怎么进入编程模式&#xff1a;一步步深入探索与操作指南 UG编程&#xff0c;作为一款广泛应用于制造业的高端数控编程软件&#xff0c;其进入编程模式的过程对于初学者来说可能充满了困惑和挑战。本文将通过四个方面、五个方面、六个方面和七个方面&#xff0c;详细解析…

跨行业数据资产整合与应用:探讨如何打破数据孤岛,实现跨行业数据资产的共享与协同应用

目录 一、引言 二、跨行业数据资产整合的必要性 1、数据价值的最大化 2、促进产业创新 3、提升政府治理能力 三、跨行业数据资产整合的挑战 1、技术挑战 2、制度挑战 3、利益挑战 四、打破数据孤岛的策略与方法 1、建立统一的数据标准与规范 2、构建跨行业数据共享…

“全光无线星空”照亮津亚电子智能制造之路

随着第四次工业革命浪潮的到来,智能制造正成为制造业的新常态。工业4.0时代的工厂不再是封闭的制造孤岛,而是通过高度的数字化和网络化,实现生产过程的智能化、自动化和灵活化。在这样的大趋势下,制造业正经历着从传统制造向智能制造的深刻转型,数字化车间和智能化生产线成为推…

Ubuntu 22.04安装 docker

安装过程和指令 # 1.升级 apt sudo apt update # 2.安装docker sudo apt install docker.io docker-compose # 3.将当前用户加入 docker组 sudo usermod -aG docker ${USER} # 4. 重启 # 5. 查看镜像 docker ps -a 或者 docker images # 6. 下载镜像 docker pull hello-world …

海康充电桩报文校验TCP校验和

1 TCP校验文档校验文档要求: 校验码描述 校验码计算范围包含包头标识、消息头和消息体,校验算法采用 TCP 和校验,具体规则如下。 将待校验的所有数据分为 16 位的字(大端序),如果总长度为奇数个字节,则在最后增添一个 位都为 0 的字节; 将所有 16 位的字进行累加,累加…