小猫爪:S32K3学习笔记10-S32K3之EIM和ERM
- 1 前言
- 2 EIM(Error Injection Module)
- 3 ERM(Error Reporting Module)
- 4 MCAL配置和代码
- END
1 前言
这Safety第一站就是EIM(Error Injection Module)和ERM(Error Reporting Module)。看名字就知道这两个模块是一对大聪明,一个负责注入错误,一个负责汇报错误。
2 EIM(Error Injection Module)
首先得知道EIM这个注入错误的对象其实是S32K3的Memory。首先EIM把S32K3的整个Memory按照大小和功能总共分成了31个区域(众所周期,K3是有低配版,所以K3系列不是都有31个区域的,这一点具体得参考RM手册),然后为每个区域单独规划一个通道,即EIM总共有31个通道。
我截取部分通道如下(其他通道具体请参考RM手册EIM章节):
在表中能看到通道号和对应的区域,那么Data bits和Check bits,这两个东西代表着什么意思呢?其中Data bits指的是这个Memory总线上得数据位数,而Check bits则是对应的检验数。举个例子,在K3的Flash中是有ECC校验机制的,那么在这里,Data bits即为数据的位数,而Check bits即为ECC校验码的位数。
31个通道搞清楚了,那么EIM是怎么给目标区域注入错误的呢?EIM的功能框图如下所示:
可以很清楚的看到其实EIM的注入错误,并不是去真实的去改变目标地址的数据和校验值,而是在总线上做手脚,在data和check传输的过程中强行翻转bit,导致传输到其他模块的data和check不匹配,从而达到注入错误的目的。这手段简直就是树叶擦屁股,给爷漏了一手啊。所以说基于这个原理的话,只要你给相关区域注入了错误,那么只要访问这整个区域的任何一处地址那都会触发ECC错误。
原理搞清楚了,接下来看卡这个操作在寄存器中是怎么体现的。打开寄存器,EIM总共就三个寄存器,一个是EIMCR, EICHEN,EICHx_WORDy(x表示通道号),这也就意味着EIM的操作及其简单。
- 写EIMCR,使能全局EIM通道开关
- 写EICHEN,使能单个通道开关
- 写EICHx_WORDy,决定翻转data和check的哪一个bit,就把对应的bit置1(不同通道对应的bit分布在上面的表格中有描述)。
- 成功写入EICHx_WORDy后,EICHEN中单个通道的开关会被Disable。
这里需要注意一点,data和check建议只翻转一个,而且翻转控制在1bit和2bit。如果超过2bit的话可能会导致意想不到的事情发生。
3 ERM(Error Reporting Module)
再来看看EIM的大兄弟ERM,EIM负责注入错误,而ERM负责汇报错误。当然ERM不仅仅能汇报EIM注入的错误,只要是Memory处出现了相关的错误,那么ERM都能够检测出来。在这里可以提一下,这里的错误指的是相关Memory发生了ECC错误,因为K3的Memory都是有ECC检测机制的。
ERM则是根据访问Memory的不同主机以及访问的不同区域划分出不同的Module,每个module对应一个通道,总共有20个通道,如下:
在表中可以清晰的看到不同通道号对应的不同Module,以及一个叫做Capture Status,描述了当ERM检测到memory错误时,它最后能汇报出的该错误的信息。其中single-bit error和multi-bit error为错误类型,其中single为可纠正错误,而multi为不可纠正错误;sysdrome为ECC校验的sysdrome值,此外还有发生错误的物理地址。
这里扯个题外话,有人可能会有疑问,表中的17,18,19三个通道分别是FLASH的port0,1,2,这三个port分别代表什么?这就要涉及到K3的FLASH的访问端口了,K3根据FLASH的不同访问主机整出了三个访问端口,如下:
其中p0是给CM7_0用的,p2是给CM7_用的,而p1则是给其他主机用的,如HSE,DMA。这就是ERM通道表中17,18,19通道的由来。
ERM的工作机制非常简单,当检测到Memory发生了ECC错误的时候,相关标志置位,记录错误发生的地址和sysdrome,如果使能了中断,那么会产生相应的中断。
再来看看其在寄存器中的体现,ERM的寄存器有CRx, SRx,EARx,SYNx,CORR_ERR_CNTx(x表示通道号)。
- 配置CRx,根据需求使能相关中断
- 检测到错误时,SRx相关标志置位
- EARx记录发生错误的地址,SYNx记录ECC sysdrome
- CORR_ERR_CNTx错误累加器加1
- 如果使能了中断,则产生中断,用户可在中断中进行相关错误处理操作
4 MCAL配置和代码
EIM和ERM的MCAL的配置非常简单,甚至在MCAL中都没有单独的配置模块和分块,如果要使用EIM和ERM,只需要在Mcu模块中使能一下两者的时钟即可,如下:
关于EIM和ERM的MCAL驱动不在RTD标准包里面,而是在SPD软件包里,SPD在NXP官网上就可以下载,下载完发现在SPD的安装包里面只有四个模块:
EIM和ERM的功能则是集成在了eMcem中,而关于EIM和ERM的使用大多就是使用EIM注入错误,用ERM得到错误信息并处理。与EIM和ERM有关的函数有如下:
//注入错误
Std_ReturnType eMcem_InjectFault( eMcem_FaultType nFaultId );
//清除错误标记
Std_ReturnType eMcem_ClearFaults( eMcem_FaultType nFaultId );
//获取ERM错误信息
Std_ReturnType eMcem_GetMemErrInfo( eMcem_ChannelType nChannelId, eMcem_MemErrInfoType *pInfo );
//配置EIM错误bit
Std_ReturnType eMcem_SetupInjectionChannel( eMcem_FaultType nChannelId, uint16 u16BitPos1, uint16 u16BitPos2 );
在这里就不做例子了,因为除了ERM(负责收集Memory的ECC错误)之外,K3还有一个更大的错误收集器,那就是FCCU,它可以收集ERM所有的错误,此外,它还收集了K3内部的所有错误,所以一般都是使用EIM注入错误,使用FCCU来处理,而ERM只是用来协助错误处理的工具人。等说到FCCU的时候,将三者集合在一起出个示例。