请教TI工程师一个问题:
CC2640R2F,协议栈可以配置成为SNV预留最多两个4kBFlash page,为防止写SVN时异常,我们设计使用两个page存储相同的一组数据,查看bcomdef.h文件,有如下定义:
// Bonding NV Items – Range 0x20 – 0x5F – This allows for 10 bondings
#define BLE_NVID_GAP_BOND_START 0x20 //!< Start of the GAP Bond Manager's NV IDs
#define BLE_NVID_GAP_BOND_END 0x5f //!< End of the GAP Bond Manager's NV IDs Range
// GATT Configuration NV Items – Range 0x70 – 0x79 – This must match the number of Bonding entries
#define BLE_NVID_GATT_CFG_START 0x70 //!< Start of the GATT Configuration NV IDs
#define BLE_NVID_GATT_CFG_END 0x79 //!< End of the GATT Configuration NV IDs
// Customer NV Items – Range 0x80 – 0x8F – This must match the number of Bonding entries
#define BLE_NVID_CUST_START 0x80 //!< Start of the Customer's NV IDs
#define BLE_NVID_CUST_END 0x8F //!< End of the Customer's NV IDs
其中0x80~0x8F提供了可写SVN编号,一共16个,每个SVN可写252有效字节,16*252才一个page大小,我们现在需要将这组参数写到第二page中,请问如何操作?
曾尝试将0x8F改为0x9F,通过osal_snv_write函数将编号为0x91的SVN区,读取flash时,发现第二个扇区全FF,证明未写进去。下面截取CC2640R2F存储架构中的,是否可理解为有效数据不足80%时,协议栈自动将有效数据压缩到一个区中?
Viki Shi:
看上图,OSAL_SNV =2的时候,SNV有两个page,但是真正处于active模式的只有一个page。当存储的那个page超过80%时,SNV manager对其进行压缩并copy进另一个page,同时对前一个page进行擦除【假如OSAL_SNV =1则依然放在之前擦除过的page】。
你的应用,写入两个不同的NV Item就行了,无需存放在两个page,注意前面说的,真正处于active的只有一个page。
user4546979:
回复 Viki Shi:
上面问题清楚了,十分感谢,那假如将第一个page写满,第二个page就可以写其他数据了吗?
问题来了,0x80~0x8F提供了可写SVN编号,一共16个,16*252才一个page大小,那我需要修改0x8F为0x9F就可以实现吗,为什么默认的是0x8F呢,还是说只能写16个编号
ZANGk:
回复 Viki Shi:
到8F时,一页已经用完了,如果用下一页,编号怎么定义?????????????
Viki Shi:
回复 ZANGk:
还是写这16个编号,SNV driver有一个自己的机制来决定到底写入哪个flash page,这部分用户不用去操作
ZANGk:
回复 Viki Shi:
OK,了解,谢谢!!!