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

2024-06-14 14:52

本文主要是介绍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)/~、评论(▽)!

这篇关于FlashDB的TS数据库的标准ANSI C移植验证的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1060720

相关文章

Linux内核参数配置与验证详细指南

《Linux内核参数配置与验证详细指南》在Linux系统运维和性能优化中,内核参数(sysctl)的配置至关重要,本文主要来聊聊如何配置与验证这些Linux内核参数,希望对大家有一定的帮助... 目录1. 引言2. 内核参数的作用3. 如何设置内核参数3.1 临时设置(重启失效)3.2 永久设置(重启仍生效

数据库面试必备之MySQL中的乐观锁与悲观锁

《数据库面试必备之MySQL中的乐观锁与悲观锁》:本文主要介绍数据库面试必备之MySQL中乐观锁与悲观锁的相关资料,乐观锁适用于读多写少的场景,通过版本号检查避免冲突,而悲观锁适用于写多读少且对数... 目录一、引言二、乐观锁(一)原理(二)应用场景(三)示例代码三、悲观锁(一)原理(二)应用场景(三)示例

Node.js 数据库 CRUD 项目示例详解(完美解决方案)

《Node.js数据库CRUD项目示例详解(完美解决方案)》:本文主要介绍Node.js数据库CRUD项目示例详解(完美解决方案),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考... 目录项目结构1. 初始化项目2. 配置数据库连接 (config/db.js)3. 创建模型 (models/

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

Ubuntu中远程连接Mysql数据库的详细图文教程

《Ubuntu中远程连接Mysql数据库的详细图文教程》Ubuntu是一个以桌面应用为主的Linux发行版操作系统,这篇文章主要为大家详细介绍了Ubuntu中远程连接Mysql数据库的详细图文教程,有... 目录1、版本2、检查有没有mysql2.1 查询是否安装了Mysql包2.2 查看Mysql版本2.

Oracle数据库常见字段类型大全以及超详细解析

《Oracle数据库常见字段类型大全以及超详细解析》在Oracle数据库中查询特定表的字段个数通常需要使用SQL语句来完成,:本文主要介绍Oracle数据库常见字段类型大全以及超详细解析,文中通过... 目录前言一、字符类型(Character)1、CHAR:定长字符数据类型2、VARCHAR2:变长字符数

Win11安装PostgreSQL数据库的两种方式详细步骤

《Win11安装PostgreSQL数据库的两种方式详细步骤》PostgreSQL是备受业界青睐的关系型数据库,尤其是在地理空间和移动领域,:本文主要介绍Win11安装PostgreSQL数据库的... 目录一、exe文件安装 (推荐)下载安装包1. 选择操作系统2. 跳转到EDB(PostgreSQL 的

Go标准库常见错误分析和解决办法

《Go标准库常见错误分析和解决办法》Go语言的标准库为开发者提供了丰富且高效的工具,涵盖了从网络编程到文件操作等各个方面,然而,标准库虽好,使用不当却可能适得其反,正所谓工欲善其事,必先利其器,本文将... 目录1. 使用了错误的time.Duration2. time.After导致的内存泄漏3. jsO

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处