在上一篇文章中,介绍同步机制时提到了一个接口,也即NvM_SetRamBlockStatus,它的作用是什么呢?
启动阶段
对于某些NVRAM块,如果存储在NV块的数据比对应RAM块的数据要“旧”(例如热重启场景下,RAM中的数据并未写入到NV存储中),需要保证在NvM_ReadAll的过程中,RAM块的数据不会被覆写。对于这种需求,RAM块需要被分配到reset-safe(不会被初始化的)RAM区域,同时需要在配置工具中将CalcRamBlockCrc勾上,把NvMSetRamBlockStatusApi选项也够上。
每当RAM块的数据有修改时,都需要调用NvM_SetRamBlockStatus接口,参数为TRUE。NvM模块将会为RAM块数据重新计算CRC,存储在reset-safe RAM区域的内部变量中。作为前提,需要设置NvMRamBlockDataAddress,或者有配置用在显性同步时的NvMReadRamBlockFromNvM回调接口。
每次启动(调用NvM_ReadAll)时,NvM模块基于RAM块数据计算RAM块的CRC,如果其计算结果和存储的RAM CRC值相同,代表此时RAM块的数值和CRC值一致,数据有效,那么RAM块不会被覆写(比如上述的热重启场景下)。如果CRC值不同,那么RAM块会被NV块中读取出来的数据覆写,或者在读取失败的情况下,由默认数值覆写(如果配置了NvMRomBlockDataAddress或者NvMInitBlockCallback)。
关闭阶段
如果NvMSetRamBlockStatusApi选项未使能,那么NvM模块在NvM_WriteAll期间,会给所有配置了WriteAll选项的NVRAM块从RAM块拷贝数据,数据可来自于NvMRamBlockDataAddress或者NvMReadRamBlockFromNvM。
为了降低NV存储的写入数量,有必要仅为用户标记过有修改的数据进行写入操作,所以需要将NvMSetRamBlockStatusApi使能,每当数据有修改时调用此接口,进行标记。