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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/xsophiax/article/details/94722318

改进算法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;
}

猜你喜欢

转载自blog.csdn.net/xsophiax/article/details/94722318