test_freertos_task_utilities.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. /*
  2. * SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #include "freertos/FreeRTOS.h"
  7. #include "freertos/task.h"
  8. #include "freertos/queue.h"
  9. #include "freertos/semphr.h"
  10. #include "freertos/stream_buffer.h"
  11. #include "freertos/event_groups.h"
  12. #include "unity.h"
  13. #include "test_utils.h"
  14. /*
  15. Test that we can get a task's handle via the task's name using xTaskGetHandle()
  16. */
  17. static void test_task_get_handle(void *arg)
  18. {
  19. vTaskSuspend(NULL);
  20. }
  21. TEST_CASE("FreeRTOS xTaskGetHandle()", "[freertos]")
  22. {
  23. vTaskDelay(10); //Small delay to let init/daemon tasks finish running
  24. for (int core = 0; core < configNUM_CORES; core++) {
  25. TaskHandle_t test_task_hdl;
  26. TaskHandle_t ret_task_hdl;
  27. TEST_ASSERT_EQUAL(pdTRUE, xTaskCreatePinnedToCore(test_task_get_handle, "test0", 1024, NULL, UNITY_FREERTOS_PRIORITY + 1, &test_task_hdl, core));
  28. vTaskDelay(10); //Delay to let task call vTaskSuspend()
  29. ret_task_hdl = xTaskGetHandle("test0");
  30. TEST_ASSERT_EQUAL(test_task_hdl, ret_task_hdl);
  31. vTaskDelete(test_task_hdl);
  32. vTaskDelay(10); //Delay to let IDLE task clean up
  33. }
  34. }
  35. /*
  36. Test that a blocked task (either on a delay or an event object) can be unblocked using xTaskAbortDelay()
  37. */
  38. #define QUEUE_LEN 1
  39. #define STREAM_BUFFER_LEN (sizeof(uint32_t))
  40. typedef struct {
  41. QueueHandle_t queue;
  42. SemaphoreHandle_t sem;
  43. SemaphoreHandle_t mux;
  44. StreamBufferHandle_t stream_buffer;
  45. EventGroupHandle_t evt_grp;
  46. } abort_delay_test_obj_t;
  47. static void test_task_abort_delay(void *arg)
  48. {
  49. abort_delay_test_obj_t *test_objs = (abort_delay_test_obj_t *)arg;
  50. //Block indefinitely on an empty queue. Delay should be aborted so we expect a failure to be returned
  51. uint32_t data = 0;
  52. TEST_ASSERT_EQUAL(pdFALSE, xQueueReceive(test_objs->queue, &data, portMAX_DELAY));
  53. TEST_ASSERT_EQUAL(pdFALSE, xSemaphoreTake(test_objs->sem, portMAX_DELAY));
  54. TEST_ASSERT_EQUAL(pdFALSE, xSemaphoreTake(test_objs->mux, portMAX_DELAY));
  55. uint32_t RxData;
  56. size_t xReceivedBytes = xStreamBufferReceive(test_objs->stream_buffer, (void *)&RxData, STREAM_BUFFER_LEN, portMAX_DELAY);
  57. TEST_ASSERT_EQUAL(0, xReceivedBytes);
  58. EventBits_t uxBits = xEventGroupWaitBits(test_objs->evt_grp, 0xFF, pdTRUE, pdTRUE, portMAX_DELAY);
  59. TEST_ASSERT_EQUAL(0, uxBits);
  60. vTaskDelete(NULL);
  61. }
  62. TEST_CASE("FreeRTOS xTaskAbortDelay()", "[freertos]")
  63. {
  64. abort_delay_test_obj_t test_objs;
  65. test_objs.queue = xQueueCreate(QUEUE_LEN, sizeof(uint32_t));
  66. test_objs.sem = xSemaphoreCreateBinary();
  67. test_objs.mux = xSemaphoreCreateMutex();
  68. test_objs.stream_buffer = xStreamBufferCreate(STREAM_BUFFER_LEN, 1);
  69. test_objs.evt_grp = xEventGroupCreate();
  70. for (int core = 0; core < configNUM_CORES; core++) {
  71. //Take the MUX so that test task will block on it
  72. TEST_ASSERT_EQUAL(pdTRUE, xSemaphoreTake(test_objs.mux, 0));
  73. TaskHandle_t task_hdl;
  74. xTaskCreatePinnedToCore(test_task_abort_delay, "test", 1024, (void *)&test_objs, UNITY_FREERTOS_PRIORITY + 1, &task_hdl, core);
  75. for (int i = 0; i < 5; i++) {
  76. vTaskDelay(10);
  77. TEST_ASSERT_EQUAL(pdPASS, xTaskAbortDelay(task_hdl));
  78. }
  79. TEST_ASSERT_EQUAL(pdTRUE, xSemaphoreGive(test_objs.mux));
  80. }
  81. vTaskDelay(10); //Delay to let IDLE task clean up
  82. }