当前位置:   article > 正文

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

ram自检算法

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

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

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

  1. for (i = 0; i < n; i++){M(i)=0;}
  2. for (i = 0; i < n; i++){
  3. if (m(i)=0){M(i)=1;}Else{return fail;}
  4. }
  5. for (i = n-1; i >=0; i--){
  6. if (m(i)=1){M(i)=0;}Else{return fail;}
  7. }
  8. for (i = n-1; i >=0; i--){
  9. if (m(i)=0){;}Else{return fail;}
  10. }

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

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

  1. /*
  2. * background data list:
  3. * 1. 0x00000000
  4. 2. 0x33333333
  5. 3. 0x55555555
  6. 4. 0x0F0F0F0F
  7. 5. 0x00FF00FF
  8. 6. 0x0000FFFF
  9. * _SRAM_Err_Region 指示Err区域地址以及content
  10. * DETECT_RAM_EN : 是否检测到首次就直接退出,或者全部扫测完成
  11. */
  12. UINT32 _SRAM_MarchX ( UINT32* start_addr, UINT32* finish_addr, UINT32 MARCH_DATA_CODE )
  13. {
  14. UINT32 res = NO_ERROR;
  15. UINT32 volatile* pAddr32;
  16. UINT32 cell[1];
  17. for ( pAddr32 = start_addr; pAddr32 < finish_addr; pAddr32 ++ )
  18. {
  19. * ( pAddr32 + 0 ) = MARCH_DATA_CODE;
  20. }
  21. for ( pAddr32 = start_addr; pAddr32 < finish_addr; pAddr32 ++ )
  22. {
  23. * ( cell + 0 ) = * ( pAddr32 + 0 );
  24. if ( * ( cell + 0 ) == MARCH_DATA_CODE )
  25. {
  26. * ( pAddr32 + 0 ) = ~MARCH_DATA_CODE;
  27. }
  28. else
  29. {
  30. _SRAM_Err_Region ( ( UINT32 ) ( pAddr32 + 0 ), cell, 4 );
  31. res = SRAM_TEST_FAILED;
  32. #if (DETECT_RAM_EN>0)
  33. return res;
  34. #endif
  35. }
  36. }
  37. for ( pAddr32 = finish_addr - 1; pAddr32 >= start_addr + 1; pAddr32 -- )
  38. {
  39. * ( cell + 0 ) = * ( pAddr32 + 0 );
  40. if ( * ( cell + 0 ) == ~MARCH_DATA_CODE )
  41. {
  42. * ( pAddr32 + 0 ) = MARCH_DATA_CODE;
  43. }
  44. else
  45. {
  46. _SRAM_Err_Region ( ( UINT32 ) ( pAddr32 + 0 ), cell, 4 );
  47. res = SRAM_TEST_FAILED;
  48. #if (DETECT_RAM_EN>0)
  49. return res;
  50. #endif
  51. }
  52. }
  53. for ( pAddr32 = finish_addr - 1; pAddr32 >= start_addr + 1; pAddr32 -- )
  54. {
  55. * ( cell + 0 ) = * ( pAddr32 + 0 );
  56. if ( * ( cell + 0 ) == MARCH_DATA_CODE )
  57. {
  58. ;
  59. }
  60. else
  61. {
  62. _SRAM_Err_Region ( ( UINT32 ) ( pAddr32 + 0 ), cell, 4 );
  63. res = SRAM_TEST_FAILED;
  64. #if (DETECT_RAM_EN>0)
  65. return res;
  66. #endif
  67. }
  68. }
  69. return res;
  70. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/314471
推荐阅读
相关标签
  

闽ICP备14008679号