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