freertos任务相关API函数介绍
任务状态查询API函数实验
1、实验目的:学习 FreeRTOS 任务状态与信息的查询API函数
2、实验设计:将设计三个任务:start_task、task1、task2
start_task:用来创建task1任务及task2任务;
task1:LED0每500ms闪烁一次,提示程序正在运行;
task2:用于展示任务状态信息查询相关API函数的使用;
freertos_demo.c
#include "freertos_demo.h"
#include "./SYSTEM/DELAY/delay.h"
#include "./SYSTEM/USART/usart.h"
#include "./BSP/LCD/lcd.h"
#include "./BSP/TIMER/btim.h"
#include "./BSP/LED/led.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); /* 任务函数 */
/******************************************************************************************************/
/**
* @brief FreeRTOS例程入口函数
* @param 无
* @retval 无
*/
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();
}
/**
* @brief start_task
* @param pvParameters : 传入参数(未用到)
* @retval 无
*/
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);
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(); /* 退出临界区 */
}
/**
* @brief task1
* @param pvParameters : 传入参数(未用到)
* @retval 无
*/
void task1(void *pvParameters)
{
while (1)
{
LED0_TOGGLE();
vTaskDelay(500);
}
}
char task_buffer[300];
//实现任务状态查询
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;
uint8_t i =0;
UBaseType_t task_stack_min = 0;
eTaskState state = 0;
//查看任务优先级
priority_num = uxTaskPriorityGet(Task1Task_Handler);
printf("task1任务优先级为:%ld\r\n",priority_num);
//设置任务优先级
vTaskPrioritySet(Task1Task_Handler,4);
priority_num = uxTaskPriorityGet(Task1Task_Handler);
printf("修改后task1任务优先级为:%ld\r\n",priority_num);
//获取系统任务总数
task_num = uxTaskGetNumberOfTasks();
printf("系统任务总数为:%ld\r\n",task_num);
//获取系统中所有任务的任务状态信息
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\t\t%ld\t%ld\r\n",status_array[i].pcTaskName,
status_array[i].uxBasePriority,
status_array[i].xTaskNumber);
}
//获取单个任务状态信息
status_array2 = mymalloc(SRAMIN,sizeof(TaskStatus_t));
vTaskGetInfo(Task1Task_Handler,status_array2,pdTRUE,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_stack_min = uxTaskGetStackHighWaterMark( Task2Task_Handler );
printf("任务2历史剩余最小堆栈为:%ld\r\n",task_stack_min);
//查询某个任务运行状态
state = eTaskGetState(Task2Task_Handler);
printf("task2任务状态为%d\r\n",state);
//以表格形式获取任务中状态信息
vTaskList(task_buffer);
printf("%s\r\n",task_buffer);
while (1)
{
vTaskDelay(500);
}
}
实验结果
任务时间统计API函数实验
1、实验目的:学习 FreeRTOS 任务运行时间统计相关的API函数使用
2、实验设计:将设计三个任务:start_task、task1、task2
start_task:用来创建task1任务及task2任务;
task1:LED0每500ms闪烁一次,提示程序正在运行;
task2:用于展示任务运行时间统计相关API函数的使用;
bitm.h
#define BTIM_TIM3_INT TIM3
#define BTIM_TIM3_INT_IRQn TIM3_IRQn
#define BTIM_TIM3_INT_IRQHandler TIM3_IRQHandler
#define BTIM_TIM3_INT_CLK_ENABLE() do{ __HAL_RCC_TIM3_CLK_ENABLE(); }while(0) /* TIM3 时钟使能 */
#define BTIM_TIM5_INT TIM5
#define BTIM_TIM5_INT_IRQn TIM5_IRQn
#define BTIM_TIM5_INT_IRQHandler TIM5_IRQHandler
#define BTIM_TIM5_INT_CLK_ENABLE() do{ __HAL_RCC_TIM5_CLK_ENABLE(); }while(0) /* TIM5 时钟使能 */
/******************************************************************************************/
void ConfigureTimeForRunTimeStats();
void btim_tim3_int_init(uint16_t arr, uint16_t psc);
void btim_tim5_int_init(uint16_t arr, uint16_t psc);
btim.c(仅显示修改部分)
uint32_t FreeRTOSRunTimeTicks;
void ConfigureTimeForRunTimeStats()
{
btim_tim3_int_init(10-1,72-1);
FreeRTOSRunTimeTicks = 0;
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim == (&g_tim3_handle))
{
FreeRTOSRunTimeTicks++;
}
}
freertos_demo.c(仅显示修改部分)
/* TASK3 任务 配置
* 包括: 任务句柄 任务优先级 堆栈大小 创建任务
*/
#define TASK3_PRIO 4 /* 任务优先级 */
#define TASK3_STK_SIZE 128 /* 任务堆栈大小 */
TaskHandle_t Task3Task_Handler; /* 任务句柄 */
void task3(void *pvParameters); /* 任务函数 */
/******************************************************************************************************/
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);
xTaskCreate((TaskFunction_t )task2,
(const char* )"task2",
(uint16_t )TASK2_STK_SIZE,
(void* )NULL,
(UBaseType_t )TASK2_PRIO,
(TaskHandle_t* )&Task2Task_Handler);
xTaskCreate((TaskFunction_t )task3,
(const char* )"task3",
(uint16_t )TASK3_STK_SIZE,
(void* )NULL,
(UBaseType_t )TASK3_PRIO,
(TaskHandle_t* )&Task3Task_Handler);
vTaskDelete(StartTask_Handler); /* 删除开始任务 */
taskEXIT_CRITICAL(); /* 退出临界区 */
}
char task_buffer2[300];
//任务运行时间统计API函数
void task3(void *pvParameters)
{
uint8_t key = 0;
//统计任务运行时间
//vTaskGetRunTimeStats()
while(1)
{
key = key_scan(0);
if(key == KEY0_PRES)
{
vTaskGetRunTimeStats(task_buffer2 );
printf("%s\r\n",task_buffer2);
}
vTaskDelay(1000);
}
}