![]() |
![]() |
![]() |
存储架构
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.总结了图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




最低0.47元/天 解锁文章
4619

被折叠的 条评论
为什么被折叠?



