osal_snv_write处理机制问题
以下为osal_snv_write中的一段代码
uint16 offset = findItem(activePg, pgOff, id);
if (offset > 0)
{
uint8 tmp;
osalSnvLen_t i;
for (i = 0; i < len; i++)
{
HalFlashRead(activePg, offset, &tmp, 1);
if (tmp != ((uint8 *)pBuf)[i])
{
break; //当数据不同跳出
}
offset++;
}
TI为什么对于相同的id值,发现flash中已存在时,不直接替换掉,而是在新区域中再存储新的数据。
这导致pgOff大于OSAL_NV_PAGE_SIZE后,osal_snv_write就一直失败。
现在我需要同一个ID存储上千次,没次都覆盖掉前面的值,请问有什么方法吗?
在ID=0x81中分别保存111111、222222、333333、444444、555555后,跟踪HalFlashRead函数,
发现xdata中数据如下保存:
而且在执行HalFlashRead中
// Calculate and map the containing flash bank into XDATA.
MEMCTR = (MEMCTR & 0xF8) | pg;
这段代码前,改地址区域内都是乱码
执行完后就出现图1结果了。
还有activePg的地址是Xdata:0x0a40, 为什么数据会保存到0xf000以后呢?
0x0a40中的实际数据如下:
一直不变
问题解决了,HAL_NV_PAGE_CNT被改成了1,把HAL_NV_PAGE_CNT改回2就行了,HAL_NV_PAGE_CNT为1就无法进行压缩了
Quote: TI为什么对于相同的id值,发现flash中已存在时,不直接替换掉,而是在新区域中再存储新的数据
FLASH的特性决定了不能采用你这种方式,只能将新数据追加到最后一个条目