freeRTOS任务相关API函数

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);
		}
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值