概述
本文根据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
错误包括:
- Development Errors(开发错误);
- Runtime Errors(运行错误);
- Production Errors(生产错误);
Error Classification | ||||||||
Development Errors | Runtime Errors | Production Errors | ||||||
1 | NVM_E_PARAM_BLOCK_ID (0x0A) | 入参错误 | 1 | NVM_E_QUEUE_FULL | Queue已满,不能再接受新的入队请求,适用于 standard or immediate 类型的NVRAM block | 1 | NVM_E_HARDWARE | read(single / multi) 失败:即 MemeIf 报告 MEMIF_JOB_FAILED, MEMIF_BLOCK_INCONSISTENT; CRC不匹配; write/invalidate/erase 失败:即 MEMIf 报告 MEMIF_JOB_FAILED; |
2 | NVM_E_PARAM_BLOCK_TYPE | 2 | NVM_E_INTEGRITY_FAILED | 底层模块(Fls、Memif)的read 操作完成,在NVM 层进行CRC校验时,检测到 数据损坏 和/或CRC损坏 | ||||
3 | NVM_E_PARAM_BLOCK_DATA_IDX (0x0C) | 3 | NVM_E_REQ_FAILED | read 请求(包括所有的重读(retry))在底层模块的处理(Memif/Fls)的操作失败。 底层模块操作失败的情况包括: NvM的请求被底层模块拒绝; NvM的请求被底层模块接受,但是请求失败:底层模块返回 JobErrorNotification; 当然,FAILED 的结论是在所有retry 都失败之后的结论。 | ||||
4 | NVM_E_PARAM_ADDRESS (0x0D) | 4 | NVM_E_WRONG_BLOCK_ID | read 期间,底层模块顺利完成read 操作,但是,static ID 检查失败。意味着实际读取的 NvM block 和 想要读取的 NvM block 不一致。 | ||||
5 | NVM_E_PARAM_DATA (0x0E) | 5 | NVM_E_VERIFY_FAILED | write 操作顺利完成,但是岁写入数据的验证失败。当前,这个结果在所有的retry 失败后才得出 | ||||
6 | NVM_E_PARAM_POINTER (0x0F) | 6 | NVM_E_LOSS_OF_REDUNDANCY | 两个 block 实例中的内容不一致; 或者第一个 block 实例损坏(不管第二个 block 实例如何,完好或者损坏); 或者第一个 block 实例不能被读取(不管第二个 block 实例如何,可以或者不可以读取),NvM 就会报告这个错误。 | ||||
7 | NVM_E_BLOCK_WITHOUT_DEFAULTS (0x11) | 7 | NVM_E_WRITE_PROTECTED | 当 write 一个被设置了 write protection的NVM block时 | ||||
8 | NVM_E_UNINIT | NvM 模块没有完成初始化 | ||||||
9 | NVM_E_BLOCK_PENDING | 被请求的NVRAM block正在被处理时,新的read/write/control 请求会失败,并返回该错误码 | ||||||
10 | NVM_E_BLOCK_CONFIG | 由于配置,NVMRAM block不能使用该API | ||||||
11 | NVM_E_BLOCK_LOCKED | 因为RAM block 被锁定,write 失败 | ||||||
12 | NVM_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):
- - NVM_E_PARAM_BLOCK_ID (0x0A)
- - NVM_E_PARAM_BLOCK_TYPE
- - NVM_E_PARAM_BLOCK_DATA_IDX (0x0C)
- - NVM_E_PARAM_ADDRESS (0x0D)
- - NVM_E_PARAM_DATA (0x0E)
- - NVM_E_PARAM_POINTER (0x0F)
- - 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:
- read(single / multi) 失败:即 MemeIf 报告 MEMIF_JOB_FAILED, MEMIF_BLOCK_INCONSISTENT;
- CRC不匹配;
- write/invalidate/erase 失败:即 MEMIf 报告 MEMIF_JOB_FAILED;
7.3.5 Extended Production Errors
Type or error | Related error code | Value [hex] | ||
The processing of the read service detects an inconsistency | 处理read时检测到数据一致性丧失 | NVM_E_INTEGRITY_FAILED | Assigned by DEM |
仅适用于配置了CRC的NvM block。 |
The processing of the service fails | 请求失败 | NVM_E_REQ_FAILED | Assigned by DEM | |
The Static Block ID check during read failed | read期间静态ID检查失败 | NVM_E_WRONG_BLOCK_ID | Assigned by DEM | 前提:启用 Static Block ID check |
The write verification failed | 写验证失败 | NVM_E_VERIFY_FAILED | Assigned by DEM | 前提:启用 write Verification failed |
There is a loss of redundancy for a block of redundant type | redundant类型的 NVM block 块丢失冗余性 | NVM_E_LOSS_OF_REDUNDANCY | Assigned by DEM | 前提:Redundant 类型的NVRAM block |
There is a write attempt to a NVRAM block with write protection | 写设置了写保护的 NVM block | NVM_E_WRITE_PROTECTED | Assigned 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)的操作失败。
底层模块操作失败的情况包括:
- NvM的请求被底层模块拒绝;
- NvM的请求被底层模块接受,但是请求失败:底层模块返回 JobErrorNotification;
- 当然,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会报告这个错误,如果:
- 两个 block 实例中的内容不一致;
- 或者第一个 block 实例损坏(不管第二个 block 实例如何,完好或者损坏);
- 或者第一个 block 实例不能被读取(不管第二个 block 实例如何,可以或者不可以读取),NvM 就会报告这个错误。
7.3.5.6 NVM_E_WRITE_PROTECTED
当 write 一个被设置了 write protection的NVM block时。
write protection 的设置有两种方式:
- 配置时 启用 write protection;
- 使用 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 | 发生场景 | |
1 | NvM_SetDataIndex | 1 | NVM_E_UNINIT | NvM 模块未初始化 |
2 | NVM_E_BLOCK_PENDING | NVRAM block ID 已经入队或者正在被处理 | ||
3 | NVM_E_PARAM_BLOCK_DATA_IDX | 当DataIndex超过已配置的 dataset 总数时 | ||
4 | NVM_E_PARAM_BLOCK_ID | 当BlockID超出范围时 | ||
2 | NvM_GetDataIndex | 1 | NVM_E_UNINIT | NvM 模块未初始化 |
2 | NVM_E_PARAM_BLOCK_ID | 当BlockID超出范围时 | ||
3 | NVM_E_PARAM_DATA | 当入参DataIndexPtr为 NULL pointer | ||
3 | NvM_SetBlockProtection | 1 | NVM_E_UNINIT | NvM 模块未初始化 |
2 | NVM_E_BLOCK_PENDING | 当NVRAM block ID已经入队或者正在被处理 | ||
3 | NVM_E_BLOCK_CONFIG | 当 NvMWriteBlockOnce = TRUE 时 | ||
4 | NVM_E_PARAM_BLOCK_ID | 当BlockID超出范围时 | ||
5 | NVM_E_BLOCK_LOCKED | 当 Block 被锁时 | ||
4 | NvM_GetErrorStatus | 1 | NVM_E_UNINIT | NvM 模块未初始化 |
2 | NVM_E_PARAM_BLOCK_ID | 当BlockID超出范围时 | ||
3 | NVM_E_PARAM_DATA | 当入参 RequestResultPtr 为 NULL pointer | ||
5 | NvM_GetVersionInfo | 1 | NVM_E_PARAM_POINTER | 当入参 versioninfo 为 NULL pointer |
6 | NvM_ReadBlock | 1 | NVM_E_UNINIT | NvM 模块未初始化 |
2 | NVM_E_BLOCK_PENDING | NVRAM block ID 已经入队或者正在被处理 | ||
3 | NVM_E_PARAM_ADDRESS | 1. 既没有配置Permanent RAM block 也没有配置显示同步机制; 2. 入参 NvM_DstPtr 为 NULL Pointer | ||
4 | NVM_E_PARAM_BLOCK_ID | 当BlockID超出范围时 | ||
7 | NvM_ReadPRAMBlock | 1 | NVM_E_UNINIT | NvM 模块未初始化 |
2 | NVM_E_BLOCK_PENDING | NVRAM block ID 已经入队或者正在被处理 | ||
3 | NVM_E_PARAM_ADDRESS | 对于接收到的 Block ID 既没有配置Permanent RAM block 也没有配置显示同步机制; | ||
4 | NVM_E_PARAM_BLOCK_ID | 当BlockID超出范围时 | ||
8 | NvM_WriteBlock | 1 | NVM_E_UNINIT | NvM 模块未初始化 |
2 | NVM_E_BLOCK_PENDING | NVRAM block ID 已经入队或者正在被处理 | ||
3 | NVM_E_PARAM_ADDRESS | 1. 既没有配置Permanent RAM block 也没有配置显示同步机制; 2. 入参 NvM_DstPtr 为 NULL Pointer | ||
4 | NVM_E_PARAM_BLOCK_ID | 当BlockID超出范围时 | ||
5 | NVM_E_BLOCK_LOCKED | Block 被锁 | ||
6 | NVM_E_WRITE_ONCE_STATUS_UNKNOWN | block 被配置为 NVM_WRITE_BLOCK_ONCE (TRUE),但是在进行 write 访问之前,没有执行 read 访问。 | ||
9 | NvM_WritePRAMBlock | 1 | NVM_E_UNINIT | NvM 模块未初始化 |
2 | NVM_E_BLOCK_PENDING | NVRAM block ID 已经入队或者正在被处理 | ||
3 | NVM_E_PARAM_ADDRESS | 既没有配置Permanent RAM block 也没有配置显示同步机制; | ||
4 | NVM_E_PARAM_BLOCK_ID | 当BlockID超出范围时 | ||
5 | NVM_E_BLOCK_LOCKED | Block 被锁 | ||
6 | NVM_E_WRITE_ONCE_STATUS_UNKNOWN | block 被配置为 NVM_WRITE_BLOCK_ONCE (TRUE),但是在进行 write 访问之前,没有执行 read 访问。 | ||
10 | NvM_RestoreBlockDefaults | 1 | NVM_E_UNINIT | NvM 模块未初始化 |
2 | NVM_E_BLOCK_PENDING | NVRAM block ID 已经入队或者正在被处理 | ||
3 | NVM_E_PARAM_ADDRESS | 1. 既没有配置Permanent RAM block 也没有配置显示同步机制; 2. 入参 NvM_DstPtr 为 NULL Pointer | ||
4 | NVM_E_PARAM_BLOCK_ID | 当BlockID超出范围时 | ||
11 | NvM_RestorePRAMBlockDefaults | 1 | NVM_E_UNINIT | NvM 模块未初始化 |
2 | NVM_E_BLOCK_PENDING | NVRAM block ID 已经入队或者正在被处理 | ||
3 | NVM_E_PARAM_ADDRESS | 既没有配置Permanent RAM block 也没有配置显示同步机制; | ||
4 | NVM_E_PARAM_BLOCK_ID | 当BlockID超出范围时 | ||
12 | NvM_EraseNvBlock | 1 | NVM_E_UNINIT | NvM 模块未初始化 |
2 | NVM_E_BLOCK_PENDING | NVRAM block ID 已经入队或者正在被处理 | ||
3 | NVM_E_PARAM_BLOCK_ID | 当BlockID超出范围时 | ||
4 | NVM_E_BLOCK_CONFIG | Block 优先级不是 immediate (0) | ||
5 | NVM_E_BLOCK_LOCKED | Block 被锁 | ||
6 | NVM_E_WRITE_ONCE_STATUS_UNKNOWN | block 被配置为 NVM_WRITE_BLOCK_ONCE (TRUE),但是在进行 write 访问之前,没有执行 read 访问。 | ||
13 | NvM_CancelWriteAll | 1 | NVM_E_UNINIT | NvM 模块未初始化 |
14 | NvM_InvalidateNvBlock | 1 | NVM_E_UNINIT | NvM 模块未初始化 |
2 | NVM_E_BLOCK_PENDING | NVRAM block ID 已经入队或者正在被处理 | ||
3 | NVM_E_PARAM_BLOCK_ID | 当BlockID超出范围时 | ||
4 | NVM_E_BLOCK_LOCKED | Block 被锁 | ||
5 | NVM_E_WRITE_ONCE_STATUS_UNKNOWN | block 被配置为 NVM_WRITE_BLOCK_ONCE (TRUE),但是在进行 write 访问之前,没有执行 read 访问。 | ||
15 | NvM_SetRamBlockStatus | 1 | NVM_E_UNINIT | NvM 模块未初始化 |
2 | NVM_E_BLOCK_PENDING | NVRAM block ID 已经入队或者正在被处理 | ||
3 | NVM_E_PARAM_BLOCK_ID | 当BlockID超出范围时 | ||
4 | NVM_E_BLOCK_LOCKED | Block 被锁 | ||
16 | NvM_ReadAll | 1 | NVM_E_UNINIT | NvM 模块未初始化 |
17 | NvM_WriteAll | 1 | NVM_E_UNINIT | NvM 模块未初始化 |
2 | NVM_E_WRITE_ONCE_STATUS_UNKNOWN | block 被配置为 NVM_WRITE_BLOCK_ONCE (TRUE),但是在进行 write 访问之前,没有执行 read 访问。 | ||
18 | NvM_CancelJobs | 1 | NVM_E_UNINIT | NvM 模块未初始化 |
2 | NVM_E_PARAM_BLOCK_ID | 当BlockID超出范围时 | ||
19 | NvM_SetBlockLockStatus | 1 | NVM_E_UNINIT | NvM 模块未初始化 |
2 | NVM_E_BLOCK_PENDING | NVRAM block ID 已经入队或者正在被处理 | ||
3 | NVM_E_BLOCK_CONFIG | 当 NvMWriteBlockOnce = TRUE 时 | ||
4 | NVM_E_PARAM_BLOCK_ID | 当BlockID超出范围时 | ||
20 | NvM_ValidateAll | 1 | NVM_E_UNINIT | NvM 模块未初始化 |
最后
以上就是沉静白开水为你收集整理的AUTOSAR —— NVM 37.3 Error Classification的全部内容,希望文章能够帮你解决AUTOSAR —— NVM 37.3 Error Classification所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复