test_delay.c 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <sys/time.h>
  5. #include "unity.h"
  6. #include "esp_rom_sys.h"
  7. #include "freertos/FreeRTOS.h"
  8. #include "freertos/task.h"
  9. #include "freertos/semphr.h"
  10. #include "test_utils.h"
  11. typedef struct {
  12. int delay_us;
  13. int method;
  14. int result;
  15. SemaphoreHandle_t done;
  16. } delay_test_arg_t;
  17. static void test_delay_task(void *p)
  18. {
  19. delay_test_arg_t *arg = (delay_test_arg_t *)p;
  20. vTaskDelay(1);
  21. uint64_t start = ref_clock_get();
  22. switch (arg->method) {
  23. case 0:
  24. esp_rom_delay_us(arg->delay_us);
  25. break;
  26. case 1:
  27. vTaskDelay(arg->delay_us / portTICK_PERIOD_MS / 1000);
  28. break;
  29. default:
  30. TEST_FAIL();
  31. }
  32. uint64_t stop = ref_clock_get();
  33. arg->result = (int)(stop - start);
  34. xSemaphoreGive(arg->done);
  35. vTaskDelete(NULL);
  36. }
  37. TEST_CASE("esp_rom_delay_us produces correct delay on CPUs", "[delay]")
  38. {
  39. int delay_ms = 50;
  40. const delay_test_arg_t args = {
  41. .delay_us = delay_ms * 1000,
  42. .method = 0,
  43. .done = xSemaphoreCreateBinary()
  44. };
  45. ref_clock_init();
  46. xTaskCreatePinnedToCore(test_delay_task, "", 2048, (void *)&args, 3, NULL, 0);
  47. TEST_ASSERT(xSemaphoreTake(args.done, delay_ms * 2 / portTICK_PERIOD_MS));
  48. TEST_ASSERT_INT32_WITHIN(1000, args.delay_us, args.result);
  49. #if portNUM_PROCESSORS == 2
  50. xTaskCreatePinnedToCore(test_delay_task, "", 2048, (void *)&args, 3, NULL, 1);
  51. TEST_ASSERT(xSemaphoreTake(args.done, delay_ms * 2 / portTICK_PERIOD_MS));
  52. TEST_ASSERT_INT32_WITHIN(1000, args.delay_us, args.result);
  53. #endif
  54. ref_clock_deinit();
  55. vSemaphoreDelete(args.done);
  56. }
  57. TEST_CASE("vTaskDelay produces correct delay on CPUs", "[delay]")
  58. {
  59. int delay_ms = 50;
  60. const delay_test_arg_t args = {
  61. .delay_us = delay_ms * 1000,
  62. .method = 1,
  63. .done = xSemaphoreCreateBinary()
  64. };
  65. ref_clock_init();
  66. xTaskCreatePinnedToCore(test_delay_task, "", 2048, (void *)&args, 3, NULL, 0);
  67. TEST_ASSERT(xSemaphoreTake(args.done, delay_ms * 2 / portTICK_PERIOD_MS));
  68. TEST_ASSERT_INT32_WITHIN(1000, args.delay_us, args.result);
  69. #if portNUM_PROCESSORS == 2
  70. xTaskCreatePinnedToCore(test_delay_task, "", 2048, (void *)&args, 3, NULL, 1);
  71. TEST_ASSERT(xSemaphoreTake(args.done, delay_ms * 2 / portTICK_PERIOD_MS));
  72. TEST_ASSERT_INT32_WITHIN(1000, args.delay_us, args.result);
  73. #endif
  74. ref_clock_deinit();
  75. vSemaphoreDelete(args.done);
  76. }