参考文件
AUTOSAR_SWS_EEPROMDriver(4.3.0)
AUTOSAR_SWS_BSWGeneral(4.3.0)
EEPROM Module 文件结构
如上图所示 EEPROM Module应该主要包含Eep.c,Eep.h,Eep_Cfg.c,Eep_MemMmap.h,Eep_Lcfg.c和Eep_PBcfg.c文件,如果使用了中断则还应该包含Eep_Irq.c文件。
EEPROM Module 会使用一些通用的变量类型存在于Std_Type.h,Dem.h等文件中。
EEPROM Module 功能要求
EEPROM Module 通用的要求
EEPROM 模块应该包括内部Eeprom和外部Eeprom。
EEPROM模块应该包含基本的读、写、擦、比较四个作业,且必须全部异步实现功能。
EEPROM模块同一时间只能执行一个作业且不应该拥有作业的缓存队列等待功能。即同一时间只能存在一个队列,在作业执行中不应该接收其他作业请求。
错误分类
EEPROM模块应该分为=两大类错误,分别是:
1.开发错误:该类错误应该在产品开发阶段被检测到,基本为软件错误,当产品软件完成发布后不应该存在此类错误。
2.产品错误:该类错误为在产品中硬件错误或者软件无法避免的错误
开发错误
应该存在一个预编译的选项使得产品开发过程中可以选择是否检测开发错误
扩展的产品错误
EEP_E_ERASE_FAILED
EEP_E_WRITE_FAILED
EEP_E_READ_FAILED
EEP_E_READ_FAILED
当作业应该硬件原因失败时应该报告对应的产品错误,而当作业成功时也应该报告PASSED.
错误处理
开发错误应该使用通知函数的方式通知给Det模块,这些错误的出现将会停止正常的执行流程,停止或者重置ECU。
错误检测
API参数错误检测
如果EEPROM 模块使能了默认错误检测的预编译选项,则在执行Eep_Read(),Eep_Write(),Eep_Erase()和Eep_Compare()函数时,应该检查传入的数据地址是否合法,数据长度是否越界以及数据指针是否为空,同时返回相应的开发错误。如果默认错误检查没有使能,则错误全部返回E_NOT_OK。
Eep状态检测
在Eep_Read(),Eep_Write(),Eep_Erase()和Eep_Compare()函数中应该先检测Eep状态是否为空闲状态即MEMIF_IDLE。如果不是空闲状态,开启默认错误检测情况下,应该返回开发错误EEP_E_BUSY or EEP_E_UNINIT。否则返回E_NOT_OK
硬件错误
当遇到硬件错误时应该返回相应的扩展产品错误如下:EEP_E_ERASE_FAILED
EEP_E_WRITE_FAILED
EEP_E_READ_FAILED
EEP_E_READ_FAILED
超时错误
当作业超时时应该上报超时错误EEP_E_TIMEOUT
关于超时时间应该取决于所设定的最小数据单元写入的最大时间和作业需要写入数据单元数。
作业的执行要求
中断要求:
在硬件允许的条件下,应该配置预编译指令EepUseInterrupts来配置中断或者轮询模式。
如果开启了中断模式,中断函数应该调用一个额外的作业处理函数。
如果硬件不支持中断仍需要处理作业。
SPI要求:
对于通过SPI驱动外部EEPROM的Eep模块:
在普通EEPROM模式下,Eep模块应该通过使用配置为正常访问SPI EEPROM的SPI通道来访问外部EEPROM。
对于通过SPI驱动外部EEPROM的Eep模块:
在快速EEPROM模式下,Eep模块应使用配置为突发访问SPI EEPROM的SPI通道访问外部EEPROM。
作业模式:
对于读写擦除和比较这四个基本得作业任务,应该有两种模式可以选择,分别是正常模式和快速模式。
在普通模式下,作业应该在一个周期内只执行固定的字节大小,这个字节大小由参数EepNormalWriteBlockSize定义。
例如:
EepNormalWriteBlockSize = 1
Number of bytes to write: 4
Required number of job processing cycles: 4
Resulting write pattern: 1-1-1-1
在快速模式下,作业应该在一个周期内只执行固定的字节大小,这个字节大小由参数EepFastWriteBlockSize定义。
例如:
EepFastWriteBlockSize = 16
Number of bytes to write: 55
Required number of job processing cycles: 4
Resulting write pattern: 16-16-16-7
对于外部EEPROM驱动,如果设备不支持跨快速模式,应该使快速模式的行为与正常模式一致。
作业需求:
对于写和擦除作业,应该针对当前block先读取,如果数据与写入数据一致则跳过,如果不一致则执行写入操作。对于写作业不应该在函数内执行检查写入数据的操作,这一步应该仅在需要的时候通过比较作业来确认写入数据是否正确。
当写作业完成时,Eep模块将EEPROM状态设置为MEMIF_IDLE,并将作业结果设置为MEMIF_JOB_OK。如果配置了,Eep模块将调用配置参数EepJobEndNotification中定义的通知。
当在写作业处理过程中检测到错误时,Eep模块将中止该作业,将EEPROM状态设置为MEMIF_IDLE,并将作业结果设置为MEMIF_JOB_FAILED。如果配置了,Eep模块将调用配置参数EepJobErrorNotification中定义的通知。
当在比较作业处理过程中检测到被比较的数据区域不相等时,EEPROM驱动程序应中止该作业,设置EEPROM状态为MEMIF_IDLE,作业结果为MEMIF_BLOCK_INCONSISTENT。如果配置,则回调函数
将调用Eep_JobErrorNotification。
API详述:
略
预期的接口
强制调用的接口:
Dem_SetEventStatus :由sw - c或BSW模块调用,用于向Dem报告监视器状态信息。BSW模块调用Dem_SetEventStatus可以安全地忽略返回值。
可选择的接口:
Det_ReportError :用于报告开发错误的服务。
End Job Notification:
当作业完成并获得积极结果时,Eep模块将调用配置参数EepJobEndNotification中定义的回调函数
Read finished & OK
Write finished & OK
Erase finished & OK
Compare finished & data blocks are equal
配置参数中定义的回调函数EepJobEndNotification应该在中断级别上被调用。
Error Job Notification:
当作业被取消或终止且结果为负时,Eep模块将调用配置参数EepJobErrorNotification中定义的回调函数
Read aborted
Write aborted or failed
Erase aborted or failed
Compare aborted or data blocks are not equal.
配置参数中定义的回调函数EepJobErrorNotification应该在中断级别上被调用。
顺序图解
Initialization
Read/write/erase/compare
Cancelation of a running job
配置参数
略