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()
    此函数用于检查任务从创建好到现在的历史剩余最小值,这个值越小说明任务堆栈溢出的可能性就越大!
    注意:这几个函数都会消耗一定时间,所以最好用在调试阶段。

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