CC2640R2F BLE5.0 CC2640R2F的存储架构

公司主页 文档归类 淘宝

存储架构

Flash

Flash以4KB为一个Page进行擦除/写入操作(如果在一个Page需要写入一个字节,需要将整个Page擦出),Flash组成部分及其它们关联的链接器文件如下。

对于协议栈以库文件方式链接的工程(_lirary):

  • Application Image Code Space(应用程序镜像代码区):应用程序和协议栈分为两个工程来管理,但是协议栈编译生成库文件供应用程序调用,应用程序会生成一个镜像文件,该镜像文件在应用程序的链接器配置文件中被配置:cc26xx_app.icf(IAR)和cc26xx_app.cmd(CCS)。

对于采用两个FLash镜像方式编译的工程(Split Image):

  • Application Image Code Space(应用程序镜像代码区):独立的应用程序Flash镜像,该镜像在应用程序的链接器配置文件中被配置:cc26xx_app.icf(IAR)和cc26xx_app.cmd(CCS)。

  • Stack Image Code Space(协议栈镜像代码区):独立的协议栈Flash镜像。该镜像在协议栈的链接器配置文件中被配置:cc26xx_stack.icf(IAR)和cc26xx_ stack.cmd(CCS)。

  • Simple NV (SNV)Area:非易失性存储器使用,可供应用程序和协议栈(GAP Bond Manager)使用。有关SNV的配置,请参阅本文后面的使用Simple NV进行Flash存储。配置时,SNV Flash存储区域是协议栈镜像的一部分。

  • Customer Configuration Area(CCA):Flash的最后一个Page用于存储客户特定芯片配置(CCFG)参数。CCA扇区未使用的空间被分配给应用程序项目。请参阅本文后面的用户配置区

Flash内存映射

本节在系统级别介绍用于两个拆分镜像项目配置的Flash内存映射。如下图1所示,应用程序链接文件存储在用实线箭头指向的内存位置和协议栈连接文件存储在用虚线箭头指向的内存位置。
图1. 系统闪存映射

注意:将协议栈作为库的工程,协议栈以库的形式被应用程序调用,协议栈和应用程序合并放在应用程序镜像代码空间中,而不需要与拆分镜像
相关的任何边界要求。

表1.总结了图29中的Flash System Map定义, 并提供了可在各个IDE链接器文件中找到的关联链接器的定义或符号。
表1. Flash系统映射定义

符号/区域 意义 工程 CCS定义 IAR定义
APP_FLASH_START flash的起始位置/应用程序镜像的起始位置 App FLASH_APP_BASE FLASH_START
APP_FLASH_END 应用程序镜像的结束位置(ICALL_STACK0_ADDR) App ADJ_ICALL_STACK0_START_FLASH_APP_BASE FLASH_END
STACK_FLASH_START 协议栈镜像的起始位置(ICALL_STACK0_ADDR) Stack FLASH_START FLASH_START
STACK_FLASH_END 协议栈镜像的结束位置,包括SNV Stack FLASH_SIZE_RESERVED_SIZE FLASH_END
CCA sector flash最后的扇区,包括CCFG App FLASH_LAST_PAGE FLASH_LAST_PAGE
CCFG region 位于CCA中,用来存储本地配置参数 App CCA的最后88个字节 CCA的最后88个字节

应用程序和协议栈的Flash边界

应用程序和协议栈代码镜像区域是基于预定义符号ICALL_STACK0_ADDR和ICALL_STACK0_START。这些值定义协议栈镜像的入口函数的硬编码Flash地址:为它本质上是应用程序和协议栈项目边界字对齐的Flash地址。了确保正确链接,应用程序和协议栈项目都必须使用相同的定义符号。默认情况下,链接器配置会将未使用的flash分配给应用程序项目,但可以通过边界工具手动或自动修改。使用边界工具配置Flash边界地址的有关信息,请参阅本文后面的边界工具操作

使用Simple NV进行Flash存储

Flash的Simple NV (SNV)区域用于存储不易变动的数据,例如用于绑定的加密密钥或需要存储的自定义参数。协议栈可以配置成为SNV预留最多两个4kBFlash page,尽管有效数据仅存储在一个可用的Flash page中。为了最小化Flash上的擦除周期数,当扇区具有80%的无效数据时,SNV管理器对Flash扇区(可能是多个扇区)进行压缩。压缩是将有效数据复制到临时区域,然后擦除先前存储数据的扇区。再根据OSAL_SNV Values中描述的OSAL_SNV值,该有效数据接着会被放回新擦除的扇区中或着保存在新扇区中。可以通过在协议栈项目中设置OSAL_SNV预处理器符号的值来配置分配给SNV的Flash扇区数目。表2列出了可配置的有效值以及相关描述。
表2. OSAL_SNV值

OSAL_SNV值 描述
0 SNV未使能。不能在NV中存储绑定密钥。这时应用程序和协议栈工程代码的存储区域最大。这时GAP Bond Manager也不能使能。在协议栈工程中需要设置预处理符号NO_OSAL_SNV来关闭GAP Bond Manager功能。关于配置低功耗蓝牙协议栈特征可以查看Stack Configurations
1(默认值) 分配一个flash扇区给SNV。绑定信息存储在NV中。flash压缩时使用cache RAM作为中间存储,因此压缩期间的功率损耗将导致SNV数据丢失。此外,由于临时禁用cache,在压缩期间可能会导致系统性能的降低。在协议栈工程中设置预处理符号OSAL_SNV=1
2 分配两个flash扇区给SNV。绑定信息存储在NV区。在压缩期间功率损耗时SNV数据会受到保护

将OSAL_SNV设置成其他值是无效的。设置的值越低可以为应用程序或协议栈工程分配的代码空间越大。可以使用以下API读取或写入SNV。

uint8 osal_snv_read( osalSnvId_t id, osalSnvLen_t len, void *pBuf)

||从NV读取数据|
|形参|id-有效的NV条目
len-读取数据的长度
pBuf-存储读取数据的缓冲区指针|
|返回值|SUCCESS:NV条目读取成功
NV_OPER_FAILED:读取NV条目失败|

uint8 osal_snv_write(osalSnvId_t id,osalSnvLen_t len,void * pBuf)

||写数据到NV|
|形参|id-有效的NV条目
len-写入数据的长度
pBuf-包含了需要写入数据的缓冲区指针。所有数据都会被立即更新|
|返回值|SUCCESS:写入NV条目成功
NV_OPER_FAILED:写入NV条目失败|

由于SNV与BLE5-Stack中的其他模块(如GAP Bond Manager)是共享的,所以必须小心管理NV条目ID。默认情况下,客户可用的ID在bcomdef.h中有定义,如下代码所示。

1 // Device NV Items -    Range 0 - 0x1F
2 #define BLE_NVID_IRK                    0x02  //!< The Device's IRK
3 #define BLE_NVID_CSRK                   0x03  //!< The Device's CSRK
4 #define BLE_NVID_SIGNCOUNTER            0x04  //!< The Device's Sign Counter
5 #define BLE_LRU_BOND_LIST               0x05  //!< The Device's order of bond indexes in least recently used order

6 // Bonding NV Items -   Range  0x20 - 0x5F    - This allows for 10 bondings
7 #define BLE_NVID_GAP_BOND_START         0x20  //!< Start of the GAP Bond Manager's NV IDs
8 #define BLE_NVID_GAP_BOND_END           0x5f  //!< End of the GAP Bond Manager's NV IDs Range

9 // GATT Configuration NV Items - Range  0x70 - 0x79 - This must match the number of Bonding entries
10 #define BLE_NVID_GATT_CFG_START         0x70  //!< Start of the GATT Configuration NV IDs
11 #define BLE_NVID_GATT_CFG_END           0x79  //!< End of the GATT Configuration NV IDs

12 // Customer NV Items - Range  0x80 - 0x8F - This must match the number of Bonding entries
13 #define BLE_NVID_CUST_START             0x80  
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值