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. usaco snail trails(dfs)
  2. java 微信转账_实现微信转账功能
  3. vue-cli3项目通过vue如何引入第三方js包完成登陆功能
  4. LeetCode 1094. 拼车
  5. java面试题_1000道Java工程师面试题+答案PDF485页
  6. Django项目实战之用户头像上传与访问
  7. MIS系统(13)- 系统管理之权限管理
  8. dw添加下拉菜单_用dreamweaver制作网站下拉菜单的实现教程
  9. 2018年4月5日腾讯考试感想
  10. sqlzoo刷题笔记-02 | SUM and COUNT
  11. 7-2 求素数个数 (30分)
  12. 计算机64位只有2g,电脑插了4G内存,但只有2G左右可以用,为什么 WIN7 64位
  13. jsPDF生成PDF文件,文件不全问题,后台进行文件下载,前台不下载
  14. 互联网+国家战略-整理
  15. netsh interface portproxy本地ip与端口映射及本地虚拟ip(windows)
  16. Chrome 浏览器打开页面变成下载html文件的问题
  17. Python基础之 8. 异常、模块
  18. 从高德上同步省市区行政区划数据到本地数据库demo
  19. arcgis做水文分析(河流提取、流域提取)
  20. DPtech 异常流量清洗技术白皮书

热门文章

  1. 一个月空余时间微信诗词小程序前后端开发上线实践指南
  2. 惠普m128fn中文说明书_惠普m128fp使用方法
  3. android应用程序在哪找,找不到应用程序的错误android
  4. Python怎么安装PHP,php中ThinkPHP的下载和安装
  5. 3dmax 导出 fbx文件, 模型 到Unity中 贴图丢失
  6. 麦肯锡极简工作法-读书笔记
  7. DSP eQEP正交编码
  8. Scrum 敏捷项目管理
  9. RINEX 3.02 版本导航信息文件格式说明
  10. PIC单片机汇编指令集合