test_freertos_get_state.c 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  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. while(1){
  28. vTaskDelay(portMAX_DELAY);
  29. }
  30. }
  31. void suspended_task(void *arg)
  32. {
  33. while(1){
  34. vTaskSuspend(NULL);
  35. }
  36. }
  37. TEST_CASE("Test eTaskGetState", "[freertos]")
  38. {
  39. done_sem = xQueueCreateCountingSemaphore(portNUM_PROCESSORS, 0);
  40. //Create blocked and suspended task
  41. xTaskCreatePinnedToCore(blocked_task, "Blocked task", 1024, NULL, TSK_PRIORITY, &blocked_task_handle, tskNO_AFFINITY);
  42. xTaskCreatePinnedToCore(suspended_task, "Suspended task", 1024, NULL, TSK_PRIORITY, &suspended_task_handle, tskNO_AFFINITY);
  43. //Create testing task
  44. for(int i = 0; i < portNUM_PROCESSORS; i++){
  45. xTaskCreatePinnedToCore(test_task_get_state, "Test task", 1024, NULL, TSK_PRIORITY, NULL, i);
  46. }
  47. //Wait until done
  48. for(int i = 0; i < portNUM_PROCESSORS; i++){
  49. xSemaphoreTake(done_sem, portMAX_DELAY);
  50. }
  51. //Clean up blocked and suspended tasks
  52. vTaskDelete(blocked_task_handle);
  53. blocked_task_handle = NULL;
  54. vTaskDelete(suspended_task_handle);
  55. suspended_task_handle = NULL;
  56. vSemaphoreDelete(done_sem);
  57. vTaskDelay(10); //Give time for idle to actually delete the tasks
  58. }