显性同步是NVM 默认的机制,缺点是application之间分享相同的资源并同步比较难保证。
Application需要遵循的规则如下:
Single-block write requests NvM_WriteBlock() and NvM_WritePRAMBlock():
Application提供一个RAM block,里面放要写进NV memory的数据,然后trigger 一个write request。
在NVM写完之前,不可以修改RAM block的内容,但是读数据是可以的。
Single-block read requests NvM_ReadBlock(), NvM_ReadPRAMBlock(), NvM_RestoreBlockDefaults(), and NvM_RestorePRAMBlockDefaults():
Application提供一个RAM block,里面放要从NV memory读出/恢复的数据,然后trigger 一个 request。
在NVM做完之前,不可以修改RAM block的内容。
Multi-block write requests NvM_WriteAll():
NvM_WriteAll()仅由EcuM在shutdown期间调用。
Application提供一个RAM block,之后不允许改数据了。
Multi-block read requests NvM_ReadAll():
在EcuM在startup过程中调用一次,Application提供一个RAM block,直到读完之前都不能改里面的内容。
如果想NvM_WriteAll 或者NvM_ReadAll能操作对应的block,那么就要
1.enable NvMSelectBlockForWriteAll 或者NvMSelectBlockForReadAll
2.一个permanent RAM block 要配置(NvMRamBlockDataAddress)
这种同步机制的好处是NVM在操作的时候不会限制application ram block的使用,但是NVM的RAM 使用量会增多,因为NVM需要定义一个所有block中最大的block size大小的buffer。RAM block和这个buffer之间的同步需要用callback函数来实现。
对于单个block或者多个block的操作都会用到这个callback,就算定义了permanent RAM address, NvM 也不会内部的copy data。所有的数据同步都是用callback来做的。
采用隐性机制的方法要遵循以下规则。
Single-block write requests NvM_WriteBlock() and NvM_WritePRAMBlock():
Application提供一个RAM block,里面有要写进NVM的data,然后write request被trigger,直到nvmcallback(NvMWriteRamBlockToNvCallback)调到之前都可以改ram block的数据。Application可以通过callback的返回值来告诉nvm data有没有copy进去,如果是not ok,NVM会尝试NvMRepeatMirrorOperations次重新拿数据。
Single-block read requests NvM_ReadBlock(), NvM_ReadPRAMBlock(), NvM_RestoreBlockDefaults(), and NvM_RestorePRAMBlockDefaults():
Application提供一个RAM block,里面有要读出/恢复的NVM的data,然后request被trigger,直到nvmcallback(NvMReadRamBlockFromNvCallback)调到之前都可以改ram block的数据。Application可以通过callback的返回值来告诉nvm data有没有copy进去,如果是not ok,NVM会尝试NvMRepeatMirrorOperations次重新拿数据。
Multi-block write requests NvM_WriteAll():
同Single block
Multi-block read requests NvM_ReadAll():
同Single block
如果想NvM_WriteAll 或者NvM_ReadAll能操作对应的block,那么就要
1.enable NvMSelectBlockForWriteAll 或者NvMSelectBlockForReadAll
2.NvMBlockUseSyncMechanism 要配置成显性同步
3.配置NvMReadRamBlockFromNvCallback 和NvMWriteRamBlockToNvCallback
总体来说:
显性同步会由nvm定义一块 ram mirror, 在swc请求读写时,block id和空指针传进去,期间swc还可以改自己想写的值,直到NvMWriteRamBlockToNvM 或者NvMReadRamBlockFromNvM 被调用,swc把数据写到指针里/读数据到swc的变量中,之后swc又可以自由修改自己的变量。