test_delay.c 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <sys/time.h>
  5. #include "unity.h"
  6. #include "rom/ets_sys.h"
  7. #include "freertos/FreeRTOS.h"
  8. #include "freertos/task.h"
  9. typedef struct {
  10. int delay_us;
  11. int method;
  12. } delay_test_arg_t;
  13. static void test_delay_task(void* p)
  14. {
  15. const delay_test_arg_t* arg = (delay_test_arg_t*) p;
  16. struct timeval tv_start, tv_stop;
  17. gettimeofday(&tv_start, NULL);
  18. switch (arg->method) {
  19. case 0:
  20. ets_delay_us(arg->delay_us);
  21. break;
  22. case 1:
  23. vTaskDelay(arg->delay_us / portTICK_PERIOD_MS / 1000);
  24. break;
  25. default:
  26. TEST_FAIL();
  27. }
  28. gettimeofday(&tv_stop, NULL);
  29. int real_delay_us = (tv_stop.tv_sec - tv_start.tv_sec) * 1000000 +
  30. tv_stop.tv_usec - tv_start.tv_usec;
  31. printf("%s core=%d expected=%d actual=%d\n", arg->method ? "vTaskDelay" : "ets_delay_us",
  32. xPortGetCoreID(), arg->delay_us, real_delay_us);
  33. TEST_ASSERT_TRUE(abs(real_delay_us - arg->delay_us) < 1000);
  34. vTaskDelay(1);
  35. vTaskDelete(NULL);
  36. }
  37. TEST_CASE("ets_delay produces correct delay on both CPUs", "[delay][ignore]")
  38. {
  39. int delay_ms = 50;
  40. const delay_test_arg_t args = { .delay_us = delay_ms * 1000, .method = 0 };
  41. xTaskCreatePinnedToCore(test_delay_task, "", 2048, (void*) &args, 3, NULL, 0);
  42. vTaskDelay(delay_ms / portTICK_PERIOD_MS + 1);
  43. xTaskCreatePinnedToCore(test_delay_task, "", 2048, (void*) &args, 3, NULL, 1);
  44. vTaskDelay(delay_ms / portTICK_PERIOD_MS + 1);
  45. }
  46. TEST_CASE("vTaskDelay produces correct delay on both CPUs", "[delay]")
  47. {
  48. int delay_ms = 50;
  49. const delay_test_arg_t args = { .delay_us = delay_ms * 1000, .method = 1 };
  50. xTaskCreatePinnedToCore(test_delay_task, "", 2048, (void*) &args, 3, NULL, 0);
  51. vTaskDelay(delay_ms / portTICK_PERIOD_MS + 1);
  52. xTaskCreatePinnedToCore(test_delay_task, "", 2048, (void*) &args, 3, NULL, 1);
  53. vTaskDelay(delay_ms / portTICK_PERIOD_MS + 1);
  54. }