AUTOSAR —— NVM 3

本文根据AUTOSAR4.4(Classic Platform)(https://www.autosar.org/standards/classic-platform/classic-platform-440/)标准中的 :

AUTOSAR_SRS_MemoryServices.pdf

AUTOSAR_SWS_NVRAMManager.pdf

两篇文章整理。仅为个人理解,不当之处,还请指正,感谢!

 

本文内容目录来自:AUTOSAR_SWS_NVRAMManager.pdf 

7.3 Error Classification

错误包括:

  1. Development Errors(开发错误);
  2. Runtime Errors(运行错误);
  3. Production Errors(生产错误);
Error Classification
Development ErrorsRuntime ErrorsProduction Errors
1NVM_E_PARAM_BLOCK_ID (0x0A)入参错误1NVM_E_QUEUE_FULLQueue已满,不能再接受新的入队请求,适用于 standard or immediate 类型的NVRAM block1NVM_E_HARDWAREread(single / multi) 失败:即 MemeIf 报告  MEMIF_JOB_FAILED, MEMIF_BLOCK_INCONSISTENT;
CRC不匹配;
write/invalidate/erase 失败:即 MEMIf 报告 MEMIF_JOB_FAILED;
2NVM_E_PARAM_BLOCK_TYPE2NVM_E_INTEGRITY_FAILED 底层模块(Fls、Memif)的read 操作完成,在NVM 层进行CRC校验时,检测到 数据损坏 和/或CRC损坏
3NVM_E_PARAM_BLOCK_DATA_IDX (0x0C)3NVM_E_REQ_FAILEDread 请求(包括所有的重读(retry))在底层模块的处理(Memif/Fls)的操作失败。
底层模块操作失败的情况包括:

NvM的请求被底层模块拒绝;
NvM的请求被底层模块接受,但是请求失败:底层模块返回 JobErrorNotification;
当然,FAILED 的结论是在所有retry 都失败之后的结论。
4NVM_E_PARAM_ADDRESS (0x0D)   4NVM_E_WRONG_BLOCK_IDread 期间,底层模块顺利完成read 操作,但是,static ID 检查失败。意味着实际读取的 NvM block 和 想要读取的 NvM block 不一致。
5NVM_E_PARAM_DATA (0x0E)   5NVM_E_VERIFY_FAILEDwrite 操作顺利完成,但是岁写入数据的验证失败。当前,这个结果在所有的retry 失败后才得出
6NVM_E_PARAM_POINTER (0x0F)   6NVM_E_LOSS_OF_REDUNDANCY两个 block 实例中的内容不一致;
或者第一个 block 实例损坏(不管第二个 block 实例如何,完好或者损坏);
或者第一个 block 实例不能被读取(不管第二个 block 实例如何,可以或者不可以读取),NvM 就会报告这个错误。
7NVM_E_BLOCK_WITHOUT_DEFAULTS (0x11)   7NVM_E_WRITE_PROTECTED当 write 一个被设置了 write  protection的NVM block时
8NVM_E_UNINITNvM 模块没有完成初始化 
9 NVM_E_BLOCK_PENDING被请求的NVRAM block正在被处理时,新的read/write/control 请求会失败,并返回该错误码
10NVM_E_BLOCK_CONFIG由于配置,NVMRAM block不能使用该API
11NVM_E_BLOCK_LOCKED因为RAM block 被锁定,write 失败
12NVM_E_BLOCK_WITHOUT_DEFAULTS如果NVMRAM block既没有配置默认数据(ROM)也没有配置NvMInitBlockCallback,则在调用 NvM_RestoreBlockDeafults()或NvM_RestorePRAMBlockDefaults()会返回该错误码
13 NVM_E_WRITE_ONCE_STATUS_UNKNOWN如果NVRAM block 配置启用了 NVM_WRITE_BLOCK_ONCE (TRUE),则在对该block进行第一次读之前,如果调用了Write/Erase/Invalidate,就会返回该错误码

7.3.1 Development Errors

Development Errors 的检测必须必须是开发模式(Development Mode)下

Development Errors 包括:

1. 入参错误:当调用 NvM 的API时,如果入参有错误,NvM会返回以下错误码(error code):

  1. - NVM_E_PARAM_BLOCK_ID (0x0A)
  2. - NVM_E_PARAM_BLOCK_TYPE
  3. - NVM_E_PARAM_BLOCK_DATA_IDX (0x0C)
  4. - NVM_E_PARAM_ADDRESS (0x0D)
  5. - NVM_E_PARAM_DATA (0x0E)
  6. - NVM_E_PARAM_POINTER (0x0F)
  7. - NVM_E_BLOCK_WITHOUT_DEFAULTS (0x11)

2. NVM_E_UNINIT (0x14):NvM 模块没有完成初始化;

3. NVM_E_BLOCK_PENDING (0x15):当被请求的NVRAM block正在被处理时,新的read/write/control 请求会失败,并返回该错误码。

4. NVM_E_BLOCK_CONFIG (0x18):由于配置,NVMRAM block不能使用该API;

5. NVM_E_BLOCK_LOCKED (0x19):因为RAM block 被锁定,write 失败;

6. NVM_E_BLOCK_WITHOUT_DEFAULTS (0x11):如果NVMRAM block既没有配置默认数据(ROM)也没有配置NvMInitBlockCallback,则在调用 NvM_RestoreBlockDeafults()或 NvM_RestorePRAMBlockDefaults()会返回该错误码;

7. NVM_E_WRITE_ONCE_STATUS_UNKNOWN (0x1A):如果NVRAM block 配置启用了 NVM_WRITE_BLOCK_ONCE (TRUE),则在对该block进行第一次读之前,如果调用了Write/Erase/Invalidate,就会返回该错误码。

 

7.3.2 Runtime Errors
 

NVM_E_QUEUE_FULL:Queue已满,不能再接受新的入队请求,适用于 standard or immediate 类型的NVRAM block。


7.3.4 Production Errors

Production Errors 的检测必须必须是生产模式(Production Mode)下

NVM_E_HARDWARE:读/写 NV memory 失败。

以下3 种情况发生时,NvM会向DEM报告NVM_E_HARDWARE:

  1. read(single / multi) 失败:即 MemeIf 报告  MEMIF_JOB_FAILED, MEMIF_BLOCK_INCONSISTENT;
  2. CRC不匹配;
  3. write/invalidate/erase 失败:即 MEMIf 报告 MEMIF_JOB_FAILED;

 

7.3.5 Extended Production Errors
 

Type or error Related error codeValue
[hex]
 
The processing of the read service detects an
inconsistency
处理read时检测到数据一致性丧失NVM_E_INTEGRITY_FAILEDAssigned by DEM

 

仅适用于配置了CRC的NvM block。

The processing of the service fails请求失败NVM_E_REQ_FAILEDAssigned
by DEM
 
The Static Block ID check during read failedread期间静态ID检查失败NVM_E_WRONG_BLOCK_IDAssigned
by DEM
前提:启用 Static Block ID check
The write verification failed写验证失败NVM_E_VERIFY_FAILEDAssigned
by DEM
前提:启用 write Verification failed
 
There is a loss of redundancy for a block of
redundant type
redundant类型的 NVM block 块丢失冗余性NVM_E_LOSS_OF_REDUNDANCYAssigned by DEM前提:Redundant 类型的NVRAM block
There is a write attempt to a NVRAM block with
write protection
写设置了写保护的 NVM blockNVM_E_WRITE_PROTECTEDAssigned by DEM前提:启用 write protection


 

7.3.5.1 NVM_E_INTEGRITY_FAILED

条件:仅适用于配置了 CRC检查的NvM block.

发生场景: 底层模块(Fls、Memif)的read 操作完成,在NVM 层进行CRC校验时,检测到 数据损坏 和/或CRC损坏。

 

7.3.5.2 NVM_E_REQ_FAILED
 

read 请求(包括所有的重读(retry))在底层模块的处理(Memif/Fls)的操作失败。

底层模块操作失败的情况包括:

  1. NvM的请求被底层模块拒绝;
  2. NvM的请求被底层模块接受,但是请求失败:底层模块返回 JobErrorNotification;
  3. 当然,FAILED 的结论是在所有retry 都失败之后的结论。


7.3.5.3 NVM_E_WRONG_BLOCK_ID
 

read 期间,底层模块顺利完成read 操作,但是,static ID 检查失败。意味着实际读取的 NvM block 和 想要读取的 NvM block 不一致。

 

7.3.5.4 NVM_E_VERIFY_FAILED
 

write 操作顺利完成,但是岁写入数据的验证失败。当前,这个结果在所有的retry 失败后才得出。

 

7.3.5.5 NVM_E_LOSS_OF_REDUNDANCY
 

redundant 类型的 NVM block 会在两个 block实例中(比如,两个 FLASH 块)写入相同的内容,这就是 冗余的定义。

在read 期间,NvM会报告这个错误,如果:

  1. 两个 block 实例中的内容不一致;
  2. 或者第一个 block 实例损坏(不管第二个 block 实例如何,完好或者损坏);
  3. 或者第一个 block 实例不能被读取(不管第二个 block 实例如何,可以或者不可以读取),NvM 就会报告这个错误。

 

7.3.5.6 NVM_E_WRITE_PROTECTED

 

当 write 一个被设置了 write  protection的NVM block时。

write protection 的设置有两种方式:

  1. 配置时 启用 write protection;
  2. 使用 API:NvM_SetBlockProtection(block_ID, TRUE)设置写保护

 

 

7.4 Error detection
 

如果NvM模块启用了 Development Error Detection,则以下API应该分别向 DET 模块报告如下错误。换句话说,在开发如下API的过程中,其DET检查应该包含对如下错误的检查。

development error detection:

Development Errors
 API序号Error code发生场景
1NvM_SetDataIndex1NVM_E_UNINIT NvM 模块未初始化
2NVM_E_BLOCK_PENDINGNVRAM block ID 已经入队或者正在被处理
3NVM_E_PARAM_BLOCK_DATA_IDX当DataIndex超过已配置的 dataset 总数时
4NVM_E_PARAM_BLOCK_ID当BlockID超出范围时
2NvM_GetDataIndex1NVM_E_UNINIT NvM 模块未初始化
2NVM_E_PARAM_BLOCK_ID当BlockID超出范围时
3NVM_E_PARAM_DATA当入参DataIndexPtr为 NULL pointer
3NvM_SetBlockProtection 1NVM_E_UNINIT NvM 模块未初始化
2NVM_E_BLOCK_PENDING当NVRAM block ID已经入队或者正在被处理
3NVM_E_BLOCK_CONFIG当 NvMWriteBlockOnce = TRUE 时
4NVM_E_PARAM_BLOCK_ID当BlockID超出范围时
5NVM_E_BLOCK_LOCKED当 Block 被锁时
4NvM_GetErrorStatus1NVM_E_UNINIT NvM 模块未初始化
2NVM_E_PARAM_BLOCK_ID当BlockID超出范围时
3NVM_E_PARAM_DATA当入参 RequestResultPtr 为 NULL pointer
5         NvM_GetVersionInfo1NVM_E_PARAM_POINTER当入参 versioninfo 为 NULL pointer
6NvM_ReadBlock1NVM_E_UNINIT NvM 模块未初始化
2NVM_E_BLOCK_PENDINGNVRAM block ID 已经入队或者正在被处理
3NVM_E_PARAM_ADDRESS1. 既没有配置Permanent RAM block 也没有配置显示同步机制;
2. 入参 NvM_DstPtr 为 NULL Pointer 
4 NVM_E_PARAM_BLOCK_ID当BlockID超出范围时
7NvM_ReadPRAMBlock1NVM_E_UNINIT NvM 模块未初始化
2NVM_E_BLOCK_PENDINGNVRAM block ID 已经入队或者正在被处理
3NVM_E_PARAM_ADDRESS对于接收到的 Block ID 既没有配置Permanent RAM block 也没有配置显示同步机制;
4 NVM_E_PARAM_BLOCK_ID当BlockID超出范围时
8NvM_WriteBlock1NVM_E_UNINIT NvM 模块未初始化
2NVM_E_BLOCK_PENDINGNVRAM block ID 已经入队或者正在被处理
3NVM_E_PARAM_ADDRESS1. 既没有配置Permanent RAM block 也没有配置显示同步机制;
2. 入参 NvM_DstPtr 为 NULL Pointer 
4 NVM_E_PARAM_BLOCK_ID当BlockID超出范围时
5NVM_E_BLOCK_LOCKEDBlock 被锁
6NVM_E_WRITE_ONCE_STATUS_UNKNOWNblock 被配置为 NVM_WRITE_BLOCK_ONCE (TRUE),但是在进行 write 访问之前,没有执行 read 访问。
9NvM_WritePRAMBlock1NVM_E_UNINIT NvM 模块未初始化
2NVM_E_BLOCK_PENDINGNVRAM block ID 已经入队或者正在被处理
3NVM_E_PARAM_ADDRESS既没有配置Permanent RAM block 也没有配置显示同步机制; 
4 NVM_E_PARAM_BLOCK_ID当BlockID超出范围时
5NVM_E_BLOCK_LOCKEDBlock 被锁
6NVM_E_WRITE_ONCE_STATUS_UNKNOWNblock 被配置为 NVM_WRITE_BLOCK_ONCE (TRUE),但是在进行 write 访问之前,没有执行 read 访问。
10NvM_RestoreBlockDefaults1NVM_E_UNINIT NvM 模块未初始化
2NVM_E_BLOCK_PENDINGNVRAM block ID 已经入队或者正在被处理
3NVM_E_PARAM_ADDRESS1. 既没有配置Permanent RAM block 也没有配置显示同步机制;
2. 入参 NvM_DstPtr 为 NULL Pointer 
4 NVM_E_PARAM_BLOCK_ID当BlockID超出范围时
11NvM_RestorePRAMBlockDefaults1NVM_E_UNINIT NvM 模块未初始化
2NVM_E_BLOCK_PENDINGNVRAM block ID 已经入队或者正在被处理
3NVM_E_PARAM_ADDRESS既没有配置Permanent RAM block 也没有配置显示同步机制; 
4 NVM_E_PARAM_BLOCK_ID当BlockID超出范围时
12 NvM_EraseNvBlock 1NVM_E_UNINIT NvM 模块未初始化
2NVM_E_BLOCK_PENDINGNVRAM block ID 已经入队或者正在被处理
3 NVM_E_PARAM_BLOCK_ID当BlockID超出范围时
4NVM_E_BLOCK_CONFIGBlock 优先级不是 immediate (0)
5NVM_E_BLOCK_LOCKEDBlock 被锁
6NVM_E_WRITE_ONCE_STATUS_UNKNOWNblock 被配置为 NVM_WRITE_BLOCK_ONCE (TRUE),但是在进行 write 访问之前,没有执行 read 访问。
13         NvM_CancelWriteAll1NVM_E_UNINIT NvM 模块未初始化
14NvM_InvalidateNvBlock1NVM_E_UNINIT NvM 模块未初始化
2NVM_E_BLOCK_PENDINGNVRAM block ID 已经入队或者正在被处理
3 NVM_E_PARAM_BLOCK_ID当BlockID超出范围时
4NVM_E_BLOCK_LOCKEDBlock 被锁
5NVM_E_WRITE_ONCE_STATUS_UNKNOWNblock 被配置为 NVM_WRITE_BLOCK_ONCE (TRUE),但是在进行 write 访问之前,没有执行 read 访问。
15NvM_SetRamBlockStatus 1NVM_E_UNINIT NvM 模块未初始化
2NVM_E_BLOCK_PENDINGNVRAM block ID 已经入队或者正在被处理
3 NVM_E_PARAM_BLOCK_ID当BlockID超出范围时
4NVM_E_BLOCK_LOCKEDBlock 被锁
16             NvM_ReadAll1NVM_E_UNINIT NvM 模块未初始化
17NvM_WriteAll 1NVM_E_UNINIT NvM 模块未初始化
2NVM_E_WRITE_ONCE_STATUS_UNKNOWNblock 被配置为 NVM_WRITE_BLOCK_ONCE (TRUE),但是在进行 write 访问之前,没有执行 read 访问。
18NvM_CancelJobs1NVM_E_UNINIT NvM 模块未初始化
2 NVM_E_PARAM_BLOCK_ID当BlockID超出范围时
19NvM_SetBlockLockStatus 1NVM_E_UNINIT NvM 模块未初始化
2NVM_E_BLOCK_PENDINGNVRAM block ID 已经入队或者正在被处理
3NVM_E_BLOCK_CONFIG当 NvMWriteBlockOnce = TRUE 时
4 NVM_E_PARAM_BLOCK_ID当BlockID超出范围时
20       NvM_ValidateAll1NVM_E_UNINIT NvM 模块未初始化



 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值