一、简介
本文主要介绍,在开发MPC5746R功能安全需求中遇到的MEMU报Overflow故障的分析以及解决办法。
二、故障描述
一共遇到两个问题:
1. 通过OverProgram方式植入ECC故障后,MEMU会直接复位,并不会通过FCCU置故障
2. 上电报System Ram Overflow故障
根据RM指示,此问题属于初始化顺序问题,需要在Core0启动之前初始化IMEM
三、解决方式
问题1: 使能系统中断
因为,MACOSAR OS 会自己管理这三Exception,如果发生ECC故障会直接进Hook,通过Hook函数,进入EcuM_Shutdown状态,为了避免这种情况,需要自己处理这三个Exception.在中断服务函数中执行Memu_Handler。
void Memu_Handler(void)
{
uint8 loopCnt=0;
uint32 MEMU_ERR_FLAG_Value = 0x0;
MEMU_ERR_FLAG_Value = MEMU.ERR_FLAG.R;
IF(MEMU_ERR_FLAG_Value & MEMU_ERR_FLAG_FLASH_ECC_ALL)检查是否存在FLASH ECC故障
{
if(MEMU_ERR_FLAG_value & MEMU_ERR_FLAG_F_UCE)
{
MEMU.FLASH_UNCERR_STS.R = 0x80000000;
}
if(MEMU_ERR_FLAG_vaule & MEMU_ERR_FLAG_F_CE)
{
for(loopCnt=0;loopCnt<20;loopCnt++)
{
if(1 == MEMU.FLASH_CERR[loopCnt].STS.B.VLD)
{
MEMU.FLASH_CERR[loopCnt].STS.R = 0x80000000;
}
}
}
if(MEMU_ERR_FLAG_Value & MEMU_ERR_FLAG_FLASH_OVERFLOW)
{
}
}
IF(MEMU_ERR_FLAG_Value & MEMU_ERR_FLAG_PHRRAM_ECC_ALL)//检查是否存在Peripheral RAM ECC故障
{
}
IF(MEMU_ERR_FLAG_Vault & MEMU_ERR_FLAG_SYSRAM_ECC_ALL)//检查是否存在System Ram ECC故障
{
}
MEMU.ERR_FLAG.R = 0xFFFFFFFF;//clear All MEMU error Flag;
}
问题2:
这个问题是因为在Core0启动之前还没初始化IMEM,在BsrStartup.c中增加对应部分的初始化。
IMEM 在ld文件中的定义
部分初始化代码
进行初始化之后,还可能出现下电后重新上电报overflow故障,需要在上电初始化时清除这些故障即可!