AUTOSAR NvM 基础篇(一)

NvM block model

一个block就是以字节为单位的连续的序列,他可以被细分为Data block和CRC block,Data block用于存放user data, CRC block则存放根据userdata算出的对应的checksum。

根据block存放的位置不同,我们可以将block分为以下三种:

►ROM block

► permanent RAM block

► temporary RAM block

如果一个block位于rom,那么他就叫ROM data block。NvMRomBlockDataAddress定义了rom block 的地址,rom block中的数据必须是连续的, ROM block中没有CRC。

如果block位于ram中,那么就可以称为RAM data block。一般有两种RAM data block, the
permanent RAM data block 和the temporary RAM data block。 区别在于如果NvMRamBlockDataAddress 有配置一个固定的地址,那么他就是permanent RAM data block。而 temporary RAM data没有定义一个固定地址。

Permanent RAM blocks 和使用显性同步机制的RAM blocks 应该被放在 POWER_ON_INIT section。

如果对应block使能了CRC就被叫做RAM CRC,他会在运行时间被放在permanent RAM中。默认情况下,NVM负责给CRC blocks提供RAM 空间,但是NvMUserProvidesSpaceForBlockAndCrc使能后可以由application's RAM area预留。

一个RAM block可以有一个或多个RAM data block 和 RAM CRC block(可选)构成,NvMRamBlockDataAddress用于定义RAM block的first permanent RAM data block的地址。NvMNvBlockLength定义user data的长度,这个长度并不包含CRC的长度,该长度与EaBlockSize/FeeBlockSize对应。

另外,NVM包含一个administrative block,他用于记录block状态,write protection状态,正在使用的data index等block信息。

下图为NVRAM Manager block model overview

AUTOSAR NvM 基础篇(一)_第1张图片

 Block identification

对于application, NvMNvBlockIdentifier定义了要访问的NVRAM block。但当NvMBlockManagementType 设置为NVM_BLOCK_REDUNDANT 或者NVM_BLOCK_DATASET时, data index就用来指定这个block中的特定的NV data block。Application 可以使用NvM_-
GetDataIndex() and NvM_SetDataIndex()来获取/指定data index。

为了操作某一个特定的block,NvMNvBlockIdentifier可以用于确定该block,NvMNvBlockBaseNumber可以用来辅助确定对应的 logical block address。

下面来介绍一下如何在NV memory识别logical blocks。

NVRAM Manager用下面两个参数来识别对应的logical block

► NvMNvBlockBaseNumber

► NvMDatasetSelectionBits

而在下层抽象模块 Ea 或者Fee中,需要使用the parameters EaBlockNumber 或者FeeBlockNumber。

计算 logical block address

硬件抽象接口(即更低层的Fee和EA)为NVM提供了虚拟线性32位地址空间用于寻址,这32位地址由16bit的 block number和16bit的block address offset构成。这个block number就是下面想说的Logical address。

NV block的Logical address一共16 bits,分为NvMNvBlockBaseNumber 和NvMDatasetSelectionBits两部分。

而logical block address =  (NvMNvBlockBaseNumber << NvMDatasetSelectionBits) + DataIndex.

一个例子:

NvMDatasetSelectionBits == 2 (即被配置为2bit),则可以用作NvMNvBlockBaseNumber 的是14bit。由此:

- Range of NvMNvBlockBaseNumber: 0x1..0x3FFE(2^14个,即:1 ~(2^14-1-1))

- Range of data index: 0x0..0x3(=2^NvMDatasetSelectionBits-1) (2^2个,即:0 ~ (2^2-1))

- Range of FEE_BLOCK_NUMBER/EA_BLOCK_NUMBER: 0x4..0xFFFB (0x1<<2bit + 0)

再举个栗子,假设我配置了NvMDatasetSelectionBits = 5,我的NvMNvBlockBaseNumber 配成了6,而且是使用EA作为抽象的NvMNvBlockNum 是3的dataset NVRAM block时,

我的EaBlockNumber = (NvMNvBlockBaseNumber << NvMDatasetSelectionBits) + DataIndex,

                                   = 6<< 5 + (0 ~ 2) = 0x00C0 ~ 0x00C2

同理FeeBlockNumber也是一样的。

来看下配置的栗子~

NvMDatasetSelectionBits = 4,NvMNvBlockBaseNumber  =2,FeeBlockNumber就是32哦!

AUTOSAR NvM 基础篇(一)_第2张图片

AUTOSAR NvM 基础篇(一)_第3张图片

Block management

一个RAM block或者ROM block可以有多个相关的data block。Block management type决定了对应可以配置的data block的数量。一共有下面三种block management type

► Native block: consists of one data block only

► Redundant block: consists of two data blocks

► Dataset block: consists of one or several data blocks. The number of possible data blocks is determined by the parameter NvmDatasetSelectionBits.

具体的特性我下篇再来说~

Memory configuration identification

我们配置NVM 模块的时候总能看到第一个block,叫ConfigId。但是为什么会有这个blcok呢?

AUTOSAR NvM 基础篇(一)_第4张图片

当我们开始配置NVM时,需要为你的配置提供一个identification number。这个值就是compiled configuration ID,可以使用NvMCompiledConfigId来设置他。这个要被放在第一个block的ROM 地址中,所以我们平时看到的这个ConfigId block就是用来做这个的。

在NvM_ReadAll()时,这个configuration ID会从NV memory的block 1里copy到ram中去,然后会和ROM中的值进行比较。

①如果NV block 1 无效或者从没有被写过,新的compiled configuration ID会被copy到RAM中去,并在NvM_WriteAll中把block mark为be written to NV memory ,NvM_ReadAll()会把继续把数据从NV block中copy到RAM中去。这时multi block operation的结果是NVM_REQ_NOT_OK,block 1的结果是NVM_REQ_NV_INVALIDATED或者 NVM_REQ_INTEGRITY_FAILED。

②如果NV block由于CRC不匹配或底层出错而读不出数据,只有NvMDynamicConfiguration设置为true时新的 compiled configuration ID才会被copy到RAM。这时multi block operation的结果是NVM_REQ_NOT_OK,block 1的结果是NVM_REQ_REDUNDANCY_FAILED。

③如果NV block能够正常读出,但是configuration ID mismatch (例如new blocks are added, some blocks are deleted, or the length of a block was changed),根据NvMDynamicConfiguration配置不同会有如下操作。当NvMDynamicConfiguration设为TRUE时,新的compiled configuration ID会被copy到RAM中去,并在NvM_WriteAll中把block mark为be written to NV memory 。另外,当NvMResistantToChangedSw为FALSE时,其他NV block会从ROM中load default data, 否则会继续从NV data中copy数据到 RAM中。只有block是invalid时才会从ROM中load数据。

而上述两种情况下,multi-block operation的结果也会依赖于individual block job results,

► NVM_REQ_OK: the status of all blocks is either NVM_REQ_OK or NVM_REQ_BLOCK_SKIPPED

► NVM_REQ_NOT_OK: the status of at least one block is neither NVM_REQ_OK nor NVM_REQ_BLOCK- SKIPPED

Block 1 的结果则为 NVM_REQ_NOT_OK.

④如果Block 1可以正常读出并且ID match,NvM_ReadAll()会把全部nv block的内容读到RAM 中,multi-block operation的结果也会依赖于individual block job results。

► NVM_REQ_OK: the status of all blocks is either NVM_REQ_OK or NVM_REQ_BLOCK_SKIPPED

► NVM_REQ_NOT_OK: the status of at least one block is neither NVM_REQ_OK nor NVM_REQ_BLOCK_SKIPPED。

Block 1 的结果为 NVM_REQ_NOT_OK。

你可能感兴趣的:(autosar)