@@ -63,15 +63,19 @@ static IRAM_ATTR void periodic_timer_callback(void* arg)
6363static int64_t measuring_periodic_timer_accuracy (uint64_t alarm_records [])
6464{
6565 int64_t sum_jitter_us = 0 ;
66- int64_t max_jitter_us = 0 ;
66+ int64_t max_jitter_us = - (ALARM_PERIOD_MS * 1000 );
67+ int64_t min_jitter_us = ALARM_PERIOD_MS * 1000 ;
6768 int64_t jitter_array [ALARM_TIMES ] = {0 };
6869
6970 for (int i = 1 ; i <= ALARM_TIMES ; ++ i ) {
7071 int64_t jitter_us = (int64_t )alarm_records [i ] - (int64_t )alarm_records [i - 1 ] - ALARM_PERIOD_MS * 1000 ;
7172 jitter_array [i - 1 ] = jitter_us ;
72- if (llabs ( jitter_us ) > llabs ( max_jitter_us ) ) {
73+ if (jitter_us > max_jitter_us ) {
7374 max_jitter_us = jitter_us ;
7475 }
76+ if (jitter_us < min_jitter_us ) {
77+ min_jitter_us = jitter_us ;
78+ }
7579 sum_jitter_us += jitter_us ;
7680 }
7781 int64_t avg_jitter_us = sum_jitter_us / ALARM_TIMES ;
@@ -86,14 +90,19 @@ static int64_t measuring_periodic_timer_accuracy(uint64_t alarm_records[])
8690 double stddev = sqrt (variance );
8791
8892 printf ("Average jitter us: %" PRIi64 "\n" , avg_jitter_us );
89- printf ("Max jitter us: %" PRIi64 "\n" , max_jitter_us );
93+ if (max_jitter_us > 0 ) {
94+ printf ("\e[1;31mMax jitter us: %" PRIi64 "\n\e[0m" , max_jitter_us );
95+ } else {
96+ printf ("Max jitter us: %" PRIi64 "\n" , max_jitter_us );
97+ }
98+ printf ("Min jitter us: %" PRIi64 "\n" , min_jitter_us );
9099 printf ("Standard Deviation: %.3f\n" , stddev );
91100 printf ("Drift Percentage: %.3f%%\n" , (double )avg_jitter_us / (ALARM_PERIOD_MS * 10 ));
92101
93102 // Reset measurement
94103 s_current_alarm = 0 ;
95104 bzero (s_alarm_records , sizeof (s_alarm_records ));
96- return avg_jitter_us ;
105+ return max_jitter_us ;
97106}
98107
99108static int64_t test_periodic_timer_accuracy_on_dfs (esp_timer_handle_t timer )
@@ -109,9 +118,9 @@ static int64_t test_periodic_timer_accuracy_on_dfs(esp_timer_handle_t timer)
109118 // Each FreeRTOS tick will perform a min_freq_mhz->max_freq_mhz -> min_freq_mhz frequency switch
110119 xSemaphoreTake (s_alarm_finished , portMAX_DELAY );
111120 ESP_ERROR_CHECK (esp_timer_stop (timer ));
112- int64_t avg_jitter_us = measuring_periodic_timer_accuracy (s_alarm_records );
121+ int64_t max_jitter_us = measuring_periodic_timer_accuracy (s_alarm_records );
113122 vSemaphoreDelete (s_alarm_finished );
114- return avg_jitter_us ;
123+ return max_jitter_us ;
115124}
116125
117126// The results of this test are meaningful only if `CONFIG_ESP_SYSTEM_RTC_EXT_XTAL` is enabled
@@ -183,7 +192,7 @@ TEST_CASE("Test DFS lact conpensate magic table ", "[esp_timer][manual][ignore]"
183192 esp_pm_configure (& pm_config );
184193
185194 int32_t max_delay = 300 ;
186- int32_t min_delay = (pm_config .max_freq_mhz == 240 ) ? -4000 : 0 ;
195+ int32_t min_delay = (pm_config .max_freq_mhz == 240 ) ? -4000 : -300 ;
187196 int32_t test_delay = (max_delay + min_delay ) / 2 ;
188197 int32_t last_delay = 0 ;
189198 int32_t best_delay = 0 ;
@@ -192,19 +201,19 @@ TEST_CASE("Test DFS lact conpensate magic table ", "[esp_timer][manual][ignore]"
192201 do {
193202 printf ("Test delay %ld\n" , test_delay );
194203 test_lact_compensation_delay = test_delay ;
195- int64_t avg = test_periodic_timer_accuracy_on_dfs (periodic_timer );
204+ int64_t max_jitter_us = test_periodic_timer_accuracy_on_dfs (periodic_timer );
196205 last_delay = test_delay ;
197- if (avg < 0 ) {
198- test_delay = (test_delay + max_delay ) / 2 ;
199- min_delay = last_delay ;
200- } else {
206+ if (max_jitter_us > 0 ) {
201207 test_delay = (test_delay + min_delay ) / 2 ;
202208 max_delay = last_delay ;
209+ } else {
210+ test_delay = (test_delay + max_delay ) / 2 ;
211+ min_delay = last_delay ;
203212 }
204213
205- if (llabs (avg ) < llabs (min_avg )) {
214+ if (llabs (max_jitter_us ) < llabs (min_avg )) {
206215 best_delay = last_delay ;
207- min_avg = avg ;
216+ min_avg = max_jitter_us ;
208217 }
209218 } while (test_delay != last_delay );
210219
0 commit comments