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