11 FreeRTOS 任务相关API函数

1 FreeRTOS任务相关API函数介绍

函数描述
uxTaskPriorityGet()获取任务优先级
vTaskPrioritySet()设置任务优先级

uxTaskGetNumberOfTasks()

获取系统中任务的数量

uxTaskGetSystemState()

获取所有任务状态信息

vTaskGetInfo()

获取指定单个的任务信息

xTaskGetCurrentTaskHandle()

获取当前任务的任务句柄

xTaskGetHandle()

根据任务名获取该任务的任务句柄

uxTaskGetStackHighWaterMark()

获取任务的任务栈历史剩余最小值

eTaskGetState()

获取任务状态

vTaskList()

以表格形式获取所有任务的信息

vTaskGetRunTimeStats()

获取任务的运行时间
UBaseType_t uxTaskPriorityGet( const TaskHandle_t xTask );
//形参xTask 要查找的任务句柄,NULL代表任务自身
//返回值为整数,表示任务优先级数值
//此函数用于获取指定任务的任务优先级,使用该函数需将宏INCLUDE_uxTaskPriorityGet 置1。

void vTaskPrioritySet( TaskHandle_t xTask,UBaseType_t uxNewPriority );
//形参xTask 要查找的任务句柄,NULL代表任务自身
//形参uxNewPriority 要设置的任务优先级
//此函数用于改变某个任务的任务的优先级,使用该函数需要将宏INCLUDE_vTaskPrioritySet为1
UBaseType_t uxTaskGetNumberOfTasks( void );
//返回值表示的是系统中任务的数量
//此函数用于获取系统中任务的任务数量
UBaseType_t uxTaskGetSystemState( TaskStatus_t * const pxTaskStatusArray,
                                  const UBaseType_t uxArraySize,
                                  configRUN_TIME_COUNTER_TYPE * const pulTotalRunTime );
//形参pxTaskStatusArray 指向TaskStatus_t结构体数组首地址
//形参uxArraySize 接收信息的数组大小
//形参pulTotalRunTime 系统总运行时间,NULL则表示省略总运行时间值
//返回值为整形,表示获取信息的任务数量
//此函数用于获取系统中所有任务的任务状态信息,使用该函数需将宏configUSE_TRACE_FACILITY 置1


typedef struct xTASK_STATUS
{
    TaskHandle_t xHandle;         //任务句柄                  
    const char * pcTaskName;      //任务名                 
    UBaseType_t xTaskNumber;      //任务编号                 
    eTaskState eCurrentState;     //任务状态                
    UBaseType_t uxCurrentPriority;//任务优先级             
    UBaseType_t uxBasePriority;   //任务原始原始优先级               
    configRUN_TIME_COUNTER_TYPE ulRunTimeCounter;   //任务运行时间
    StackType_t * pxStackBase;     //任务栈基地址              
    configSTACK_DEPTH_TYPE usStackHighWaterMark;  //任务栈历史剩余最小值  
} TaskStatus_t;
void vTaskGetInfo( TaskHandle_t xTask,
                   TaskStatus_t * pxTaskStatus,
                   BaseType_t xGetFreeStackSpace,
                   eTaskState eState );
//形参xTask 指定获取信息的任务的句柄
//形参pxTaskStatus  接收任务信息的变量
//形参xGetFreeStackSpace 任务栈历史剩余最小值,当为“pdFALSE”,
//则跳过这个步骤,当为“pdTRUE”,则检查历史剩余最小堆栈
//形参estate ,任务状态,可直接赋值,如若想要获取可带入elnvalid

typedef enum
{   
	eRunning = 0,	/* 运行态 */ 
	eReady		    /* 就绪态 */ 
	eBlocked, 		/* 阻塞态 */ 
	eSuspended, 	/* 挂起态 */ 
	eDeleted, 		/* 任务被删除 */ 
	eInvalid		/* 无效 */ 
} eTaskState;


TaskHandle_t xTaskGetCurrentTaskHandle( void );
//返回值 TaskHandle_t 表示当前任务的任务句柄
//此函数用于获取当前任务的任务句柄,使用该函数需将宏INCLUDE_xTaskGetCurrentTaskHandler置1
TaskHandle_t xTaskGetHandle( const char * pcNameToQuery );
//形参pcNameToQuery,表示的是任务名
//返回值TaskHandler, 表示任务句柄
//此函数用于通过任务名获取任务句柄,使用该函数需将宏INCLUDE_xTaskGetHandle置1
UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask );
//形参xTask,表示任务句柄
//返回值UBaseType_t,表示的是任务栈的历史剩余最小值
//此函数用于获取指定任务的任务栈历史最小剩余堆栈,使用该函数需将
//宏INCUDE_uxTaskGetStackHighWaterMark置1
eTaskState eTaskGetState( TaskHandle_t xTask );
//形参xTask,表示待获取状态任务的任务句柄
//eTaskState,任务状态
//此函数用于查询某个任务的运行状态,使用此函数需将宏INCLUDE_eTaskGetStatue置1

typedef enum
{   
	eRunning = 0,	/* 运行态 */ 
	eReady		    /* 就绪态 */ 
	eBlocked, 		/* 阻塞态 */ 
	eSuspended, 	/* 挂起态 */ 
	eDeleted, 		/* 任务被删除 */ 
	eInvalid		/* 无效 */ 
} eTaskState;
void vTaskList( char * pcWriteBuffer );
//形参pcWriteBuffer ,表示用于接收任务信息的缓存指针
//此函数以表格的形式获取系统中的任务信息,
//使用此函数需将宏configUSE_TRACE_FACILITY和configUSE_STATS_FROMATTING_FUNCTIONS置1

 表格如下图所示:

Name:创建任务时给任务分配的名字

State:任务的状态信息,X是运行态,B是阻塞态,R是就绪态,S是挂起态,D是删除态

Priority:任务优先级

Stack:任务堆栈的“高水位线”,就是堆栈历史最小剩余大小

Num:任务编号,这个编号是唯一的,当多个任务使用同一个任务名的时候可以通过此编号来做区分 

2 任务状态查询API函数实验

实验设计:将设计三个任务:start_task、task1、task2

三个任务的功能如下:

start_task : 用来创建task1和task2任务

task1 :LED0每500ms闪烁一次,提示程序正在运行

task2 : 用于展示任务状态信息查询相关API函数的使用

#include "freertos_demo.h"
#include "./SYSTEM/usart/usart.h"
#include "./BSP/LED/led.h"
#include "./BSP/LCD/lcd.h"
#include "./BSP/KEY/key.h"
#include "./MALLOC/malloc.h"
/****************************FreeRTOS***************************************************/
#include "FreeRTOS.h"
#include "task.h"

/***************************************************************************************/
/*FreeRTOS配置*/

/* START_TASK 任务 配置
 * 包括: 任务句柄 任务优先级 堆栈大小 创建任务
 */
#define START_TASK_PRIO 1                   /* 任务优先级 */
#define START_STK_SIZE  128                 /* 任务堆栈大小 */
TaskHandle_t            StartTask_Handler;  /* 任务句柄 */
void start_task(void *pvParameters);        /* 任务函数 */

/* TASK1 任务 配置
 * 包括: 任务句柄 任务优先级 堆栈大小 创建任务
 */
#define TASK1_PRIO      2                   /* 任务优先级 */
#define TASK1_STK_SIZE  128                 /* 任务堆栈大小 */
TaskHandle_t            Task1Task_Handler;  /* 任务句柄 */
void task1(void *pvParameters);             /* 任务函数 */

/* TASK2 任务 配置
 * 包括: 任务句柄 任务优先级 堆栈大小 创建任务
 */
#define TASK2_PRIO      3                   /* 任务优先级 */
#define TASK2_STK_SIZE  128                 /* 任务堆栈大小 */
TaskHandle_t            Task2Task_Handler;  /* 任务句柄 */
void task2(void *pvParameters);             /* 任务函数 */

/***************************************************************************************/


void freertos_demo(void)
{
   
    xTaskCreate((TaskFunction_t )start_task,            /* 任务函数 */
                (const char*    )"start_task",          /* 任务名称 */
                (uint16_t       )START_STK_SIZE,        /* 任务堆栈大小 */
                (void*          )NULL,                  /* 传入给任务函数的参数 */
                (UBaseType_t    )START_TASK_PRIO,       /* 任务优先级 */
                (TaskHandle_t*  )&StartTask_Handler);   /* 任务句柄 */
    vTaskStartScheduler();   //任务调度器
}

void start_task(void *pvParameters)
{
    taskENTER_CRITICAL();           /* 进入临界区 */
    
	  /* 创建任务1 */
    xTaskCreate((TaskFunction_t )task1,
                (const char*    )"task1",
                (uint16_t       )TASK1_STK_SIZE,
                (void*          )NULL,
                (UBaseType_t    )TASK1_PRIO,
                (TaskHandle_t*  )&Task1Task_Handler);

	  /* 创建任务2 */
    xTaskCreate((TaskFunction_t )task2,
                (const char*    )"task2",
                (uint16_t       )TASK2_STK_SIZE,
                (void*          )NULL,
                (UBaseType_t    )TASK2_PRIO,
                (TaskHandle_t*  )&Task2Task_Handler);
 								
    vTaskDelete(StartTask_Handler); /* 删除开始任务 */
								
    taskEXIT_CRITICAL();            /* 退出临界区 */
}

//任务一,实现每500ms翻转一次
void task1(void *pvParameters)
{
    while(1)
    {
		LED1_TOGGLE();                                                 /* LED0闪烁 */
        vTaskDelay(500);                                               /* 延时500ms */
    }
}

char task_buff[300];
//任务二,实现任务状态查询API函数使用
void task2(void *pvParameters)
{
	UBaseType_t priority_num = 0;
	UBaseType_t task_num = 0;
	UBaseType_t task_num2 = 0;
	TaskStatus_t * status_array = 0;
	TaskStatus_t * status_array2 = 0;
	TaskHandle_t  task_handle = 0;
	UBaseType_t task_stack_min = 0;
	eTaskState state = 0;
	uint8_t i = 0;
	
	vTaskPrioritySet( Task2Task_Handler,4 );  	    /*修改任务2的优先级为4*/
	
	priority_num = uxTaskPriorityGet( NULL ); 
    /*获取任务2的优先级,如果使用NULL表示获取自身的任务优先级*/

	printf("Task2任务优先级为%d\r\n",priority_num);
	
	task_num = uxTaskGetNumberOfTasks();                 					 
    /*获取系统中任务的任务数量*/

	printf("任务数量:%d\r\n",task_num);   													        
    /*start_task、Task1、Task2。还包括空闲任务、以及软件定时器任务*/
	
	/*获取系统中所有任务的任务状态信息*/
	status_array = mymalloc(SRAMIN,(sizeof(TaskStatus_t)*task_num) );
	task_num2 = uxTaskGetSystemState( status_array,task_num,NULL);
    printf("任务名\t任务优先级\t任务编号\t\r\n");                              
    for(i = 0;i<task_num2;i++)
	{
		printf("%s\t%ld\t%ld\t\r\n",
						status_array[i].pcTaskName,
						status_array[i].uxCurrentPriority,
						status_array[i].xTaskNumber);
	}
	
	/*获取单个任务的状态信息*/
	status_array2 = mymalloc(SRAMIN,sizeof(TaskStatus_t) );
    //由于只有一个任务,因此不需要*任务数量
	vTaskGetInfo( Task1Task_Handler,status_array2,pdTURE,eInvalid);
	printf("任务名:%s\r\n",status_array2->pcTaskName);
	printf("任务优先级:%ld\r\n",status_array2->uxCurrentPriority);
	printf("任务编号:%ld\r\n",status_array2->xTaskNumber);
	printf("任务状态:%d\r\n",status_array2->eCurrentState);
	
	/*用于通过任务名获取任务句柄*/
	task_handle = xTaskGetHandle( "task1" );
	printf("任务句柄:%#x\r\n",(int)task_handle);
	printf("task1的任务句柄:%#x\r\n",(int)task_handle);
	
	/*查询某个任务的运行状态*/
	state = eTaskGetState( Task2Task_Handler );
	printf("当前task2的任务状态为:%d\r\n",state);
	
	/*以表格的形式获取系统中任务的信息*/
	vTaskList(task_buff);
	printf("%s\r\n",task_buff);
	
	while(1)
  {
//      /*获取指定任务的任务栈历史最小剩余堆栈*/
//	    task_stack_min = uxTaskGetStackHighWaterMark( Task2Task_Handler );
//	    printf("task2历史剩余最小堆栈为%ld\r\n",task_stack_min);
		vTaskDelay(10);
  }
}


3  任务时间统计API函数

void vTaskGetRunTimeStats( char * pcWriteBuffer );
//形参pcWriteBuffer  表示接收任务运行时间信息的缓存指针
//此函数用于统计任务的运行时间信息,使用此函数需要将宏configGENERATE_RUN_TIME_STATE、configUSE_STATS_FROMATTING_FUNCTIONS置1

Task:任务名称

Abs Time : 任务实际运行的总时间(绝对时间)

%Time:占总出来时间的百分比 

时间统计API函数使用流程:

1)将宏configGENERATE_RUN_TIME_STATS置1.

2)将宏configUSE_STATS_FORMATTING_FUNCTIONS置1

3)当将此宏configGENERATE_RUN_TIME_STAT置1之后,还需要实现2 个宏定义:

  •      portCONFIGURE_TIMER_FOR_RUNTIME_STATS()    用于初始化配置任务运行时间统计的时基定时器(注意:这个时基定时器的计时精度需高于系统时钟节拍精度的10至100倍)
  •      portGET_RUN_TIME_COUNTER_VALUE()  用于获取该功能时基硬件定时器计数的计数值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值