freeRTOS总结(八)任务相关API函数

发布时间:2024年01月24日

1, FreeRTOS任务相关API函数介绍(熟悉)

UBaseType_t uxTaskPriorityGet( const TaskHandle_t xTask ) 获取任务优先级函数

此函数用于获取指定任务的任务优先级,使用该函数需将宏 INCLUDE_uxTaskPriorityGet 置 1
在这里插入图片描述
在这里插入图片描述

void vTaskPrioritySet( TaskHandle_t xTask , UBaseType_t 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 ) 获取系统中所有任务的任务状态信息

此函数用于获取系统中所有任务的任务状态信息,使用该函数需将宏 configUSE_TRACE_FACILITY 置 1
在这里插入图片描述
在这里插入图片描述

typedef struct xTASK_STATUS
{
    TaskHandle_t 			xHandle;                       		/* 任务句柄 */ 
    const char *		 		pcTaskName;                     	/* 任务名 */ 
    UBaseType_t			xTaskNumber;                     	/* 任务编号 */ 
    eTaskState e				CurrentState;                    	/* 任务状态 */ 
    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 ) 获取指定的单个任务的状态信息

此函数用于获取指定的单个任务的状态信息,使用该函数需将宏 configUSE_TRACE_FACILITY 置 1
在这里插入图片描述

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

TaskHandle_t xTaskGetCurrentTaskHandle( void ) 获取当前任务的任务句柄

此函数用于获取当前任务的任务句柄, 使用该函数需将宏 INCLUDE_xTaskGetCurrentTaskHandle 置 1
在这里插入图片描述

TaskHandle_t xTaskGetHandle(const char * pcNameToQuery);

此函数用于通过任务名获取任务句柄 , 使用该函数需将宏 INCLUDE_xTaskGetHandle 置 1
在这里插入图片描述
在这里插入图片描述

UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask ) 获取指定任务的任务栈历史最小剩余堆栈;

此函数用于获取指定任务的任务栈历史最小剩余堆栈;使用该函数需将宏INCLUDE_uxTaskGetStackHighWaterMark 置 1
此函数用于获取指定任务的任务栈历史最小剩余堆栈;
使用该函数需将宏 INCLUDE_uxTaskGetStackHighWaterMark 置 1

eTaskState eTaskGetState(TaskHandle_t xTask) 查询某个任务的运行状态

此函数用于查询某个任务的运行状态,使用此函数需将宏 INCLUDE_eTaskGetState 置1
在这里插入图片描述
在这里插入图片描述

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

void vTaskList(char * pcWriteBuffer) 以“表格”的形式获取系统中任务的信息

此函数用于以“表格”的形式获取系统中任务的信息 ;
使用此函数需将宏 configUSE_TRACE_FACILITY 和configUSE_STATS_FORMATTING_FUNCTIONS 置1
在这里插入图片描述
Name : 创建任务的时候给任务分配的名字。
State : 任务的壮态信息, B 是阻塞态, R 是就绪态, S 是挂起态, D 是删除态
Priority :任务优先级。
Stack : 任务堆栈的“高水位线”,就是堆栈历史最小剩余大小。
Num : 任务编号,这个编号是唯一的,当多个任务使用同一个任务名的时候可以通过此编号来做区分。

时间统计API函数使用流程
1、将宏 configGENERATE_RUN_TIME_STATS 置1
2、将宏 configUSE_STATS_FORMATTING_FUNCTIONS 置1
3、当将此宏 configGENERATE_RUN_TIME_STAT 置1之后,还需要实现2个宏定义:
① portCONFIGURE_TIMER_FOR_RUNTIME_STATE() :用于初始化用于配置任务运行时间统计的时基定时器;
注意:这个时基定时器的计时精度需高于系统时钟节拍精度的10至100倍!
② portGET_RUN_TIME_COUNTER_VALUE():用于获取该功能时基硬件定时器计数的计数值 。

2,任务状态查询API函数实验(掌握)

1、实验目的:学习 FreeRTOS 任务状态与信息的查询API函数
2、实验设计:将设计三个任务: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 "./SYSTEM/delay/delay.h"
#include "./MALLOC/malloc.h"
/*FreeRTOS*********************************************************************************************/
#include "FreeRTOS.h"
#include "task.h"

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

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


#define TASK1_PRIO         2
#define TASK1_STACK_SIZE   128
TaskHandle_t   task1_handler;
void task1( void * pvParameters );


#define TASK2_PRIO         3
#define TASK2_STACK_SIZE   128
TaskHandle_t   task2_handler;
void task2( void * pvParameters );



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


/**
 * @brief       FreeRTOS例程入口函数
 * @param       无
 * @retval      无
 */
void freertos_demo(void)
{    
	xTaskCreate((TaskFunction_t) start_task,
							(char *)	"start_task",
							(configSTACK_DEPTH_TYPE) START_TASK_STACK_SIZE,
							(void *) NULL,
							(UBaseType_t) START_TASK_PRIO,
							(TaskHandle_t *)&start_task_handler
	
	);
							
	//开启任务调度
	vTaskStartScheduler();
	
}
void start_task( void * pvParameters )
{
	 taskENTER_CRITICAL();               /* 进入临界区  任何任务和中断都不能打断当前程序运行*/
		xTaskCreate((TaskFunction_t) task1,
							(char *)	"task1",
							(configSTACK_DEPTH_TYPE) TASK1_STACK_SIZE,
							(void *) NULL,
							(UBaseType_t) TASK1_PRIO,
							(TaskHandle_t *)&task1_handler	);
							
		xTaskCreate((TaskFunction_t) task2,
							(char *)	"task2",
							(configSTACK_DEPTH_TYPE) TASK2_STACK_SIZE,
							(void *) NULL,
							(UBaseType_t) TASK2_PRIO,
							(TaskHandle_t *)&task2_handler	);

	vTaskDelete(NULL);//删除当前任务也就是开始任务
	taskEXIT_CRITICAL();
							
	

}

void task1( void * pvParameters )
{

		while(1)
		{
			LED0_TOGGLE();
			vTaskDelay(500);
		}
}
char task_buff[500];
void task2( void * pvParameters )
{
	
	UBaseType_t priority_num=0;
	UBaseType_t task_num=0;
	UBaseType_t task_num2 =0;
  TaskStatus_t * status_array;
	TaskStatus_t * status_array2;
	uint8_t i;
	TaskHandle_t  task_handle;
	eTaskState task_state;
/******************************************************************************************************/	
			/*设置任务优先级*/
		/*任务创建时优先级为3现在设置为5*/
	 vTaskPrioritySet((TaskHandle_t)task2_handler,(UBaseType_t)4 );
/******************************************************************************************************/
		/*获取任务优先级并将他打印*/
	 priority_num =   uxTaskPriorityGet( (TaskHandle_t) task1_handler );
	 printf("task1任务优先级为%ld\r\n",priority_num);
	 priority_num =   uxTaskPriorityGet( NULL );
	 printf("task2任务优先级为%ld\r\n",priority_num);
/******************************************************************************************************/
	/*获取任务数量 task1+task2+IDEL(空闲)+Tmr Svc(软件定时)+start_task*/
	task_num = uxTaskGetNumberOfTasks();
	printf("当前系统任务数量为%ld\r\n",task_num);
/******************************************************************************************************/

/*
获取系统任务信息数量为5
任务名		任务优先级	任务编号
task2		4	5
task1		2	4
IDLE		0	2
start_task		1	1
Tmr Svc		31	3

*/
	status_array= mymalloc(SRAMIN,(sizeof(TaskStatus_t) * task_num));
	/*获取当前任务*/
  task_num2=uxTaskGetSystemState( (TaskStatus_t * ) status_array,( UBaseType_t )task_num,NULL );
	printf("获取系统任务信息数量为%ld\r\n",task_num2);
	printf("任务名\t\t任务优先级\t任务编号\r\n");
	for(i=0;i<task_num2;i++)
	{
		printf("%s\t\t%ld\t%ld\r\n",status_array[i].pcTaskName,status_array[i].uxCurrentPriority,status_array[i].xTaskNumber);
	}
/******************** 获取指定的单个任务的状态信息**********************************************************************************/	

	
	 status_array2 = mymalloc(SRAMIN,(sizeof(TaskStatus_t) ));
   vTaskGetInfo( (TaskHandle_t) task2_handler,(TaskStatus_t *) status_array2,(BaseType_t) pdTRUE,(eTaskState )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);
	/*%#x 是格式化输出控制符,表示以十六进制形式输出整数,并在前面加上 0x 前缀*/
   printf("task1的任务句柄:%#x\r\n",(int)task1_handler);
	
/*******************查询某个任务的运行状态***************************************************************************/		
  task_state = eTaskGetState(task2_handler);
	printf("task2当前任务状态:%d\r\n",task_state);
	
/*******************以“表格”的形式获取系统中任务的信息**************************************************************************/		
	vTaskList( task_buff );
	printf("%s\r\n",task_buff); 
	while(1)
	{

		vTaskDelay(1000);
	}

}


3,任务时间统计API函数实验(掌握)

Void vTaskGetRunTimeStats( char * pcWriteBuffer )
此函数用于统计任务的运行时间信息,使用此函数需将宏 configGENERATE_RUN_TIME_STAT 、configUSE_STATS_FORMATTING_FUNCTIONS 置1
在这里插入图片描述
Task :任务名称
Abs Time ::任务实际运行的总时间(绝对时间)
% Time :占总处理时间的百分比
时间统计API函数使用流程
1、将宏 configGENERATE_RUN_TIME_STATS 置1
2、将宏 configUSE_STATS_FORMATTING_FUNCTIONS 置1 、
3、当将此宏 configGENERATE_RUN_TIME_STATS 置1之后,还需要实现2个宏定义:
① portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() :用于初始化用于配置任务运行时间统计的时基定时器;
注意:这个时基定时器的计时精度需高于系统时钟节拍精度的10至100倍!
② portGET_RUN_TIME_COUNTER_VALUE():用于获取该功能时基硬件定时器计数的计数值 。

#if configGENERATE_RUN_TIME_STATS
#include "./BSP/TIMER/btim.h"
#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()        ConfigureTimeForRunTimeStats()
extern uint32_t FreeRTOSRunTimeTicks;
#define portGET_RUN_TIME_COUNTER_VALUE()                FreeRTOSRunTimeTicks
#endif

宏的实现在bitm.c中实现

/* 时基定时器的初始化 */
/*定时器6的时钟频率是42M*/
void ConfigureTimeForRunTimeStats(void)
{
    btim_timx_int_init(10-1, 42-1);  /* 100倍的系统时钟节拍 */
    FreeRTOSRunTimeTicks = 0;
}

定时器溢出中断时FreeRTOSRunTimeTicks ++

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{ 
 //无论哪个定时器处理计数溢出中断都会调用这个回调函数
    if (htim->Instance == BTIM_TIMX_INT)
    {
			
    FreeRTOSRunTimeTicks ++;

    }
}
void task2( void * pvParameters )
{
	uint8_t key;
	while(1)
	{
		key=key_scan(0);
		if(key==KEY0_PRES)
		{
			vTaskGetRunTimeStats( task_buff);
			printf("%s\r\n",task_buff);
		
		}

		vTaskDelay(1000);
	}

}
文章来源:https://blog.csdn.net/Pretender_1205/article/details/135753359
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。