FlashDB移植与应用

2023-05-16

FlashDB移植与应用

最近工作需要,对设备参数进行备份存储,由于之前使用的是简单的分区备份方法。Easyflash的单实例不再适用。后面发现大神基于easyflash进行了新版本更新,但是不向前兼容,新版命名为FlashDB。

简介

FlashDB 是一款超轻量级的嵌入式数据库,专注于提供嵌入式产品的数据存储方案。与传统的基于文件系统的数据库不同,FlashDB 结合了 Flash 的特性,具有较强的性能及可靠性。并在保证极低的资源占用前提下,尽可能延长 Flash 使用寿命。

FlashDB 提供两种数据库模式:

键值数据库 :是一种非关系数据库,它将数据存储为键值(Key-Value)对集合,其中键作为唯一标识符。KVDB 操作简洁,可扩展性强。
时序数据库 :时间序列数据库 (Time Series Database , 简称 TSDB),它将数据按照 时间顺序存储 。TSDB 数据具有时间戳,数据存储量大,插入及查询性能高。

这里只用到了基础的KV功能。

FlashDB和FAL介绍

移植的主要工作都在 FAL 这边,其他接口并不是强依赖,可以根据自己的情况进行对接。
FAL抽象层
FAL 底层将不同的 Flash 存储介质进行了统一封装,并提供了分区表机制,暴露给上层用户。

FlashDB 的每个数据库就是基于 FAL 提供的分区机制,每个数据库都坐落在某个 FAL 的分区上,相当于一个分区对应一个数据库。

定义 flash 设备

在定义 Flash 设备表前,需要先定义 Flash 设备。可以是片内 flash, 也可以是片外基于 SFUD 的 spi flash:

定义具体的 Flash 设备对象,用户需要根据自己的 Flash 情况分别实现 init、 read、 write、 erase 这些操作函数:
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) :擦除操作。
用户需要根据自己的 Flash 情况分别实现这些操作函数。在文件最底部定义了具体的 Flash 设备对象 ,如下示例定义了 stm32f2 片上 flash:stm32f2_onchip_flash

const struct fal_flash_dev stm32f2_onchip_flash =
{
.name = “stm32_onchip”,
.addr = 0x08000000,
.len = 10241024,
.blk_size = 128
1024,
.ops = {init, read, write, erase},
.write_gran = 8
};

8 : 设置写粒度,单位 bit, 0 表示未生效(默认值为 0 ),该成员是 fal 版本大于 0.4.0 的新增成员。各个 flash 写入粒度不尽相同,可通过该成员进行设置,以下列举几种常见 Flash 写粒度:

nor flash: 1 bit
stm32f2/f4: 8 bit
stm32f1: 32 bit
stm32l4: 64 bit

定义 flash 设备表

Flash 设备表定义在 fal_cfg.h 头文件中,定义分区表前需 新建 fal_cfg.h 文件 ,请将该文件统一放在对应 BSP 或工程目录的 port 文件夹下,并将该头文件路径加入到工程。fal_cfg.h 可以参考 示例文件 fal/samples/porting/fal_cfg.h 完成。

设备表示例:

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

/* flash device table */
#define FAL_FLASH_DEV_TABLE                                          \
{                                                                    \
    &stm32f2_onchip_flash,                                           \
    &nor_flash0,                                                     \
}

Flash 设备表中,有两个 Flash 对象,一个为 STM32F2 的片内 Flash ,一个为片外的 Nor Flash。

定义 flash 分区表

分区表也定义在 fal_cfg.h 头文件中。Flash 分区基于 Flash 设备,每个 Flash 设备又可以有 N 个分区,这些分区的集合就是分区表。在配置分区表前,务必保证已定义好 Flash 设备 及 设备表。fal_cfg.h 可以参考 示例文件 fal/samples/porting/fal_cfg.h 完成。

分区表示例:

#define NOR_FLASH_DEV_NAME             "norflash0"
/* ====================== Partition Configuration ========================== */
#ifdef FAL_PART_HAS_TABLE_CFG
/* partition table */
#define FAL_PART_TABLE                                                               \
{                                                                                    \
    {FAL_PART_MAGIC_WORD,        "bl",     "stm32_onchip",         0,   64*1024, 0}, \
    {FAL_PART_MAGIC_WORD,       "app",     "stm32_onchip",   64*1024,  704*1024, 0}, \
    {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 */

上面这个分区表详细描述信息如下:
分区名保证 不能重复;
关联的 Flash 设备 务必已经在 Flash 设备表中定义好 ,并且 名称一致 ,否则会出现无法找到 Flash 设备的错误;
分区的起始地址和大小 不能超过 Flash 设备的地址范围 ,否则会导致包初始化错误;
注意:每个分区定义时,除了填写上面介绍的参数属性外,需在前面增加 FAL_PART_MAGIC_WORD 属性,末尾增加 0 (目前用于保留功能)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FlashDB移植与应用 的相关文章

  • 信息量与交叉熵损失的关系

    目录 1 信息量 2 信息熵 3 相对熵 xff08 KL散度 xff09 4 交叉熵 xff08 cross entropy xff09 5 二值交叉熵 xff08 binary cross entropy xff09 在机器学习领域 x
  • 树莓派镜像系统—兼容3B、3B+、4B,已编译opencv

    树莓派镜像系统 xff08 转载 xff09 这个镜像是基于树莓派官方raspios buster arm64桌面版镜像制作 xff0c 内核版本为5 4 72 xff0c OpenCV版本为4 5 0 xff0c 默认开启ssh和vnc
  • python遇到的语法问题

    python什么时候加self xff0c 什么时候不加self self代表对象本身 xff0c 换个思维应该认为self是全局变量 xff0c 如果变量前面加了self xff0c 那么在任何实例方法 xff08 非staticmeth
  • python Jetson tx2和 stm32之间的通信(16进制和10进制的转换,包括负数),BCC校验(异或)运算

    tx2接收16进制数据 含16进制转化为10进制 xff0c 负数怎么表示 我发现tx2接收stm32的16进制的数据 xff0c 不能达到我想要的效果 并且16进制数还会转换成ASCLL码的字符 如下图 xff1a 通过如下操作可以获得字
  • ROS 学习记录(五)

    在运行moveit xff01 例程的时候发现没有Moveit包 xff0c 于是在网上下载 xff0c 发现普通的 sudo apt get install ros kinetic moveit 无法完成安装 会提示找不到安装包 尝试更换
  • rosbag使用介绍

    rosbag 1 录制包 span class token comment 录制所有的topic span rosbag record span class token operator span a 2 查看包的信息 rosbag inf
  • Python基础

    输出函数print 输出内容可以是 1 数字 print 66 6 2 字符串 print hello world 单引号双引号都可 3 含有运算符的表达式 print 3 43 1 4 输出到文件中 fp 61 open D text t
  • PID控制器的优缺点和周期

    PID控制器参数优缺点 PID控制器简介 PID控制器是非常经典的一种控制算法 xff0c 是不需要知道系统的模型 xff0c 仅仅根据期望与现状的偏差调节 xff0c 使之能够到达期望的一种线性控制器 优点 xff1a 使用简单 xff0
  • 嵌入式开发自救指南(嵌入式怎么高薪基本思路)

    文章目录 前言打工的基本逻辑 xff1a 生产者思维价值与价格概念介绍需求与价值供给与价值 总结 一 为什么选择嵌入式四个角度个人需求现有资源与长板职业优先级排序 二 距离目标还有多远距离目标距离 三 路线半年路线为什么这样做 前言 为什么
  • docker安装firefox

    下载镜像 docker pull jlesage firefox 运行容器 docker run d name 61 firefox e TZ 61 Asia Hong Kong p 5800 5800 p 5900 5900 shm si
  • freertos学习之路1-裸机和rtos的区别

    写在最前 由于工作需要 xff0c 需要开始学习freertos的相关知识 xff0c 本专题主要记录freertos的相关内容 参考 xff1a https www bilibili com video BV19g411p7UT 正点原子
  • Windows10 配置 VSCode 的 C++环境

    目录 0 不同符号代表的 CPU 的位数 xff1a 1 下载 MinGW64 包 xff0c 配置C C 43 43 的Windows环境 2 在 VSCode 里配置 C 43 43 0 不同符号代表的 CPU 的位数 xff1a x8
  • MPU MCU CPU GPU之间的关系

    CPU xff08 Central Processing Unit xff0c 中央处理器 是计算机系统的主要处理器 xff0c 它负责执行指令 处理数据和控制计算机系统的操作 CPU通常被用于通用计算和控制任务 xff0c 如桌面电脑 服
  • stm32外设-中断详解

    0 写在最前 本栏目笔记都是基于stm32F10x 1 中断是啥 xff1f 什么是中断 xff1a CPU在处理某一事件A时 xff0c 发生的另外某一事件B请求CPU去处理 xff08 产生了中断 xff09 xff0c 随后CPU暂时
  • Darknet——yolo3训练自己的数据集+在ros环境下实现目标检测实战教程(三)——应用在ROS上

    文章目录 前言一 darknet ros代码简析二 修改ros驱动包的文件内容三 ros系统下运行效果总结 前言 Darknet yolo3训练自己的数据集 43 在ros环境下实现目标检测实战教程 xff08 一 xff09 环境配置 D
  • LSB(Linux Standard Base)通用部分学习自用(1)

    前言 什么是LSB xff08 借用了这位博主的高见 xff09 LSB文档下载 自用 xff0c 如有错误请指出 xff0c 不胜感激 本系列基于LSB Core Generic 5 0 介绍 The LSB defines a bina
  • cocos2dx 第七课 动作和动画

    一 动作的行为 runAction Action act 运行动作 stopAction Action act 停止动作 stopActionByTag int tag 停止动作 stopAllActions 停止节点所有动作 二 动作的种
  • 线性最小方差估计理论推导

    线性最小方差估计理论推导 定义 也叫线性最小均方误差估计 xff0c 顾名思义 xff0c 就是使估计误差的平方和的均值达到最小 理论推导 假设系统 z 61 H x 43
  • D435i、D435、D415、T265的Realsense_viewer环境搭配及安装

    安装步骤 1 注册服务器公钥 sudo apt span class token operator span key adv span class token operator span keyserver keys span class
  • VS Code下利用Cmake开发C++-单文件

    单文件 xff1a 第一步 xff1a 创建CmakeLists txt文件 第二步 xff1a 编写CmakeLists 设置最小版本 span class token function cmake minimum required sp

随机推荐

  • ECharts学习--主题设置

    xff08 1 xff09 内置主题 echarts中默认主题有两个 light dark 在初始化对象方法中 xff0c init可以指明 xff1a xff08 1 xff09 dark var mCharts 61 echarts i
  • 隔壁老王看了都会的文章:STM32串口实验——单片机与上位机交互信息

    今天介绍USART串口通信的使用 xff0c 目的在于会用串口传送和接收数据 内容包含了NVIC中断的知识 xff0c 下一篇着重讲NVIC中断 ADC在下下一篇 主要还是先看懂USART的相关代码 什么是串行通信 我们对通信的字面意思理解
  • C++ 字符串(string)常用操作总结

    目录 0 常用功能汇总 1 定义一个字符串 2 读写 string 操作 3 查询字符串信息 索引 4 拼接 比较等操作 5 cctype 头文件 判断字符类型 xff1a 大 小写字母 标点 数字等 6 for 循环遍历 7 修改 str
  • USB学习笔记——USB通信过程与枚举过程

    在网上看到一篇文章就是讲这个的 xff0c 仔细阅读后获得了很多感触 xff0c 整理总结如下 一 USB接口 在USB的集线器端D xff0c D 43 都接了下拉电阻 xff0c 而USB设备端的D xff0c D 43 接了上拉电阻
  • BGP协议的难点笔记和重要性

    bgp的报文 有五种报文类型bgp的包头长什么样 xff1a 由market 标记 length 长度 type 报文类型 这3个东西组成open报文 xff1a 用来维护bgp的建立 xff0c 就是bgp对等体之间的信息建立update
  • 使用xfsdump及xfsrestore备份并恢复文件

    xfs提供了xfsdump和xfsrestore工具 xff0c 协助备份xfs文件系统中的数据 xfsdump按inode顺序备份一个xfs文件系统8 xfs备份级别有2种 xff1a 0表示完全备份 xff0c 1 9表示增量备份 xf
  • 电赛准备过程记录

    电赛记录 xff08 1 xff09 2021全国大学生电子设计大赛参赛纪实 xff08 无人机赛题 xff09 提示 xff1a 写完文章后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 电赛记录 xf
  • Jetson TX2新手上路全记录(1)

    Jetson TX2小白零基础上手记录 xff08 1 xff09 暑假申请了一块TX2进行学习 xff0c 从头开始记录学习过程 趁着在装虚拟机先唠两句 文章目录 Jetson TX2小白零基础上手记录 xff08 1 xff09 开箱环
  • Jetson TX2新手上路全记录(3)

    ng 3 提示 xff1a 这里可以添加系列文章的所有文章的目录 xff0c 目录需要自己手动添加 例如 xff1a 第一章 Python 机器学习入门之pandas的使用 提示 xff1a 写完文章后 xff0c 目录可以自动生成 xff
  • 傅里叶变换详解

    一 用途 xff1a 任意 的函数经过一定的分解 xff0c 都能够表示为正弦函数的线性组合形式 比如想要过滤一首音乐中的噪音 xff0c 我们可以使用傅里叶变换将叠加后的图像分离为一个个纯声的正弦图像 xff0c 去掉特定频率的噪声就能实
  • git如何删除本地所有未提交的更改

    在使用git的时候 xff0c 如果本地做的修改都不想保留了 xff0c 可以通过下面命令恢复成HEAD版本 xff0c 未提交的以及加入暂存区中的修改都会被舍弃 git reset hard git clean xdf 转自
  • ESP32的RMT模块项目实用

    1 技术背景 最近公司在用ESP32的模组方案实现智能音箱的相关功能的项目 需要展示模组的网络状态以及音箱的语音交互状态 xff0c 找了一家RGB灯板供应商 需要模组通过一个io口输出脉冲波形 xff0c 来控制灯板切换模式 xff0c
  • ESP32 LOG库使用

    ESP32 log库 官方文档 一 printf是不可重入函数 printf不能在中断中被调用的原因是它是一个不可重入函数 xff0c 而在中断中要避免调用不可重入函数 xff0c 首先我们先说说什么是不可重入函数 简单说来 xff0c 区
  • C++ 数组(vector)常用操作总结

    目录 1 vector对象的定义和初始化方式 2 vector 常用基础操作 3 使用迭代器的遍历 插入 删除操作 4 vector 元素的重排操作 xff08 排序 逆序等 xff09 5 vector 中找最值 6 改变vector大小
  • 小熊派开发板移植RT-FOTA

    前言 买了小熊派的开发板 xff0c 将demo code验证完成之后就放下了 刚好最近工作也在做OTA相关的开发 xff0c 发现自己对于升级的功能还不够了解 xff0c 在码云找到了一位大神基于RTThread的RT FOTA代码 xf
  • 小熊派移植RT-Thread 的app代码

    前言 在上一篇我们已经讲解了如何移植RT FOTA到小熊派开发板 本篇我们将继续移植RT Thread xff0c 实现app代码的移植开发 xff0c 并将BootLoader和app一起烧录到开发板 xff0c 完成BootLoader
  • easyflash源码分析流程图

    最近周末刚好有空 xff0c 将easyflash源码看了一下 xff0c 了解了作者的设计理念 将学习内容整理成流程图贴上来 1 esayflash初始化流程 2 esayflash set env
  • .git bojects目录文件为空

    这里写自定义目录标题 git error object file git objects b9 e269f50db2a3415cc8ad5ba40b82b9b6a13d45 is empty 解决方法 xff1a 1 find git ob
  • freertos与rtthread内核实现的不同处

    一直在使用rtos作为主要开发内容 xff0c 却没有详细了解过rtos的内核实现机制 最近一个月 xff0c 抽了点时间将freertos和rtthread的内核代码看了下 xff0c 了解了实时系统的实现机制和设计思想 这里学习free
  • FlashDB移植与应用

    FlashDB移植与应用 最近工作需要 xff0c 对设备参数进行备份存储 xff0c 由于之前使用的是简单的分区备份方法 Easyflash的单实例不再适用 后面发现大神基于easyflash进行了新版本更新 xff0c 但是不向前兼容