目录
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 ****/