test_freertos_task_delay_until.c 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. /*
  2. Test for FreeRTOS vTaskDelayUntil() function by comparing the delay period of
  3. the function to comparing it to ref clock.
  4. */
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include "freertos/FreeRTOS.h"
  8. #include "freertos/task.h"
  9. #include "freertos/semphr.h"
  10. #include "freertos/FreeRTOSConfig.h"
  11. #include "unity.h"
  12. #include "test_utils.h"
  13. #define TSK_PRIORITY (UNITY_FREERTOS_PRIORITY + 1)
  14. #define NO_OF_CYCLES 5
  15. #define NO_OF_TASKS_PER_CORE 2
  16. #define TICKS_TO_DELAY 10
  17. #define TICK_RATE configTICK_RATE_HZ
  18. #define TICK_PERIOD_US (1000000/TICK_RATE)
  19. #define IDEAL_DELAY_PERIOD_MS ((1000*TICKS_TO_DELAY)/TICK_RATE)
  20. #define IDEAL_DELAY_PERIOD_US (IDEAL_DELAY_PERIOD_MS*1000)
  21. #define TICKS_TO_MS(x) (((x)*1000)/TICK_RATE)
  22. #define REF_TO_ROUND_MS(x) (((x)+500)/1000)
  23. static SemaphoreHandle_t task_delete_semphr;
  24. #if CONFIG_IDF_TARGET_ESP32S2BETA
  25. #warning "Test not ported to esp32s2beta"
  26. #else
  27. static void delaying_task(void* arg)
  28. {
  29. uint64_t ref_prev, ref_current;
  30. TickType_t last_wake_time;
  31. TickType_t ticks_before_delay;
  32. vTaskDelay(1); //Delay until next tick to synchronize operations to tick boundaries
  33. last_wake_time = xTaskGetTickCount();
  34. ticks_before_delay = last_wake_time;
  35. ref_prev = ref_clock_get();
  36. for(int i = 0; i < NO_OF_CYCLES; i++){
  37. //Delay of TICKS_TO_DELAY
  38. vTaskDelayUntil(&last_wake_time, TICKS_TO_DELAY);
  39. //Get current ref clock
  40. TEST_ASSERT_EQUAL(IDEAL_DELAY_PERIOD_MS, TICKS_TO_MS(xTaskGetTickCount() - ticks_before_delay));
  41. ref_current = ref_clock_get();
  42. TEST_ASSERT_UINT32_WITHIN(TICK_PERIOD_US, IDEAL_DELAY_PERIOD_US, (uint32_t)(ref_current - ref_prev));
  43. ref_prev = ref_current;
  44. ticks_before_delay = last_wake_time;
  45. }
  46. //Delete Task after prescribed number of cycles
  47. xSemaphoreGive(task_delete_semphr);
  48. vTaskDelete(NULL);
  49. }
  50. TEST_CASE("Test vTaskDelayUntil", "[freertos]")
  51. {
  52. task_delete_semphr = xQueueCreateCountingSemaphore(NO_OF_TASKS_PER_CORE*portNUM_PROCESSORS, 0);
  53. ref_clock_init();
  54. for(int i = 0; i < portNUM_PROCESSORS; i++){
  55. xTaskCreatePinnedToCore(delaying_task, "delay_pinned", 1024, NULL, TSK_PRIORITY, NULL, i);
  56. xTaskCreatePinnedToCore(delaying_task, "delay_no_aff", 1024, NULL, TSK_PRIORITY, NULL, tskNO_AFFINITY);
  57. }
  58. for(int i = 0; i < NO_OF_TASKS_PER_CORE*portNUM_PROCESSORS; i++){
  59. xSemaphoreTake(task_delete_semphr, portMAX_DELAY);
  60. }
  61. //Cleanup
  62. vSemaphoreDelete(task_delete_semphr);
  63. ref_clock_deinit();
  64. }
  65. #endif // CONFIG_IDF_TARGET_ESP32S2BETA