stm32fxx_STURunTimeCheck.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. #include "stm32f1xx_hal.h"
  2. #include "stm32fxx_STUlib.h"
  3. ErrorStatus STU_CheckStack(void);
  4. void STU_InitStackBottom(void);
  5. void STU_InitRunTimeChecks(void)
  6. {
  7. STU_RamRunInit();
  8. STU_RomCrc32Init();
  9. STU_InitStackBottom();
  10. // STU_ClockTestInit();
  11. }
  12. void STU_DoRunTimeChecks(void)
  13. {
  14. STU_TestStatus rom_test;
  15. if(TimeBaseFlag == 0xAAAAAAAAuL)
  16. {
  17. if ((TimeBaseFlag ^ TimeBaseFlagInv) == 0xFFFFFFFFuL) //ʱ¼ä±êÖ¾
  18. {
  19. /* Initialization of counters for control flow monitoring */
  20. init_control_flow();
  21. /*----------------------------------------------------------------------*/
  22. /*---------------------------- CPU registers ----------------------------*/
  23. /*----------------------------------------------------------------------*/
  24. control_flow_call(CPU_TEST_CALLER);
  25. STU_CpuTestRun();
  26. control_flow_resume(CPU_TEST_CALLER);
  27. /*----------------------------------------------------------------------*/
  28. /*------------------------- Stack overflow -----------------------------*/
  29. /*----------------------------------------------------------------------*/
  30. control_flow_call(STACK_OVERFLOW_TEST);
  31. if (STU_CheckStack() == ERROR)
  32. {
  33. FailSafePOR();
  34. }
  35. control_flow_resume(STACK_OVERFLOW_TEST);
  36. /*--------------------------------------------------------------------------*/
  37. /*--------------------- ROM CRC check ------------------------*/
  38. /*--------------------------------------------------------------------------*/
  39. control_flow_call(CRC32_TEST_CALLER);
  40. rom_test = STU_RomCrc32Run();
  41. switch ( rom_test )
  42. {
  43. case TEST_RUNNING:
  44. break;
  45. case TEST_OK:
  46. break;
  47. case TEST_FAILURE:
  48. FailSafePOR();
  49. break;
  50. case CLASS_C_DATA_FAIL:
  51. default:
  52. FailSafePOR();
  53. break;
  54. }
  55. control_flow_resume(CRC32_TEST_CALLER);
  56. /*--------------------------------------------------------------------------*/
  57. /* --------------------- Instruct and decode test -------------------*/
  58. /*--------------------------------------------------------------------------*/
  59. control_flow_call(INSTRUCT_AND_DECODE_TEST_CALLER);
  60. if(STU_InstructAndDecode() == ERROR)
  61. {
  62. FailSafePOR();
  63. }
  64. control_flow_resume(INSTRUCT_AND_DECODE_TEST_CALLER);
  65. /*--------------------------------------------------------------------------*/
  66. /* --------------------- Addressing test -------------------*/
  67. /*--------------------------------------------------------------------------*/
  68. control_flow_call(ADDRESSING_TEST_CALLER);
  69. if(STU_AddressingTest() == ERROR)
  70. {
  71. FailSafePOR();
  72. }
  73. control_flow_resume(ADDRESSING_TEST_CALLER);
  74. /*--------------------------------------------------------------------------*/
  75. /*--------------------- Verify Control flow ----------------------------*/
  76. /*--------------------------------------------------------------------------*/
  77. if (control_flow_check_point(RUNTIME_TEST_CHECK) == ERROR)
  78. {
  79. FailSafePOR();
  80. }
  81. /******Çå³ýʱ¼ä±êÖ¾*******/
  82. TimeBaseFlag = 0u;
  83. }
  84. else
  85. {
  86. FailSafePOR();
  87. }
  88. }
  89. }
  90. void STU_InitStackBottom(void)
  91. {
  92. aStackOverFlowPtrn[0] = 0xEEEEEEEEuL;
  93. aStackOverFlowPtrn[1] = 0xCCCCCCCCuL;
  94. aStackOverFlowPtrn[2] = 0xBBBBBBBBuL;
  95. aStackOverFlowPtrn[3] = 0xDDDDDDDDuL;
  96. }
  97. /**
  98. * @brief This function verifies that Stack didn't overflow
  99. * @param : None
  100. * @retval : ErrorStatus = (ERROR, SUCCESS)
  101. */
  102. ErrorStatus STU_CheckStack(void)
  103. {
  104. ErrorStatus result = SUCCESS;
  105. //CtrlFlowCnt += STACK_OVERFLOW_CALLEE;
  106. if ( aStackOverFlowPtrn[0] != 0xEEEEEEEEuL )
  107. {
  108. result = ERROR;
  109. }
  110. if ( aStackOverFlowPtrn[1] != 0xCCCCCCCCuL )
  111. {
  112. result = ERROR;
  113. }
  114. if ( aStackOverFlowPtrn[2] != 0xBBBBBBBBuL )
  115. {
  116. result = ERROR;
  117. }
  118. if ( aStackOverFlowPtrn[3] != 0xDDDDDDDDuL )
  119. {
  120. result = ERROR;
  121. }
  122. //CtrlFlowCntInv -= STACK_OVERFLOW_CALLEE;
  123. return (result);
  124. }