mirror of
				https://github.com/espressif/esp-idf.git
				synced 2025-10-30 20:51:41 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			86 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			86 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include <stdio.h>
 | |
| #include <stdlib.h>
 | |
| #include <time.h>
 | |
| #include <sys/time.h>
 | |
| #include "unity.h"
 | |
| #include "esp_rom_sys.h"
 | |
| #include "freertos/FreeRTOS.h"
 | |
| #include "freertos/task.h"
 | |
| #include "freertos/semphr.h"
 | |
| #include "test_utils.h"
 | |
| 
 | |
| typedef struct {
 | |
|     int delay_us;
 | |
|     int method;
 | |
|     int result;
 | |
|     SemaphoreHandle_t done;
 | |
| } delay_test_arg_t;
 | |
| 
 | |
| static void test_delay_task(void *p)
 | |
| {
 | |
|     delay_test_arg_t *arg = (delay_test_arg_t *)p;
 | |
|     vTaskDelay(1);
 | |
|     uint64_t start = ref_clock_get();
 | |
|     switch (arg->method) {
 | |
|     case 0:
 | |
|         esp_rom_delay_us(arg->delay_us);
 | |
|         break;
 | |
|     case 1:
 | |
|         vTaskDelay(arg->delay_us / portTICK_PERIOD_MS / 1000);
 | |
|         break;
 | |
|     default:
 | |
|         TEST_FAIL();
 | |
|     }
 | |
|     uint64_t stop = ref_clock_get();
 | |
| 
 | |
|     arg->result = (int)(stop - start);
 | |
|     xSemaphoreGive(arg->done);
 | |
|     vTaskDelete(NULL);
 | |
| }
 | |
| 
 | |
| TEST_CASE("esp_rom_delay_us produces correct delay on CPUs", "[delay]")
 | |
| {
 | |
|     int delay_ms = 50;
 | |
|     const delay_test_arg_t args = {
 | |
|         .delay_us = delay_ms * 1000,
 | |
|         .method = 0,
 | |
|         .done = xSemaphoreCreateBinary()
 | |
|     };
 | |
|     ref_clock_init();
 | |
|     xTaskCreatePinnedToCore(test_delay_task, "", 2048, (void *)&args, 3, NULL, 0);
 | |
|     TEST_ASSERT(xSemaphoreTake(args.done, delay_ms * 2 / portTICK_PERIOD_MS));
 | |
|     TEST_ASSERT_INT32_WITHIN(1000, args.delay_us, args.result);
 | |
| 
 | |
| #if portNUM_PROCESSORS == 2
 | |
|     xTaskCreatePinnedToCore(test_delay_task, "", 2048, (void *)&args, 3, NULL, 1);
 | |
|     TEST_ASSERT(xSemaphoreTake(args.done, delay_ms * 2 / portTICK_PERIOD_MS));
 | |
|     TEST_ASSERT_INT32_WITHIN(1000, args.delay_us, args.result);
 | |
| #endif
 | |
| 
 | |
|     ref_clock_deinit();
 | |
|     vSemaphoreDelete(args.done);
 | |
| }
 | |
| 
 | |
| TEST_CASE("vTaskDelay produces correct delay on CPUs", "[delay]")
 | |
| {
 | |
|     int delay_ms = 50;
 | |
|     const delay_test_arg_t args = {
 | |
|         .delay_us = delay_ms * 1000,
 | |
|         .method = 1,
 | |
|         .done = xSemaphoreCreateBinary()
 | |
|     };
 | |
|     ref_clock_init();
 | |
|     xTaskCreatePinnedToCore(test_delay_task, "", 2048, (void *)&args, 3, NULL, 0);
 | |
|     TEST_ASSERT(xSemaphoreTake(args.done, delay_ms * 2 / portTICK_PERIOD_MS));
 | |
|     TEST_ASSERT_INT32_WITHIN(1000, args.delay_us, args.result);
 | |
| 
 | |
| #if portNUM_PROCESSORS == 2
 | |
|     xTaskCreatePinnedToCore(test_delay_task, "", 2048, (void *)&args, 3, NULL, 1);
 | |
|     TEST_ASSERT(xSemaphoreTake(args.done, delay_ms * 2 / portTICK_PERIOD_MS));
 | |
|     TEST_ASSERT_INT32_WITHIN(1000, args.delay_us, args.result);
 | |
| #endif
 | |
| 
 | |
|     ref_clock_deinit();
 | |
|     vSemaphoreDelete(args.done);
 | |
| }
 | 
