Преглед изворни кода

Merge branch 'bugfix/uxTaskGetSystemState_github_#12142' into 'master'

Bugfix for uxTaskGetSystemState

See merge request !883

Ivan Grokhotkov пре 8 година
родитељ
комит
7ed8c66547
2 измењених фајлова са 69 додато и 3 уклоњено
  1. 2 3
      components/freertos/tasks.c
  2. 67 0
      components/freertos/test/test_uxGetSystemState_Bugfix.c

+ 2 - 3
components/freertos/tasks.c

@@ -2280,7 +2280,7 @@ UBaseType_t uxTaskGetNumberOfTasks( void )
 	UBaseType_t uxTask = 0, uxQueue = configMAX_PRIORITIES;
 
 		UNTESTED_FUNCTION();
-		vTaskSuspendAll(); //WARNING: This only suspends one CPU. ToDo: suspend others as well. Mux using taskQueueMutex maybe?
+		taskENTER_CRITICAL(&xTaskQueueMutex);
 		{
 			/* Is there a space in the array for each task in the system? */
 			if( uxArraySize >= uxCurrentNumberOfTasks )
@@ -2340,8 +2340,7 @@ UBaseType_t uxTaskGetNumberOfTasks( void )
 				mtCOVERAGE_TEST_MARKER();
 			}
 		}
-		( void ) xTaskResumeAll();
-
+		taskEXIT_CRITICAL(&xTaskQueueMutex);
 		return uxTask;
 	}
 

+ 67 - 0
components/freertos/test/test_uxGetSystemState_Bugfix.c

@@ -0,0 +1,67 @@
+/*
+ Test Bugfix for uxTaskGetSystemState where getting system state immediately after creating 
+ new tasks would lead them being include twice in the TaskStatusArray. Changed suspendScheduler
+ in function to taskENTER_CRITICAL
+*/
+
+
+#include <stdio.h>
+#include "freertos/FreeRTOS.h"
+#include "freertos/task.h"
+#include "unity.h"
+
+#define CreatedTaskDelayTicks 1
+#define NumberOfTasksToCreate 4
+#define CreatedTaskPriority 10
+#define CoreToUse	1
+
+#if (configUSE_TRACE_FACILITY)
+
+void TaskCallback (void* pxParam){
+	int counter = 0;
+	while(1){
+		counter++;
+		vTaskDelay(CreatedTaskDelayTicks);
+	}
+}
+
+TEST_CASE("uxTaskGetSystemState Bugfix Test", "[freertos]")
+{
+	TaskStatus_t *TaskStatusArray;
+	TaskHandle_t *TaskHandles;
+	UBaseType_t NumberOfTasks = 0;
+	UBaseType_t StartingNumberOfTasks = 0;
+	
+	//Give Time for OS to remove dport tasks
+	vTaskDelay(1000);
+	
+	//Allocate TaskStatusArray
+	StartingNumberOfTasks = uxTaskGetNumberOfTasks();
+	
+	
+	TaskStatusArray = pvPortMalloc((StartingNumberOfTasks+NumberOfTasksToCreate) * sizeof(TaskStatus_t));
+	TaskHandles = pvPortMalloc((StartingNumberOfTasks+NumberOfTasksToCreate) * sizeof(TaskHandle_t));
+
+	
+	
+	//Create Tasks
+	for(int i = 0; i < NumberOfTasksToCreate; i++){
+		xTaskCreatePinnedToCore(&TaskCallback, "Task" , 2048, NULL, CreatedTaskPriority, (TaskHandle_t*) &TaskHandles[i], CoreToUse);
+	}
+	NumberOfTasks = uxTaskGetSystemState(TaskStatusArray, (StartingNumberOfTasks+NumberOfTasksToCreate), NULL);
+	
+	//Check if any taska have been repeated in TaskStatusArray
+	if(NumberOfTasks != 0){
+		printf("Tasks Created, Checking for Repeated Additions \n");
+		for(int i = 0; i <NumberOfTasks; i++){
+			for(int j = i + 1;  j< NumberOfTasks; j++){
+				//Give error task handle matches another
+				configASSERT(!(TaskStatusArray[i].xHandle == TaskStatusArray[j].xHandle));
+			}
+				
+		}
+	}
+	
+	
+}
+#endif