soft_time.c 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. #include "hard_system_time.h"
  2. #include "soft_time.h"
  3. #include "test.h"
  4. //系统时间定时器初始化
  5. void system_time_initial(void) { system_time_init(); }
  6. //获取系统时间
  7. unsigned int micros(void) { return hard_micros(); }
  8. //获取两次时间差,同时处理超过72分钟重新计时的错误问题。单位us
  9. #define ERR_DT 2500
  10. unsigned int time_interval(unsigned int time_cur, unsigned int *time_last)
  11. {
  12. unsigned int interval = time_cur - *time_last;
  13. if (time_cur < *time_last)
  14. {
  15. *time_last = time_cur;
  16. interval = ERR_DT;
  17. }
  18. return interval;
  19. }
  20. /*
  21. 测试发现,32位寄存器的CPU上两个时间差不会出现一个循环后卡死的情况。//10081142 -
  22. 4105048205 = 200000233;
  23. 测试micros() = 10081142(0X 99 D376), system_time = 4105048205(0X F4AE 108D),
  24. micros() - system_time = 200000233.
  25. */
  26. //试图解决32位定时器只能计时72分钟,用64位的变量来累计计时
  27. void time_hookfunction(void) {}
  28. #ifdef SOFT_TIMER_TEST
  29. //============================================================================
  30. // 测试函数
  31. //============================================================================
  32. /**
  33. * @brief 测试系统时间初始化
  34. */
  35. void test_time_init(void)
  36. {
  37. printf("\n=== Test: System Time Init ===\n");
  38. system_time_initial();
  39. printf("System time initialized\n");
  40. uint32_t time = micros();
  41. printf("Current time: %u us\n", time);
  42. if (time > 0) {
  43. printf("[PASS] Time init test\n");
  44. } else {
  45. printf("[FAIL] Time init test\n");
  46. }
  47. }
  48. /**
  49. * @brief 测试 micros() 函数
  50. */
  51. void test_micros(void)
  52. {
  53. printf("\n=== Test: micros() Function ===\n");
  54. uint32_t t1 = micros();
  55. printf("Time 1: %u us\n", t1);
  56. // 简单延时
  57. for (volatile int i = 0; i < 10000; i++);
  58. uint32_t t2 = micros();
  59. printf("Time 2: %u us\n", t2);
  60. printf("Delta: %u us\n", t2 - t1);
  61. if (t2 > t1) {
  62. printf("[PASS] micros() test\n");
  63. } else {
  64. printf("[FAIL] micros() test\n");
  65. }
  66. }
  67. /**
  68. * @brief 测试 time_interval() 函数
  69. */
  70. void test_time_interval(void)
  71. {
  72. printf("\n=== Test: time_interval() Function ===\n");
  73. uint32_t last_time = micros();
  74. printf("Last time: %u us\n", last_time);
  75. // 延时一段时间
  76. for (volatile int i = 0; i < 50000; i++);
  77. uint32_t cur_time = micros();
  78. printf("Current time: %u us\n", cur_time);
  79. uint32_t interval = time_interval(cur_time, &last_time);
  80. printf("Interval: %u us\n", interval);
  81. printf("New last time: %u us\n", last_time);
  82. if (interval > 0) {
  83. printf("[PASS] time_interval() test\n");
  84. } else {
  85. printf("[FAIL] time_interval() test\n");
  86. }
  87. }
  88. /**
  89. * @brief 测试 time_interval() 溢出处理
  90. */
  91. void test_time_interval_overflow(void)
  92. {
  93. printf("\n=== Test: time_interval() Overflow Handling ===\n");
  94. // 模拟溢出情况
  95. uint32_t last_time = 0xFFFFFFF0; // 接近最大值
  96. uint32_t cur_time = 100; // 溢出后的值
  97. printf("Simulate: last=0x%X, cur=0x%X\n", last_time, cur_time);
  98. uint32_t interval = time_interval(cur_time, &last_time);
  99. printf("Interval: %u us\n", interval);
  100. printf("New last time: %u us\n", last_time);
  101. if (interval == 2500) { // ERR_DT
  102. printf("[PASS] Overflow handling test\n");
  103. } else {
  104. printf("[FAIL] Overflow handling test (expected 2500)\n");
  105. }
  106. }
  107. /**
  108. * @brief 连续时间采集测试
  109. */
  110. void test_time_continuous(void)
  111. {
  112. printf("\n=== Test: Continuous Time Collection ===\n");
  113. uint32_t last_time = micros();
  114. printf("Start time: %u us\n", last_time);
  115. for (int i = 0; i < 10; i++) {
  116. // 简单延时
  117. for (volatile int j = 0; j < 10000; j++);
  118. uint32_t cur_time = micros();
  119. uint32_t interval = time_interval(cur_time, &last_time);
  120. printf(" Sample %d: interval=%u us\n", i+1, interval);
  121. }
  122. printf("[PASS] Continuous collection test\n");
  123. }
  124. /**
  125. * @brief 测试 time_hookfunction()
  126. */
  127. void test_time_hook(void)
  128. {
  129. printf("\n=== Test: time_hookfunction() ===\n");
  130. printf("Calling time_hookfunction()...\n");
  131. time_hookfunction();
  132. printf("time_hookfunction() executed\n");
  133. printf("[PASS] Hook function test\n");
  134. }
  135. //============================================================================
  136. // 主测试函数
  137. //============================================================================
  138. /**
  139. * @brief 运行所有时间接口测试
  140. */
  141. void run_time_test(void)
  142. {
  143. printf("\n");
  144. printf("========================================\n");
  145. printf(" System Time Interface Test\n");
  146. printf("========================================\n");
  147. test_time_init();
  148. test_micros();
  149. test_time_interval();
  150. test_time_interval_overflow();
  151. test_time_continuous();
  152. test_time_hook();
  153. printf("\n========================================\n");
  154. printf(" All tests completed\n");
  155. printf("========================================\n");
  156. }
  157. /**
  158. * @brief 快速测试(只测试基本功能)
  159. */
  160. void run_time_quick_test(void)
  161. {
  162. printf("\n=== Quick Time Test ===\n");
  163. system_time_initial();
  164. uint32_t start = micros();
  165. printf("Start: %u us\n", start);
  166. for (volatile int i = 0; i < 50000; i++);
  167. uint32_t end = micros();
  168. printf("End: %u us\n", end);
  169. printf("Elapsed: %u us\n", end - start);
  170. uint32_t last = start;
  171. uint32_t interval = time_interval(end, &last);
  172. printf("Interval via function: %u us\n", interval);
  173. printf("Quick test done\n");
  174. }
  175. #endif