单片机RAM检测算法的改进与C实现

17 篇文章 0 订阅
3 篇文章 0 订阅

改进算法MNX 如下所示,^ : 表示顺序写入;不带^表示逆序:

^(w0); ^(r0,w1); (r1,w0);(r0)

伪代码,m表示读取,M表示写入:

for (i = 0; i < n; i++){M(i)=0;}

for (i = 0; i < n; i++){
    if (m(i)=0){M(i)=1;}Else{return fail;}
}

for (i = n-1; i >=0; i--){
    if (m(i)=1){M(i)=0;}Else{return fail;}
}

for (i = n-1; i >=0; i--){
    if (m(i)=0){;}Else{return fail;}
}

C实现,其中start_addr, finish_addr是RAM的开始地址与结束地址;而MARCH_DATA_CODE为背景数据;

以32bit为示例,可以选择如下一项或者几项进行覆盖测试。

/*
* background data list:
* 1. 0x00000000
  2. 0x33333333
  3. 0x55555555
  4. 0x0F0F0F0F
  5. 0x00FF00FF
  6. 0x0000FFFF
* _SRAM_Err_Region 指示Err区域地址以及content
* DETECT_RAM_EN : 是否检测到首次就直接退出,或者全部扫测完成
*/
UINT32 _SRAM_MarchX ( UINT32* start_addr, UINT32* finish_addr, UINT32 MARCH_DATA_CODE )
{
	UINT32 res = NO_ERROR;
	UINT32 volatile* pAddr32;
	UINT32 cell[1];

	for ( pAddr32 = start_addr; pAddr32 < finish_addr; pAddr32 ++ )
	{
		* ( pAddr32 + 0 ) = MARCH_DATA_CODE;
	}

	for ( pAddr32 = start_addr; pAddr32 < finish_addr; pAddr32 ++ )
	{
		* ( cell + 0 ) = * ( pAddr32 + 0 );

		if ( * ( cell + 0 ) == MARCH_DATA_CODE )
		{
			* ( pAddr32 + 0 ) = ~MARCH_DATA_CODE;
		}
		else
		{
			_SRAM_Err_Region ( ( UINT32 ) ( pAddr32 + 0 ), cell, 4 );

			res = SRAM_TEST_FAILED;

#if (DETECT_RAM_EN>0)
			return res;
#endif
		}
	}

	for ( pAddr32 = finish_addr - 1; pAddr32 >= start_addr + 1; pAddr32 -- )
	{
		* ( cell + 0 ) = * ( pAddr32 + 0 );

		if ( * ( cell + 0 ) == ~MARCH_DATA_CODE )
		{
			* ( pAddr32 + 0 ) = MARCH_DATA_CODE;
		}
		else
		{
			_SRAM_Err_Region ( ( UINT32 ) ( pAddr32 + 0 ), cell, 4 );

			res = SRAM_TEST_FAILED;

#if (DETECT_RAM_EN>0)
			return res;
#endif
		}
	}

	for ( pAddr32 = finish_addr - 1; pAddr32 >= start_addr + 1; pAddr32 -- )
	{
		* ( cell + 0 ) = * ( pAddr32 + 0 );

		if ( * ( cell + 0 ) == MARCH_DATA_CODE )
		{
			;
		}
		else
		{
			_SRAM_Err_Region ( ( UINT32 ) ( pAddr32 + 0 ), cell, 4 );

			res = SRAM_TEST_FAILED;

#if (DETECT_RAM_EN>0)
			return res;
#endif
		}
	}

	return res;
}

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值