| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230 |
- #include "hard_system_time.h"
- #include "soft_time.h"
- #include "test.h"
- //系统时间定时器初始化
- void system_time_initial(void) { system_time_init(); }
- //获取系统时间
- unsigned int micros(void) { return hard_micros(); }
- //获取两次时间差,同时处理超过72分钟重新计时的错误问题。单位us
- #define ERR_DT 2500
- unsigned int time_interval(unsigned int time_cur, unsigned int *time_last)
- {
- unsigned int interval = time_cur - *time_last;
- if (time_cur < *time_last)
- {
- *time_last = time_cur;
- interval = ERR_DT;
- }
- return interval;
- }
- /*
- 测试发现,32位寄存器的CPU上两个时间差不会出现一个循环后卡死的情况。//10081142 -
- 4105048205 = 200000233;
- 测试micros() = 10081142(0X 99 D376), system_time = 4105048205(0X F4AE 108D),
- micros() - system_time = 200000233.
- */
- //试图解决32位定时器只能计时72分钟,用64位的变量来累计计时
- void time_hookfunction(void) {}
- #ifdef SOFT_TIMER_TEST
- //============================================================================
- // 测试函数
- //============================================================================
- /**
- * @brief 测试系统时间初始化
- */
- void test_time_init(void)
- {
- printf("\n=== Test: System Time Init ===\n");
-
- system_time_initial();
- printf("System time initialized\n");
-
- uint32_t time = micros();
- printf("Current time: %u us\n", time);
-
- if (time > 0) {
- printf("[PASS] Time init test\n");
- } else {
- printf("[FAIL] Time init test\n");
- }
- }
- /**
- * @brief 测试 micros() 函数
- */
- void test_micros(void)
- {
- printf("\n=== Test: micros() Function ===\n");
-
- uint32_t t1 = micros();
- printf("Time 1: %u us\n", t1);
-
- // 简单延时
- for (volatile int i = 0; i < 10000; i++);
-
- uint32_t t2 = micros();
- printf("Time 2: %u us\n", t2);
- printf("Delta: %u us\n", t2 - t1);
-
- if (t2 > t1) {
- printf("[PASS] micros() test\n");
- } else {
- printf("[FAIL] micros() test\n");
- }
- }
- /**
- * @brief 测试 time_interval() 函数
- */
- void test_time_interval(void)
- {
- printf("\n=== Test: time_interval() Function ===\n");
-
- uint32_t last_time = micros();
- printf("Last time: %u us\n", last_time);
-
- // 延时一段时间
- for (volatile int i = 0; i < 50000; i++);
-
- uint32_t cur_time = micros();
- printf("Current time: %u us\n", cur_time);
-
- uint32_t interval = time_interval(cur_time, &last_time);
- printf("Interval: %u us\n", interval);
- printf("New last time: %u us\n", last_time);
-
- if (interval > 0) {
- printf("[PASS] time_interval() test\n");
- } else {
- printf("[FAIL] time_interval() test\n");
- }
- }
- /**
- * @brief 测试 time_interval() 溢出处理
- */
- void test_time_interval_overflow(void)
- {
- printf("\n=== Test: time_interval() Overflow Handling ===\n");
-
- // 模拟溢出情况
- uint32_t last_time = 0xFFFFFFF0; // 接近最大值
- uint32_t cur_time = 100; // 溢出后的值
-
- printf("Simulate: last=0x%X, cur=0x%X\n", last_time, cur_time);
-
- uint32_t interval = time_interval(cur_time, &last_time);
- printf("Interval: %u us\n", interval);
- printf("New last time: %u us\n", last_time);
-
- if (interval == 2500) { // ERR_DT
- printf("[PASS] Overflow handling test\n");
- } else {
- printf("[FAIL] Overflow handling test (expected 2500)\n");
- }
- }
- /**
- * @brief 连续时间采集测试
- */
- void test_time_continuous(void)
- {
- printf("\n=== Test: Continuous Time Collection ===\n");
-
- uint32_t last_time = micros();
- printf("Start time: %u us\n", last_time);
-
- for (int i = 0; i < 10; i++) {
- // 简单延时
- for (volatile int j = 0; j < 10000; j++);
-
- uint32_t cur_time = micros();
- uint32_t interval = time_interval(cur_time, &last_time);
-
- printf(" Sample %d: interval=%u us\n", i+1, interval);
- }
-
- printf("[PASS] Continuous collection test\n");
- }
- /**
- * @brief 测试 time_hookfunction()
- */
- void test_time_hook(void)
- {
- printf("\n=== Test: time_hookfunction() ===\n");
-
- printf("Calling time_hookfunction()...\n");
- time_hookfunction();
- printf("time_hookfunction() executed\n");
-
- printf("[PASS] Hook function test\n");
- }
- //============================================================================
- // 主测试函数
- //============================================================================
- /**
- * @brief 运行所有时间接口测试
- */
- void run_time_test(void)
- {
- printf("\n");
- printf("========================================\n");
- printf(" System Time Interface Test\n");
- printf("========================================\n");
-
- test_time_init();
- test_micros();
- test_time_interval();
- test_time_interval_overflow();
- test_time_continuous();
- test_time_hook();
-
- printf("\n========================================\n");
- printf(" All tests completed\n");
- printf("========================================\n");
- }
- /**
- * @brief 快速测试(只测试基本功能)
- */
- void run_time_quick_test(void)
- {
- printf("\n=== Quick Time Test ===\n");
-
- system_time_initial();
-
- uint32_t start = micros();
- printf("Start: %u us\n", start);
-
- for (volatile int i = 0; i < 50000; i++);
-
- uint32_t end = micros();
- printf("End: %u us\n", end);
- printf("Elapsed: %u us\n", end - start);
-
- uint32_t last = start;
- uint32_t interval = time_interval(end, &last);
- printf("Interval via function: %u us\n", interval);
-
- printf("Quick test done\n");
- }
- #endif
|