FreeRTOS中與任務相關的一些輔助函數

  1. 函數 uxTaskPriorityGet()
    函數原型UBaseType_t uxTaskPriorityGet( TaskHandle_t xTask )
    示例:
UBaseType_t query_priority,led_priority;
query_priority = uxTaskPriorityGet(QueryTask_Handler);	//獲取優先級
printf("query_priority = %d\r\n",query_priority);
  1. 函數 vTaskPrioritySet()和vtaskList()
    void vTaskPrioritySet( TaskHandle_t xTask,UBaseType_t uxNewPriority )
    示例:
vTaskPrioritySet(LEDTask_Handler, 5);	//更改優先級,最好由系統調用,用戶最好不調用
led_priority = uxTaskPriorityGet(LEDTask_Handler);
printf("led_priority = %d\r\n",led_priority);
  1. uxTaskGetSystemState()
    UBaseType_t uxTaskGetSystemState( TaskStatus_t * const pxTaskStatusArray,
    const UBaseType_t uxArraySize,
    uint32_t * const pulTotalRunTime )
    示例:
uint32_t TotalRunTime;
UBaseType_t taskstate_num;
TaskStatus_t * TaskStatusArray;
UBaseType_t num;
num = uxTaskGetNumberOfTasks();
TaskStatusArray = pvPortMalloc(num*sizeof(TaskStatus_t));
if(TaskStatusArray != NULL)	//申請空間是否成功
{
	taskstate_num = uxTaskGetSystemState((TaskStatus_t *	) TaskStatusArray,	
										 (UBaseType_t 		) num, 
										 (uint32_t *		) &TotalRunTime);	//返回統計任務狀態的任務個數
	printf("TaskName\t\tPriority\t\tTaskNumber\t\tWaterMark\t\t\r\n");
	for(int x=0;x<num;x++)
	{
		//通過串口打印出獲取到的系統任務的有關信息,比如任務名稱、
		//任務優先級和任務編號。
		printf("%s\t\t%d\t\t\t%d\t\t\t%d\t\t\r\n",				
				TaskStatusArray[x].pcTaskName,
				(int)TaskStatusArray[x].uxCurrentPriority,
				(int)TaskStatusArray[x].xTaskNumber,
				(uint16_t)TaskStatusArray[x].usStackHighWaterMark);
		
	}
}

與之功能一樣且用起來方便的函數爲void vTaskList( char * pcWriteBuffer ),可以直接獲取各個任務的信息,然後存儲在pcWriteBuffer字符指針中,但是這個字符數組須要在任務外面定義,否則會佔用很大一部分堆棧空間。
示例:

vTaskList(InfoBuffer);							//獲取所有任務的信息
printf("%s\r\n",InfoBuffer);					//通過串口打印所有任務的信息
  1. vTaskGetInfo()
    與3中的任務函數功能一樣,這個是統計單個任務的狀態信息的。

  2. uxTaskGetStackHighWaterMark()
    此函數用於檢查任務從創建好到現在的歷史剩餘最小值,這個值越小說明任務堆棧溢出的可能性就越大!
    注意:這幾個函數都會消耗一定時間,所以最好用在調試階段。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章