RT-Thread Studio学习笔记之部署FlashDB——基于片外flash及FAL

前言

FlashDB 是一款超轻量级的嵌入式数据库。它结合了 Flash 的特性,具有较强的性能及可靠性。

FlashDB提供了键值数据库和时序数据库两种数据库模式,不仅资源占用极低,内存占用几乎为 0,而且存储容量大,非常适合用于物联网产品。

移植

根据 FlashDB开发文档,FlashDB 底层的 Flash 管理及操作依赖于 RT-Thread 的 FAL (Flash Abstraction Layer) Flash 抽象层开源软件包,所以将所用到的 Flash 对接到 FAL ,即可完成整个移植工作。

FlashDB移植的关键是FAL的移植。本文在片外flash上搭建FAL,并移植FlashDB。

下面我们就开始实际操作,从将flash挂载到spi总线上开始,最终完成FlashDB数据库的搭建。新手可以跟着一步一步做,有一些开发经验的朋友可以选择性地阅读。

1.开启SPI总线

新建一个空白的RT-Thread项目,本文基于STM32F103芯片。
首先在drivers目录下打开board.h文件,找到SPI对应部分。根据指导,一步一步做下去。在这里插入图片描述

操作步骤

step1:打开RT-Thread Settings,点击更多配置来到组件一栏,勾选如下。在这里插入图片描述

step2:board.h文件中,打开SPI宏定义。
在这里插入图片描述
step3:使用stm32cubemx产生初始化函数,将其粘贴于board.c文件末尾。
在这里插入图片描述
然后选择芯片型号——>填写项目名称,双击IOC文件后如图操作。
在这里插入图片描述
复制初始化函数到board.c文件。(ps:初始化函数在哪个文件中,名字叫什么,在board.h文件对应部分都是可以找到的哦)

在这里插入图片描述
step4:在drivers目录下的stm32f1xx_hal_conf.h文件中打开SPI驱动。
在这里插入图片描述

验证

配置完成,让我们编译下载一下,看看有没有成功。
在这里插入图片描述
使用list_device指令查看设备,可以看到SPI总线已经存在了。

2.挂载片外flash

接下来,我们将片外flash(W25Q128)挂到SPI总线上。

代码

此处,参考RT-Thread官方开发文档,在application目录下,新增flash.c文件。

#include <rtthread.h>
#include <board.h>
#include <rtdevice.h>
#include "drv_spi.h"
#include "spi_flash.h"
#include "spi_flash_sfud.h"

#define DBG_TAG "flash"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>

#define W25Q_SPI_BUS_NAME        "spi1"    /* 上一步骤 打开的是SPI1,这里也写1,一定要对应*/
#define W25Q_SPI_DEVICE_NAME     "spi10"   /* SPI1总线上0号设备*/

/*原理见官方文档*/
static int rt_hw_spi_flash_init(void)
{
    rt_hw_spi_device_attach(W25Q_SPI_BUS_NAME, W25Q_SPI_DEVICE_NAME, GPIOA, GPIO_PIN_4);
//这提醒我们,一定要从原理图上看清楚自己的flash名
    if (RT_NULL == rt_sfud_flash_probe("W25Q128", W25Q_SPI_DEVICE_NAME))
    {
        return -RT_ERROR;
    };

    return RT_EOK;
}

/* 导出到自动初始化 */
INIT_COMPONENT_EXPORT(rt_hw_spi_flash_init);

验证

在这里插入图片描述
经过验证,flash已经挂载成功了,下面开始搭建FAL。

3.搭建FAL抽象层

FAL是RT-Thread的一个软件包,主要是用于Flash 抽象层的实现,负责管理 Flash 设备和 Flash 分区。关于FAL的详细功能,大家可以参考RT-Thread软件包友情链接。文档非常详细,这里也参考了文档中的内容。

3.1添加FAL

打开RT-Thread Settings点击立即添加,然后搜索FAL。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.2配置FAL

在这里插入图片描述
因为我们只用到了片外flash,所以可以将fal_cfg.h中关于片外flash的部分删除,并且定义自己的分区表。
最终修改fal_cfg.h文件如下:

#ifndef _FAL_CFG_H_
#define _FAL_CFG_H_

#include <rtconfig.h>
#include <board.h>

#define NOR_FLASH_DEV_NAME             "W25Q128"    /*一定要改为自己的flash名称*/

/* ===================== Flash device Configuration ========================= */
extern struct fal_flash_dev nor_flash0;

/* flash device table(定义设备表,我删掉了片上flash) */
#define FAL_FLASH_DEV_TABLE                                          \
{                                                                    \
    &nor_flash0,                                                     \
}
/* ====================== Partition Configuration ========================== */
#ifdef FAL_PART_HAS_TABLE_CFG
/* partition table ps:可根据需要自行分区*/ 
#define FAL_PART_TABLE                                                               \
{                                                                                   \
    {FAL_PART_MAGIC_WORD, "easyflash", NOR_FLASH_DEV_NAME,         0, 1024*1024, 0}, \
    {FAL_PART_MAGIC_WORD,  "download", NOR_FLASH_DEV_NAME, 1024*1024, 1024*1024, 0}, \
}
#endif /* FAL_PART_HAS_TABLE_CFG */

#endif /* _FAL_CFG_H_ */

其实我并没有做太大改动,只是删掉了片上flash相关部分,大家可以根据需要自行分区、命名。
当出现错误时,建议仔细阅读FlashDB开发文档当中的注意事项,讲得非常详细。

3.3初始化FAL

main.c文件中,包含fal.h并调用fal_init()初始化程序。
在这里插入图片描述

3.4验证

做到这里已经比较累了,我们来编译下载,感受一下成功的喜悦。
在这里插入图片描述

4.移植FlashDB

FlashDB官方有在F103上运行的demo,也为键值数据库、时序数据库提供了相应的示例,这里我们通过运行kvdb基础示例(位于samples/kvdb_basic_sample.c)来验证是否移植成功。

4.1添加flashDB软件包

添加方法同FAL包,这里不复述了。添加后右击flashdb,选择详细配置,勾选如下:
在这里插入图片描述

4.2配置FlashDB

packages——>FlashDB——>inc目录下通过 fdb_cfg.h 对其进行功能配置,这里参考官方demo,修改 fdb_cfg.h 文件如下:

#ifndef _FDB_CFG_H_
#define _FDB_CFG_H_

/* using KVDB feature */
#define FDB_USING_KVDB

#ifdef FDB_USING_KVDB
/* Auto update KV to latest default when current KVDB version number is changed. @see fdb_kvdb.ver_num */
/* #define FDB_KV_AUTO_UPDATE */
#endif

/* using TSDB (Time series database) feature */
#define FDB_USING_TSDB

/* the flash write granularity, unit: bit
 * only support 1(nor flash)/ 8(stm32f2/f4)/ 32(stm32f1) */
//#define FDB_WRITE_GRAN                /* @note you must define it for a value */
//注意,上一步我们已经勾选了,这里不要重复配置

/* MCU Endian Configuration, default is Little Endian Order. */
/* #define FDB_BIG_ENDIAN  */ 

/* log print macro. default EF_PRINT macro is printf() */
/* #define FDB_PRINT(...)              my_printf(__VA_ARGS__) */

/* print debug information */
#define FDB_DEBUG_ENABLE

#endif /* _FDB_CFG_H_ */

//以上所有来源于官方demo

4.3验证

配置好之后,我们通过调用官方例程来验证是否移植成功。
KVDB基础示例代码位于 samples/kvdb_basic_sample.c ,在 main.c 有定义默认的 KV 集合表,在里面有 boot_count KV。通过该 KV 来记录当前系统的启动次数。每次掉电再启动时,该 KV 会自动加一,并保存至 KVDB 中。
简言之就是,能存储、更新启动次数。

step1:在application目录下,新增flashdb.c文件,代码如下:

#include <stdio.h>
#include <board.h>
#include <flashdb.h>
#include <stm32f1xx_hal.h>

#define FDB_LOG_TAG "flashdb"
static uint32_t boot_count = 0;
struct fdb_kvdb _global_kvdb = {0};
struct fdb_tsdb _global_tsdb = {0};

extern void kvdb_basic_sample(fdb_kvdb_t kvdb);

static struct fdb_default_kv_node default_kv_table[] = {{"boot_count", &boot_count, sizeof(boot_count)}}; /* int type KV */

static int flashdb(void)
{
    fdb_err_t result;
    struct fdb_default_kv default_kv;
    default_kv.kvs = default_kv_table;
    default_kv.num = sizeof(default_kv_table) / sizeof(default_kv_table[0]);
    result = fdb_kvdb_init(&_global_kvdb, "env", "download", &default_kv, NULL);
    //init函数的第三个参数,是用于存储数据的fal分区,大家根据自己的情况选择

    if (result != FDB_NO_ERR)
    {
        return -1;
    }
    else
    {
        kvdb_basic_sample(&_global_kvdb);
    }
    return RT_EOK;
}
INIT_ENV_EXPORT(flashdb);

step2:开启libc,我也不知道为何,不开就会报莫名其妙错误,暂时先不深究。
在这里插入图片描述
step3:编译下载
在这里插入图片描述
下载后可以看到,已经成功读取、设置启动次数(如果大家是第一次下载,则启动次数会设置为1)。按下复位键,可以看到次数加一。
在这里插入图片描述

总结

这篇文章着重介绍操作,几乎不涉及原理的讲解,所以一些理论知识还需要大家仔细阅读官方文档。我也是初学这些知识,水平有限,若有错误,还望大家批评指正。

### 回答1: FlashDB STM(Structured Transactional Memory)是一种基于闪存的结构化事务内存技术。事务内存是一种并发控制机制,用于管理并发程序访问和修改共享数据的方式。闪存是一种高速非易失性存储介质,具有较高的读取和写入速度,以及数据持久存储的特性。 FlashDB STM利用闪存的快速读写速度和持久性,为并发程序提供了更好的性能和可靠性。与传统的基于内存的事务内存技术相比,FlashDB STM能够将事务数据持久存储在闪存中,避免了由于服务器故障或断电等原因而导致的数据丢失。此外,FlashDB STM还能够通过闪存的并行读写能力,提高并发程序的处理速度。 FlashDB STM还提供了一套丰富的API接口,方便开发人员使用和管理事务。开发人员可以通过简单的函数调用实现事务的开始、提交或回滚操作,并且可以根据需要进行锁定和解锁等操作。这些功能使得并发程序的开发和管理更加简单和灵活。同时,FlashDB STM还提供了基于日志的恢复机制,保证了数据的一致性和完整性。 总之,FlashDB STM技术通过利用闪存的快速读写和持久性特性,为并发程序提供了高性能和可靠性的解决方案。它是一种创新的事务内存技术,适用于需要高并发和大规模数据处理的场景。随着闪存技术的不断发展和成熟,FlashDB STM有望在未来的数据存储和处理领域发挥更重要的作用。 ### 回答2: FlashDB STM 是一种基于闪存存储的事务性内存数据库。它是由研究人员开发的,旨在解决传统内存数据库在大规模数据写入时的性能瓶颈问题。 FlashDB STM 利用了闪存存储器的高速读取和持久性特性,并结合了事务性内存的思想,为应用程序提供了高效的读写操作。与传统的内存数据库相比,FlashDB STM 具有更高的容量和更快的存储速度,同时也具备了数据持久性,可在系统崩溃或断电时保证数据的完整性。 FlashDB STM 的设计基于一种称为STM(Software Transactional Memory)的技术。STM 在多线程并发访问下保证了数据的一致性,并通过将所有修改操作封装在事务中,确保了数据的完整性和可靠性。当多个事务同时修改相同的数据时,STM 会使用冲突检测和冲突解决机制来避免数据的丢失或不一致。 FlashDB STM 的应用场景非常广泛。它可以用于高并发读写的应用程序,如电子商务网站、金融交易系统等。通过提供快速的数据读写操作和数据持久性,FlashDB STM 可以极大地提升应用程序的性能和稳定性。 总之,FlashDB STM 是一种基于闪存存储的事务性内存数据库,它利用了闪存存储器的高速读写和持久性特性,通过 STM 技术保证数据的一致性,适用于高并发读写的应用场景,可以提升应用程序的性能和稳定性。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值