FDS(Flash Data Storage 模块是sdk中提供的操作flash的模块。

前面介绍过fs(Flash Storage)模块,这个模块也是sdk中提供的操作flash的模块。为什么要提供两个呢?

 这需要了解一下关于flash操作的问题。 因为操作的是片上flash,所以在擦写flash的时候CPU会暂停,这对于ble来说很可能影响底层的链路上的时序。所以对于ble应用来说,不能通过flash相关的寄存器来直接操作flash,因为你不知道你操作的时机对不对会不会对ble协议的底层交互时序造成影响。所以nordic协议栈封装了flash操作,对外提供了flash操作的接口,形如sd_flash_write 所以对于ble应用来说,我们能操作的最底层函数api就是sd开头的flash操作函数,这些sd开头的flash操作函数是异步的,即调用后不会立刻就操作flash,底层协议栈会在合适的时候,不影响或说不至于影响到ble的正常连接的时候才会实际去执行flash操作。操作结束后协议栈再抛出底层事件,告诉你flash操作的结果。

 底层函数毕竟需要了解一些nordic协议栈的机制,以及flash操作的方式。所以nordic提供的sdk,在这些sd开头的底层函数上封装了一层来方便用户使用。即fs(Flash Storage)模块,这个模块封装了底层sd开头的API的调用以及协议栈返回的flash操作完成事件的处理。

 开发者只需要注册自己的回调函数,调用初始化函数,之后就直接调用可以读/写/擦除操作来操作flash了,而不需要注意和底层flash的事件的交互,flash执行真正完成时会自动调用注册的回调函数。

只是fs封装后提供的操作接口还是保留了flash操作的特性—flash必须是要先擦除后才能写。

这就导致了还是有一定的不便性,想更新一些数据的时候,你得先把flash数据读出来,然后修改,擦除flash最后再写回flash。

关于fs 模块这里不再多介绍,之前的fs几篇文章已经详细描述了fs相关原理和操作。

 综上为了解决fs的不便性,sdk又在fs的基础又封装了一层。形成了FDS,FDS的好处就是不仅屏蔽了和底层协议栈的事件交互(以为他依赖fs),同时也封装了更新这样的操作。Fds帮用户处理好了flash的更新,而不需要自己再去擦除flash再重写。 当然fds还提供了其他方便的特性,比如抽象了文件和记录的概念。这对上层的一些数据的组织提供了方便。比如你要存一个学校的学生记录,可以将一个班级的学生file ID设置相同,record id来区分不同的学生。

 PS:那为什么还需要fs?直接提供一个fds不就可以了? 因为你不能限定别人的使用方式,FDS的操作方便,那就引入了一定的局限性。如果操作方式,数据格式等。当然封装的层次越多,速度上也会稍慢一点。 Fs虽然有一些不便性,但是相对更灵活。当然最灵活的还是协议栈直接开放的api SD开头的flash操作函数。 即sdk提供了3中大类的flash操作方式,操作约方便操作的方式约受限。所以为了满足不同的可能的需求,所以sdk才将这三种操作flash的方式都提供出来。

我们画一下FDS,FS以及 协议栈提供的flash操作API的关系,方便后面理解。



下面详细介绍FDS相关的一些原理和操作。

 FDS将对flash操作抽象成了类似PC上的对文件的操作。抽象出了file ID和record ID这两个概念。 第一次写flash时也同时是这个写数据的创建的时候,所以需要设置file id和record key

Fds组织的数据在flash上以记录的形式组织,实际存储结构如下图:

File IDrecord key 是我们使用FDS时需要使用的。对于开发者来说file id和record用来标识一个记录。在第一次将这个记录写入flash时必须指定。FDS并没有要求file id和record key的唯一性。也就是你可以创建几个记录,他们的file id和record key都指定相同都不会有问题。

record key 不能设置为0x0000,0x0000表示该record是无效的。File ID不能设置为0xFFFF,0xFFFF标识无效的file id。

 因为FDS并没有限制file id和record key的唯一性,那么如果使用的场景中的确需要有几个记录有同样的file id和record key,那么当想删除这几个记录怎么办?所以FDS内部维护了record id,该字段就是每个记录再flash中的唯一标识,由FDS模块内部维护。不需要开发者操作。当删除几个file id和record key都相同的记录时,需要开发者自己调用函数 枚举找到这几个记录,虽然每次查找时传入的file id 和record key都一样,但是fds返回的记录描述符中的record id是不同的。再依次使用该返回的描述符就可以正确删除这些同样file id和record key的记录了。

 前面介绍了FDS相对于FS来说更方便了开发者的调用,因为它封装了更新flash的函数接口,想更新某个记录的数据可以直接调用fds_record_update 函数即可。FDS的内部实现对于update操作也很快。因为FDS的更新操作并不是真的更新这个旧的数据块,以前的旧SDK比如SDK9,更新一个数据会先将数据块读取出来保存到交换区,再更新数据,最后将交换区数据写回。 FDS的实现,不会做这些操作。FDS更新数据时,直接当成一个写操作,它会找到flash中没用的空间,然后写入这个更新的数据内容。最后直接将旧的数据块的 record key设置成脏数据标记0x0000,标识改记录无效的。所以FDS的更新操作相对以前旧的SDK很快。

 同理删除操作的原理也是一样,并不是真正的擦掉flash中的数据而是直接将数据块的record key

 需要注意的是工程中并不是可以任意使用file id和record key。除了前面说的record key =0x0000标识该记录无效,file id=0xffff标识无效外如果工程中存在 Peer Manager.模块,那么record key只能使用0x0001 - 0xBFFF.0xC000 to 0xFFFF是PM模块内部使用的,因为PM模块内部也会使用FDS进行flash操作。 File id只能使用0x0000 - 0xBFFF. 0xC000 to 0xFFFE也是PM模块使用了。

一些宏的介绍

FDS模块内部又很多宏都是可配置的,开发者可以更具自己实际情况配置。一般这些宏都是在sdk_config.h 配置文件中。

  • FDS_OP_QUEUE_SIZE: 设置flash操作队列的大小,flash操作都是异步的,所以调用fds提供api时,其内部实际都是放入一个操作队列然后一个个执行。所以如果应用中可能有一些地方不会等待flash操作返回结果就调用多次fds的flash操作接口,那么可能需要适当增大该宏的大小。否则可能因为队列中缓存了太多flash操作而导致新调用fds的api时返回FDS_ERR_NO_SPACE_IN_QUEUES的错误。

  • FDS_CHUNK_QUEUE_SIZE:设置允许缓存的记录的块的个数。这里的缓存并不是缓存内容而是缓存的地址,同样如果fds经常返回FDS_ERR_NO_SPACE_IN_QUEUES错误时,也可尝试增大该宏大小

  • FDS_VIRTUAL_PAGE_SIZE: FDS模块层面的虚拟页的大小。通常就是物理页大小不需要改。如果应用中的一个记录大小超过该大小,这里需要修改增大。

  • FDS_VIRTUAL_PAGES: 定义了虚拟页的个数,通常也不需要修改。如果存储的总数据量比较大,则需要适当增大。

  • FDS_MAX_USERS: 回调函数最大可注册数。可能有不同的模块都需要存储自己的Flash数据,所以每个模块都需要注册自己的flash回调函数。

Nordic--nrf52832--FDS(一)基本介绍相关推荐

  1. Nordic nRF52832程序下载问题分析

    1.开发工具安装后无法识别芯片的问题 针对nRF52832的开发,首先需要下载安装对应工具,主要安装的工具有nRFgo Studio.Command-Line-Tools.IAR.IAR是编程者必须的 ...

  2. Nordic nRF5 SDK和softdevice介绍

    SDK和Softdevice的区别是什么?怎么选择SDK和softdevice版本?芯片,SDK和softdevice有没有版本兼容问题?怎么理解SDK目录结构?SDK帮助文档在哪里?Softdevi ...

  3. Nordic老版官网介绍(2018-11-30停止更新)

    1. Nordic官网及资料下载 Nordic官网主页:https://www.nordicsemi.com/,进入官网后,一般点击"Products"标签页,即进入Nordic产 ...

  4. Nordic nRF52832申报要素

    国内芯片短缺,只好从海外进口一批Nordic Semiconductor的nRF 52832芯片.报关时,申报要素不知道怎么填写.最终根据老师的建议,按照以下要素申报: - - 品牌类型 境外品牌 出 ...

  5. BLE开发 Nordic nRF52832(二) BLE简介与虚拟串口传输实现

    以下是ble通信的一些基本规则的梳理,开发者不必要过分了解具体协议细节 蓝牙的一些概念 在网上可以找到以下概念,大致分以下几类.这些概念会有交叉,比方蓝牙4.0和ble,多模和Bluetooth sm ...

  6. Nordic开发笔记

    Nordic开发问题记录 定时模块app_timer用法及常见问题-nRF5 SDK模块系列二 Nrf SDK introduce nRF52840 PCA10056基于SES的编译运行(一) nRF ...

  7. nrf52832芯片手册_nRF52832低功耗问题不完全总结

    0.前言 技术和经历经验都有限,以下内容仅供初学者参考和个人总结记录,不定期更新. 都是使能协议栈开启BLE广播的情况 协议栈:s132_nrf52_6.1.1 SDK:nRF5_SDK_15.3.0 ...

  8. 蓝牙无线技术(BLE)介绍与开发点滴总结

    在项目实践学习中记录的点滴笔记,整理成章,希望能给大家提供工作与学习思路. 往期文章: 1.无线通信项目开发 - NB-IOT.LoRa.433.GPRS.2.4G.PKE近场通信,基础理论与开发点滴 ...

  9. Nordic DFU安卓空中升级

    增加依赖库 api 'no.nordicsemi.android:dfu:1.6.1' 增加权限 <uses-permission android:name="android.perm ...

  10. 智能魔法棒(手势控制器)———嵌入式篇

      在< 智能魔法棒---硬件篇 >中已经为大家介绍了魔法棒的硬件方案和结构设计,接下来介绍一下嵌入式软件设计方案.   注:本文涉及了有关 MPU6050 的使用方法.姿态解算方法.卡尔 ...

最新文章

  1. (格式化字符串漏洞).fini.array劫持,使程序流程循环进行
  2. php 把数组赋给另一个数组,php将一个数组附加到另一个数组(不是array_push或+)
  3. 最大字段和(动态规划,C语言)
  4. swift:Optional Type 、Swift和Objective-C混编的讲解
  5. 对微型计算机工作影响最小的因数是,(已)保护试题9
  6. linux命令行总结
  7. zabbix监控windows下的mysql
  8. 计算机英语翻译3000字,英语专四作文满分范文(二十八):计算机翻译
  9. 学会提问,你就成功了一大半!
  10. C语言编程机器码转真值,c语言程序设计谭浩强机器码.docx
  11. 随身助手API接口网站PHP源码v1.0
  12. 全国各省市区域mysql_中国省市区数据表(MySQL版)
  13. linux网卡驱动如何安装,linux下网卡驱动安装全过程
  14. Presenting view controllers on detached view controllers is discouraged
  15. 【软件安装】vmware虚拟机安装完整教程(15.5版本)
  16. 因为文件目录存在空格导致kafka运行错误:提示找不到或者无法加载主类错误
  17. 我的k8s随笔:Kubernetes 1.17.0 部署
  18. 测试人生 | 从外行到外包,从手工测试到知名互联大厂测开 这个90后是怎么腾飞的?
  19. 如何下载IBM服务器驱动
  20. 浅析dToF和iToF成像技术

热门文章

  1. 内嵌式串口转WiFi模块
  2. 推动数据开放共享,释放数字经济创新活力
  3. html5 canvas实现led样式数字字体
  4. 一个简短的指南的iOS越狱及原因
  5. irlr7843引脚图_IRLR7843PBF中文资料
  6. DSP原理学习笔记--第十四章--DSP算法及其实现
  7. 空间频率 MTF和 SFR
  8. 用计算机求回归,鲜为人知的用途,回归分析用计算器就能做!
  9. linux 繁体转简体,Linux下在程序中如何进行繁体中文和简体中文的转换
  10. Mybatis学习文档