12_FreeRTOS任务相关API函数

目录

FreeRTOS任务相关API函数介绍

获取任务优先级函数

设置任务优先级函数

获取任务数量函数

获取所有任务状态信息

获取指定的单个任务的状态信息

获取当前任务句柄

通过任务名获取任务句柄

获取任务栈历史最小剩余推栈

以表格的形式获取系统中任务信息

实验源码


FreeRTOS任务相关API函数介绍

获取任务优先级函数

UBaseType_t uxTaskPriorityGet( 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, uint32_t * const pulTotalRunTime )

此函数用于获取系统中所有任务的任务状态信息,使用该函数需将宏

configUSE_TRACE_FACILITY置1

typedef struct xTASK_STATUS
{
TaskHandle_ txHandle;     				/* 任务句柄*/
const char* pcTaskName; 					/* 任务名*/
UBaseType  txTaskNumber;					/* 任务编号*/
eTaskState  eCurrentState;					/* 任务状态*/
UBaseType  tuxCurrentPriority;				/* 任务优先级*/
UBaseType  tuxBasePriority;					/* 任务原始优先级*/
uint32_t  ulRunTimeCounter, /* 任务运行时间*/
StackType_t* pxStackBase;					/* 任务栈基地址*/
Uint16_t  usStackHighWaterMark; /* 任务栈历史剩余最小值*/

}TaskStatus_t;

取指定的单个任务的状态信息

void vTaskGetInfo( TaskHandle_t xTask, TaskStatus_t *pxTaskStatus, BaseType_t

xGetFreeStackSpace, eTaskState eState )

此函数用于获取指定的单个任务的状态信息,使用该函数需将宏

configUSE_TRACE_FACILITY 置 1

获取当前任务句柄

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

以表格的形式获取系统中任务信息

void vTaskList(char*pcWriteBuffer)

此函数用于以“表格”的形式获取系统中任务的信息;使用此函数需将宏

configUSE_TRACE_FACILITY 和configUSE_STATS_FORMATTING_FUNCTIONS 置1

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

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

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

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

实验源码

/**
  ******************************************************************************
  * @file           : user_mian.h
  * @brief          : V1.00
  ******************************************************************************
  * @attention
  *
  ******************************************************************************
  */

/* Include 包含---------------------------------------------------------------*/
#include "stm32f10x.h"
#include <stdbool.h>
#include "user_gpio.h"
#include "user_delay.h"
#include "user_rcc_config.h"
#include "user_uart.h"
#include "FreeRTOS.h"
#include "task.h"

/* Typedef 类型----------------------------------------------------------------*/
/* Define  定义----------------------------------------------------------------*/
/* Macro   宏------------------------------------------------------------------*/
/* Variables 变量--------------------------------------------------------------*/ 
/* Constants 常量--------------------------------------------------------------*/
/* Function  函数--------------------------------------------------------------*/

//任务优先级
#define START_TASK_PRIO		1
//任务堆栈大小	
#define START_STK_SIZE 		128  
//任务句柄
TaskHandle_t StartTask_Handler;
//任务函数
void start_task(void *pvParameters);


//任务优先级
#define TASK1_PRIO			8
//任务堆栈大小	
#define TASK1_STK_SIZE 		50  
//任务句柄
TaskHandle_t Task1_Handler;
//任务函数
void task1(void *pvParameters);


//任务优先级
#define TASK2_PRIO			3
//任务堆栈大小	
#define TASK2_STK_SIZE 		500  
//任务句柄
TaskHandle_t Task2_Handler;
//任务函数
void task2(void *pvParameters);


char task_buff[300];

 int main(void)
 {	

	/*配置系统中断分组为4位抢占*/
	 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
	 /*延时函数初始化*/
	 delay_init();
	/*RCC配置*/
	 Rcc_config();
	/*GPIO初始化*/ 
	 Gpio_Init();
	/*USART1初始化*/
	 Uart1_Init(9600);
	/*创建开始任务*/
    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();          //开启任务调度
		

}
 

/*!
	\brief		开始任务函数
	\param[in]	传递形参,创建任务时用户自己传入
	\param[out]	none
	\retval 	none
*/
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*  )&Task1_Handler);   
    //创建任务2
    xTaskCreate((TaskFunction_t )task2,     
                (const char*    )"task2",   
                (uint16_t       )TASK2_STK_SIZE, 
                (void*          )NULL,
                (UBaseType_t    )TASK2_PRIO,
                (TaskHandle_t*  )&Task2_Handler);         
    vTaskDelete(StartTask_Handler); //删除开始任务
    taskEXIT_CRITICAL();            //退出临界区
}


/*!
	\brief		task1实现LED每500ms翻转一次任务函数
	\param[in]	传递形参,创建任务时用户自己传入
	\param[out]	none
	\retval 	none
*/
void task1(void *pvParameters)
{
    while(1)
    {
         
		//引脚拉低,GPIOE LED亮
		GPIO_ResetBits(GPIOE,GPIO_Pin_5);
        vTaskDelay(500);
		//引脚拉高,GPIOE LED灭		
		GPIO_SetBits(GPIOE,GPIO_Pin_5);
		vTaskDelay(500);
    }
} 


/*!
	\brief		task2实现任务状态查询API函数使用任务函数
	\param[in]	传递形参,创建任务时用户自己传入
	\param[out]	none
	\retval 	none
*/
void task2(void *pvParameters)
{
	UBaseType_t num =0;
	TaskStatus_t Status[10];
	TaskStatus_t Status1;
	uint8_t i;
    while(1)
    {

		/*设置任务2优先级为1*/
		vTaskPrioritySet(Task2_Handler,4);

		/*获取任务1优先级*/
		num = uxTaskPriorityGet(Task1_Handler);
		taskENTER_CRITICAL();           //进入临界区
		printf("任务1优先级为:%ld\r\n",num);
		delay_xms(5);
		taskEXIT_CRITICAL();            //退出临界区
		
		
		/*获取当前任务优先级*/
		num = uxTaskPriorityGet(NULL);
		taskENTER_CRITICAL();           //进入临界区		
		printf("获取当前任务优先级:%ld\r\n",num);
		delay_xms(5);
		taskEXIT_CRITICAL();            //退出临界区		

		
		/*设置任务2优先级为3*/
		vTaskPrioritySet(Task2_Handler,3);
		
		/*获取当前任务优先级*/
		num = uxTaskPriorityGet(NULL);
		taskENTER_CRITICAL();           //进入临界区	
		printf("修改后当前任务优先级:%ld\r\n",num);
		delay_xms(5);
		taskEXIT_CRITICAL();            //退出临界区
		
		
		/*获取当前任务数量*/
		num = uxTaskGetNumberOfTasks();
		
		taskENTER_CRITICAL();           //进入临界区
		printf("获取当前任务数量:%ld\r\n",num);
		delay_xms(5);
		taskEXIT_CRITICAL();            //退出临界区
		
		

		/*获取系统中所有任务的任务状态信息*/
		uxTaskGetSystemState(&Status[0],num,NULL);	
		
		taskENTER_CRITICAL();           //进入临界区						
		printf("任务名\t任务优先级\t任务编号");
		delay_xms(5);
		printf("\t历史剩余最小值\r\n");	
		taskEXIT_CRITICAL();            //退出临界区	
		for(i=0; i<num; i++)
		{
			
			taskENTER_CRITICAL();           //进入临界区
			printf("%s\t%ld\t\t%ld\t\t%d\t\t\r\n",Status[i].pcTaskName,
					Status[i].uxCurrentPriority,Status[i].xTaskNumber,
					Status[i].usStackHighWaterMark);			
			taskEXIT_CRITICAL();            //退出临界区
			
		}
		
		
		/*获取单个任务的状态信息*/
		vTaskGetInfo(Task2_Handler,&Status1,pdTRUE,eInvalid);		
		taskENTER_CRITICAL();           //进入临界区
		printf("单个任务获取状态信息\r\n");
		delay_xms(5);
		printf("任务名\t任务优先级\t任务编号");
		delay_xms(5);
		printf("\t历史剩余最小值\t任务状态\r\n");	
		delay_xms(5);
		printf("%s\t%ld\t\t%ld\t\t%d\t\t%d\t\t\r\n\r\n",Status1.pcTaskName,
					Status1.uxCurrentPriority,Status1.xTaskNumber,
					Status1.usStackHighWaterMark,Status1.eCurrentState);	
		taskEXIT_CRITICAL();            //退出临界区
		
		/*列表形式获取系统任务信息*/	
		vTaskList(task_buff);
		
		taskENTER_CRITICAL();           //进入临界区
		printf("%s\r\n",task_buff);
		delay_xms(5);
		printf("\r\n\r\n");
		delay_xms(5);
		taskEXIT_CRITICAL();            //退出临界区
		

		
		vTaskDelay(1000);	 
		
    }
}

 /************************************************************** END OF FILE ****/

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值