1 /*
2 * Copyright (C) 2015-2017 Alibaba Group Holding Limited
3 */
4
5 #include <stdint.h>
6 #include <stdio.h>
7 #include <string.h>
8
9 #include "aos/kernel.h"
10 #include "aos/hal/timer.h"
11 #include "timer_test.h"
12
13 #define TIMER_PERIOD_US_TEST1 100000
14 #define TIMER_PERIOD_US_TEST2 200000
15 #define TIMER_PERIOD_TOLERANCE_RANGE 0.01f
16
17 static timer_dev_t timer_dev;
18 static aos_sem_t timer_test_sem;
19 static char *msg = "AliOS Things";
20 static int success_flag = 1;
21
22 static uint64_t systime_cur = 0;
23 static uint64_t systime_pre = 0;
24 static uint64_t period_us_cur = 0;
25
26 void timer_handler(void *arg);
27
28 int error_flag = 0;
29 uint64_t period_us_calc = 0;
hal_timer_test(void)30 void hal_timer_test(void)
31 {
32 int ret = -1;
33
34 printf("*********** timer test start ! ***********\n");
35
36 timer_dev.port = PORT_TIMER_TEST;
37 timer_dev.config.period = TIMER_PERIOD_US_TEST1;
38 timer_dev.config.reload_mode = TIMER_RELOAD_AUTO;
39 timer_dev.config.cb = &timer_handler;
40 timer_dev.config.arg = msg;
41
42 ret = aos_sem_new(&timer_test_sem, 0);
43 if (ret != 0) {
44 success_flag = 0;
45 printf("sem new error ! test failed\n");
46 return;
47 }
48
49 printf("step1: set timer period to %d us, and check the period !\n", timer_dev.config.period);
50
51 ret = hal_timer_init(&timer_dev);
52 if (ret != 0) {
53 success_flag = 0;
54 printf("hal_timer_init error ! test failed\n");
55 return;
56 }
57
58 period_us_cur = timer_dev.config.period;
59
60 ret = hal_timer_start(&timer_dev);
61 if (ret != 0) {
62 success_flag = 0;
63 printf("hal_timer_start error ! test failed\n");
64 return;
65 }
66
67 aos_sem_wait(&timer_test_sem, AOS_WAIT_FOREVER);
68
69 ret = hal_timer_finalize(&timer_dev);
70 if (ret != 0) {
71 success_flag = 0;
72 printf("hal_timer_finalize error ! test failed\n");
73 return;
74 }
75
76 printf("error_flag %d\n", error_flag);
77 printf("period_us_calc %d\n", (int)period_us_calc);
78
79 if (success_flag == 1) {
80 printf("timer test result: 【success】 !\n");
81 } else {
82 printf("timer test result: 【failed】 !\n");
83 }
84
85 printf("*********** timer test end ! ***********\n");
86 }
87
timer_handler(void * arg)88 void timer_handler(void *arg)
89 {
90 static int count = 0;
91
92 int ret = -1;
93
94 timer_config_t timer_conf;
95
96 systime_pre = systime_cur;
97 systime_cur = aos_now_ms();
98
99 if (count > 0) {
100 period_us_calc = (systime_cur - systime_pre) * 1000;
101 if ((period_us_calc < (uint64_t)(period_us_cur * (1.0f - TIMER_PERIOD_TOLERANCE_RANGE)))
102 || (period_us_calc > (uint64_t)(period_us_cur * (1.0f + TIMER_PERIOD_TOLERANCE_RANGE)))) {
103 success_flag = 0;
104 error_flag = 1;
105 //printf("timer period error ! test failed\n");
106 aos_sem_signal(&timer_test_sem);
107 }
108 }
109
110 #if (TIMER_ARG_ENABLE == 1)
111 if (strcmp(msg, arg) != 0) {
112 success_flag = 0;
113 //printf("timer_handler arg error ! test failed\n");
114 error_flag = 2;
115 aos_sem_signal(&timer_test_sem);
116 }
117 #endif
118
119 if (count == 3) {
120 timer_conf.period = TIMER_PERIOD_US_TEST2;
121 timer_conf.reload_mode = TIMER_RELOAD_AUTO;
122 timer_conf.cb = &timer_handler;
123 timer_conf.arg = msg;
124
125 //printf("step2: set timer period to %d us, and check the period !\n", timer_conf.period);
126
127 hal_timer_stop(&timer_dev);
128 ret = hal_timer_para_chg(&timer_dev, timer_conf);
129 if (ret != 0) {
130 success_flag = 0;
131 error_flag = 3;
132 //printf("hal_timer_para_chg error ! test failed\n");
133 aos_sem_signal(&timer_test_sem);
134 }
135
136 hal_timer_start(&timer_dev);
137 period_us_cur = timer_conf.period;
138 }
139
140 if (count == 5) {
141 aos_sem_signal(&timer_test_sem);
142 }
143
144 count++;
145 }
146