NVDS
NVDS是一个轻量级逻辑数据存储系统,它依赖于Flash硬件抽象层(Flash HAL)。其存储于Flash中,掉电时数据不会丢失。NVDS默认使用Flash最后两个扇区(Sector)。在NVDS区域中,最后一个扇区用于碎片整理,其余扇区用于数据存储。
NVDS系统适合存储小块数据,例如应用程序的配置参数、校准数据、状态和用户信息等。BLE协议栈也会使用NVDS存储设备绑定等参数。
NVDS系统具有以下特性:
- 每个存储项(TAG)都有唯一的TAG ID用于标识,用户程序可以根据TAG ID对数据内容进行读取和更改操作,不需要关心存储的物理地址。
- 针对Flash存储介质的特性进行了优化,支持数据校验、Word对齐、碎片整理和擦写平衡。
- 存储区域的大小和起始地址可配置,Flash存储区以Sector为单位,一个Sector的大小为4 KB,NVDS存储区域可配置为若干个Sector;配置的起始地址须按4 KB对齐。
NVDS提供了以下8个简单的API用于操作Flash中的非易失性数据。
函数原型 | 描述 |
---|---|
uint8_t nvds_init(uint32_t start_addr, uint8_t sectors) |
初始化NVDS使用的Flash Sectors。 |
uint8_t nvds_get(NvdsTag_t tag, uint16_t *p_len, uint8_t *p_buf) |
从NVDS中读出tag标识对应的数据。 |
uint8_t nvds_put(NvdsTag_t tag, uint16_t len, const uint8_t *p_buf) |
将数据写入到NVDS并用tag标识。如果这个tag不存在,则创建一个新的。 |
uint8_t nvds_del(NvdsTag_t tag) |
删除NVDS中tag标识的数据。 |
uint16_t nvds_tag_length(NvdsTag_t tag) |
获取指定Tag的数据长度。 |
uint8_t nvds_drv_func_replace(nvds_drv_func_t *p_nvds_drv_func) | 替代直接操作Flash的相关API。 |
uint8_t nvds_func_replace(nvds_func_t *p_nvds_func) | 替代NVDS操作相关API。 |
void nvds_retention_size(uint8_t bond_dev_num) | 为设备绑定信息预留空间,预留空间大小与设备绑定数有关。 |
NVDS API的详细说明请直接查看NVDS头文件(位于SDK_Folder\components\sdk\gr55xx_nvds.h)。
NVDS存储数据的格式如图 7所示:
数据头(Data Header)格式如表 3所示:
Byte | Name | Description |
---|---|---|
0-1 | tag | 数据的tag标识 |
2-3 | len | 数据的长度 |
4-4 | checksum | 数据头的校验和 |
5-5 | value_cs | 数据的校验和 |
6-7 | reserved | 保留字段 |
BLE协议栈也会使用NVDS存储一些参数,因此必须为NVDS分配Flash存储区域。GR5526 SDK会缺省使用Flash Memory倒数第二个Sector作为NVDS使用的存储区域,最后一个Sector用作NVDS碎片整理,可通过更改custom_config.h文件中的宏NVDS_START_ADDR和NVDS_NUM_SECTOR来配置NVDS区域的起始地址和占用大小。BLE协议栈和Application共享相同的NVDS存储区域,但是TAG ID命名空间被划分为不同的类别,开发者只能使用分配给Application的TAG ID命名类别。
- Application必须使用NV_TAG_APP(idx)来获取应用程序数据的TAG ID。该TAG ID被用作NVDS API的参数。
- Application不能将idx直接作为NVDS API的参数。idx取值范围是0x4000 ~ 0x7FFF。
在Application第一次运行前,开发者可使用工具GProgrammar将BLE协议栈和Application所使用的TAG初始值写入到NVDS。如果开发者不使用GR5526 SDK缺省的NVDS区域而要自行指定NVDS区域起始地址,请确保GProgrammar中的NVDS区域起始地址配置与4 KB对齐。