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

相关文章

SQL server数据库如何下载和安装

《SQLserver数据库如何下载和安装》本文指导如何下载安装SQLServer2022评估版及SSMS工具,涵盖安装配置、连接字符串设置、C#连接数据库方法和安全注意事项,如混合验证、参数化查... 目录第一步:打开官网下载对应文件第二步:程序安装配置第三部:安装工具SQL Server Manageme

C#连接SQL server数据库命令的基本步骤

《C#连接SQLserver数据库命令的基本步骤》文章讲解了连接SQLServer数据库的步骤,包括引入命名空间、构建连接字符串、使用SqlConnection和SqlCommand执行SQL操作,... 目录建议配合使用:如何下载和安装SQL server数据库-CSDN博客1. 引入必要的命名空间2.

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys

MySQL数据库中ENUM的用法是什么详解

《MySQL数据库中ENUM的用法是什么详解》ENUM是一个字符串对象,用于指定一组预定义的值,并可在创建表时使用,下面:本文主要介绍MySQL数据库中ENUM的用法是什么的相关资料,文中通过代码... 目录mysql 中 ENUM 的用法一、ENUM 的定义与语法二、ENUM 的特点三、ENUM 的用法1

Spring Security中用户名和密码的验证完整流程

《SpringSecurity中用户名和密码的验证完整流程》本文给大家介绍SpringSecurity中用户名和密码的验证完整流程,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定... 首先创建了一个UsernamePasswordAuthenticationTChina编程oken对象,这是S

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

嵌入式数据库SQLite 3配置使用讲解

《嵌入式数据库SQLite3配置使用讲解》本文强调嵌入式项目中SQLite3数据库的重要性,因其零配置、轻量级、跨平台及事务处理特性,可保障数据溯源与责任明确,详细讲解安装配置、基础语法及SQLit... 目录0、惨痛教训1、SQLite3环境配置(1)、下载安装SQLite库(2)、解压下载的文件(3)、

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN

MySQL追踪数据库表更新操作来源的全面指南

《MySQL追踪数据库表更新操作来源的全面指南》本文将以一个具体问题为例,如何监测哪个IP来源对数据库表statistics_test进行了UPDATE操作,文内探讨了多种方法,并提供了详细的代码... 目录引言1. 为什么需要监控数据库更新操作2. 方法1:启用数据库审计日志(1)mysql/mariad