test_freertos_get_state.c 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "freertos/FreeRTOS.h"
  4. #include "freertos/task.h"
  5. #include "freertos/semphr.h"
  6. #include "unity.h"
  7. #include "test_utils.h"
  8. #define TSK_PRIORITY (UNITY_FREERTOS_PRIORITY + 1)
  9. static TaskHandle_t blocked_task_handle;
  10. static TaskHandle_t suspended_task_handle;
  11. static SemaphoreHandle_t done_sem;
  12. void test_task_get_state(void* arg)
  13. {
  14. //Current task should return eRunning
  15. TEST_ASSERT(eTaskGetState(xTaskGetCurrentTaskHandle()) == eRunning);
  16. //Idle task of current core should return eReady
  17. TEST_ASSERT(eTaskGetState(xTaskGetIdleTaskHandle()) == eReady);
  18. //Blocked Task should return eBlocked
  19. TEST_ASSERT(eTaskGetState(blocked_task_handle) == eBlocked);
  20. //Suspended Task should return eSuspended
  21. TEST_ASSERT(eTaskGetState(suspended_task_handle) == eSuspended);
  22. xSemaphoreGive(done_sem);
  23. vTaskDelete(NULL);
  24. }
  25. void blocked_task(void *arg)
  26. {
  27. uint32_t notify_value;
  28. while(1){
  29. xTaskNotifyWait(0, 0xFFFFFFFF, &notify_value, portMAX_DELAY);
  30. }
  31. }
  32. void suspended_task(void *arg)
  33. {
  34. while(1){
  35. vTaskSuspend(NULL);
  36. }
  37. }
  38. TEST_CASE("Test eTaskGetState", "[freertos]")
  39. {
  40. done_sem = xQueueCreateCountingSemaphore(portNUM_PROCESSORS, 0);
  41. //Create blocked and suspended task
  42. xTaskCreatePinnedToCore(blocked_task, "Blocked task", 1024, NULL, TSK_PRIORITY, &blocked_task_handle, tskNO_AFFINITY);
  43. xTaskCreatePinnedToCore(suspended_task, "Suspended task", 1024, NULL, TSK_PRIORITY, &suspended_task_handle, tskNO_AFFINITY);
  44. //Create testing task
  45. for(int i = 0; i < portNUM_PROCESSORS; i++){
  46. xTaskCreatePinnedToCore(test_task_get_state, "Test task", 1024, NULL, TSK_PRIORITY, NULL, i);
  47. }
  48. //Wait until done
  49. for(int i = 0; i < portNUM_PROCESSORS; i++){
  50. xSemaphoreTake(done_sem, portMAX_DELAY);
  51. }
  52. //Clean up blocked and suspended tasks
  53. vTaskDelete(blocked_task_handle);
  54. blocked_task_handle = NULL;
  55. vTaskDelete(suspended_task_handle);
  56. suspended_task_handle = NULL;
  57. vSemaphoreDelete(done_sem);
  58. vTaskDelay(10); //Give time for idle to actually delete the tasks
  59. }