当Fls中发生ECC故障时的处理方法(S32K146)

学习目标:

1、模拟FLASH ECC故障
2、解决ECC故障

学习内容:

1、模拟FLASH ECC故障
当Flash内容被意外篡改时(电磁干扰、低压写入),再去对flash进行如下操作时,就会产生ECC故障
在这里插入图片描述
发生该故障后,想要根据实际环境复现相当不容易,这个时候我们可以通过Fls_Write()函数向Flash同一个地址,连续写入不同的数据来模拟ECC故障的产生,该方法实测有效。
补充:实际测试的时候发现不是所有sector重复写入时都能成功复现ECC故障,像保存cluster头信息的扇区写入时能更有效复现该故障。
2、解决ECC故障
根据NXP官方文档《AN12522》3.2 不可纠正错误的ECC,当Flash中产生ECC故障时
多bit错误和bus fasult错误都会导致程序进入HardFault_Handler,这也就意味着S32K146不能像S32K3x那样通过关闭ECC中断使能位来关闭该故障。
在这里插入图片描述
这个时候就只能在HardFault_Handler()中添加程序来处理该故障。

void HardFault_Handler(void)
{
	//以下代码获取跑飞前的寄存器
	__asm__("MOVS R0, #4");
    __asm__("MOV R1, LR");
    __asm__("TST R1, R0");     // Test LR (EXC_RETURN[2])
    __asm__("ITE NE");
    __asm__("MRSNE R1, PSP");  // EXC_RETURN[2] = 1 PSP
    __asm__("MRSEQ R1, MSP");  // EXC_RETURN[2] = 0 MSP
    __asm__("LDR R0, =stack_pointer");
    __asm__("STR R1, [R0]"); // Store MSP or PSP into stack_pointer

    p_stack_frame = (uint32_t*)(stack_pointer+8);
    program_counter  = p_stack_frame[6];  // holds the address of the instruction that has caused the exception
	//R0,R1,R2,R3,R12,LR,PC,PSR
	R_reg[0] = p_stack_frame[0];
	R_reg[1] = p_stack_frame[1];
	R_reg[2] = p_stack_frame[2];
	R_reg[3] = p_stack_frame[3];
	R_reg[4] = p_stack_frame[4];
	R_reg[5] = p_stack_frame[5];
	R_reg[6] = p_stack_frame[6];
	R_reg[7] = p_stack_frame[7];
	if((IP_FTFC->FERSTAT & (0x01<<1)) != 0)								
	{
		/*1、跳转当前指令+更新Fls状态机*/
		uint8 status = 0;
		S32_SCB->CFSR |= 1<<9;											
		ECC_ADDRESS = S32_SCB->BFAR;  								
		excDetails.instruction_pt = (uint8_t *) &p_stack_frame[6];
		excDetails.data_pt        = ECC_ADDRESS;
		excDetails.syndrome_u32 = FTFC_DSI_EXC_SYNDROME;
		specificHandlerResult = Fls_DsiHandler( &excDetails ); 		
		p_stack_frame[6] += 2;
		/*2、擦除坏块*/
		status = Fls_Erase(2048,2048);								
		while (MEMIF_IDLE != Fls_GetStatus())
		{
		  Fls_MainFunction();										
		}
		return;
	}else{
		while(TRUE){};
	}
}
上述代码提供了两种解决方法,方法1、是获取Fls_DsiHandler相关参数,更新状态机,跳转该指令,保证当前程序可以正常运行。直到当前cluster写满进行swap操作时,才对坏块进行擦除
2、获取坏块的地址,判断当前错误地址所属sector,擦除后直接返回。
两种方式都可以避免程序变砖的情况
![在这里插入图片描述](https://img-blog.csdnimg.cn/bca4a2b10d5a4950ad9419c23a5fac09.png)
3、使用 Fls_Erase()函数擦除坏块后可能破坏Fee的Cluster信息,擦除后建议重新初始化Fee(经过多次测试,擦除后确实会偶发Cluster头信息丢失的情况)



  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
如果两个ArcGIS图层使用相同的坐标系却不重合,可能是以下几个原因导致的: 1. 数据源不精确:两个图层可能来自不同的数据源,其一个数据源可能存在位置不准确的问题。这可能是由于数据收集或转换过程的误差导致的。 2. 坐标系设置错误:尽管两个图层使用相同的坐标系,但可能其一个图层的坐标系设置不正确。在ArcGIS,每个图层都有自己的坐标系设置,可能其一个图层的坐标系设置错误,导致图层位置不正确。 3. 投影问题:在ArcGIS,如果两个图层使用不同的投影方式,即使它们使用相同的地理坐标系,也可能不重合。投影方式的不同会导致坐标的变换,使得两个图层的位置不一致。 解决这个问题的方法有以下几种: 1. 检查数据源:检查两个图层的数据源,确保数据源的位置信息准确无误。可以使用其他GIS软件或在线地图来验证数据源的位置。 2. 检查坐标系设置:在ArcGIS检查两个图层的坐标系设置,确保它们都正确设置为相同的坐标系。 3. 进行投影转换:如果两个图层使用不同的投影方式,并且需要进行重合分析或空间分析,可以使用ArcGIS的投影工具进行投影转换,将两个图层的投影方式设置为一致,再进行分析。 4. 使用其他辅助工具:如果上述方法无法解决问题,可以尝试使用其他GIS软件或在线地图,比较两个图层的位置信息,以确定问题的具体原因。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值