1.获取指定任务优先级 UBaseType_t uxTaskPriorityGet(const TaskHandle_t xTask)
参数:待获取优先级任务 返回值:整型(%ld,long int)
2.设置指定任务优先级 void vTaskPrioritySet(TaskHandle_t xTask,UBaseType_t uxNewPriority)
参数:目标任务,要设置的优先级 无返回值
3.获取所有任务的各项信息
UBaseType_t uxTaskGetSystemState(
TaskStatus_t * const pxTaskStatusArray,
const UBaseType_t uxArraySize,
configRUN_TIME_COUNTER_TYPE * const pulTotalRunTime);
参数:接收信息的数组首地址,数组大小,运行时间 返回值:获取信息的任务数量(%ld)
//freertos_demo.c
#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);
/* TASK1 任务 配置
* 包括: 任务句柄 任务优先级 堆栈大小 创建任务
*/
#define TASK1_PRIO 2
#define TASK1_STACK_SIZE 128
TaskHandle_t task1_handler;
void task1(void* pv);
/* TASK2 任务 配置
* 包括: 任务句柄 任务优先级 堆栈大小 创建任务
*/
#define TASK2_PRIO 3
#define TASK2_STACK_SIZE 128
TaskHandle_t task2_handler;
void task2(void* pv);
/******************************************************************************************************/
/**
* @brief FreeRTOS例程入口函数
* @param 无
* @retval 无
*/
void freertos_demo(void)
{
xTaskCreate((TaskFunction_t ) start_task, //创建开始任务
(char* ) "start_task",
(unsigned portSHORT) START_TASK_STACK_SIZE,
(void * ) NULL,
(portBASE_TYPE ) START_TASK_PRIO,
(TaskHandle_t* ) &start_task_handler );
vTaskStartScheduler();
}
void start_task(void* pvPara)
{
taskENTER_CRITICAL(); //进入临界区
xTaskCreate((TaskFunction_t ) task1, //创建任务一
(char* ) "task1",
(unsigned portSHORT) TASK1_STACK_SIZE,
(void * ) NULL,
(portBASE_TYPE ) TASK1_PRIO,
(TaskHandle_t* ) &task1_handler );
xTaskCreate((TaskFunction_t ) task2, //创建任务二
(char* ) "task2",
(unsigned portSHORT) TASK2_STACK_SIZE,
(void * ) NULL,
(portBASE_TYPE ) TASK2_PRIO,
(TaskHandle_t* ) &task2_handler );
vTaskDelete(NULL); //删除start_task任务
taskEXIT_CRITICAL(); //退出临界区
}
//任务一 实现LED每500ms翻转一次
void task1(void* pv)
{
while(1)
{
LED0_TOGGLE(); //翻转LED0电平
vTaskDelay(500);
}
}
char task_buff[300];
//任务二 实现任务状态查询API函数使用
void task2(void* pv)
{
UBaseType_t priority1_num = 0;
UBaseType_t priority2_num = 0;
UBaseType_t task_num = 0;
UBaseType_t task_num2 = 0;
TaskStatus_t* status_array = 0;
TaskStatus_t* status_array2 = 0;
TaskHandle_t task_handle;
UBaseType_t task_stack_min = 0;
eTaskState state = 0;
uint16_t i = 0;
priority1_num = uxTaskPriorityGet(task1_handler); //查询任务一优先级等级
vTaskPrioritySet(task2_handler,30); //设置任务二优先级等级为30
priority2_num = uxTaskPriorityGet(NULL); //查询自身任务优先级
task_num = uxTaskGetNumberOfTasks(); //获取任务数量
printf("task1任务优先级为:%ld\r\n",priority1_num);
printf("task2任务优先级为:%ld\r\n",priority2_num);
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"); //\t是tab建的效果,多个空格
for(i = 0;i < task_num2;i++)
{
printf("%s\t\t%ld\t\t%ld\r\n",
status_array[i].pcTaskName,
status_array[i].uxCurrentPriority,
status_array[i].xTaskNumber);
}
status_array2 = mymalloc(SRAMIN,(sizeof(TaskStatus_t)*task_num));
vTaskGetInfo(task1_handler,status_array2,pdTRUE,eInvalid); //获取任务一的信息
printf("任务名:%s\r\n\r\n",status_array2->pcTaskName);
printf("任务优先级:%ld\r\n\r\n",status_array2->uxCurrentPriority);
printf("任务编号:%ld\r\n\r\n",status_array2->xTaskNumber);
printf("任务状态:%d\r\n\r\n",status_array2->eCurrentState);
task_handle = xTaskGetHandle("task1"); //根据任务名获取任务句柄
printf("任务句柄:%#x\r\n",(int)task_handle);
printf("task1的任务句柄:%#x\r\n",(int)task1_handler);
task_stack_min = uxTaskGetStackHighWaterMark(task2_handler); //获取任务二历史最小堆栈位
printf("task2历史剩余最小堆栈位:%ld\r\n",task_stack_min);
state = eTaskGetState( task2_handler ); //获取目标任务状态
printf("当前任务状态:%d\r\n",state);
vTaskList( task_buff ); //表格的形式打印当前所有任务信息
printf("%s\r\n",task_buff);
while(1)
{
vTaskDelay(1000);
}
}
//freertos_demo.h
#ifndef __FREERTOS_DEMO_H
#define __FREERTOS_DEMO_H
void freertos_demo(void);
#endif
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
#include "./BSP/LCD/lcd.h"
#include "./BSP/KEY/key.h"
#include "./BSP/SRAM/sram.h"
#include "./MALLOC/malloc.h"
#include "freertos_demo.h"
#include "./BSP/TIMER/btim.h"
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(336, 8, 2, 7); /* 设置时钟,168Mhz */
delay_init(168); /* 延时初始化 */
usart_init(115200); /* 串口初始化为115200 */
led_init(); /* 初始化LED */
lcd_init(); /* 初始化LCD */
key_init(); /* 初始化按键 */
sram_init(); /* SRAM初始化 */
my_mem_init(SRAMIN); /* 初始化内部SRAM内存池 */
my_mem_init(SRAMEX); /* 初始化外部SRAM内存池 */
my_mem_init(SRAMCCM); /* 初始化内部CCM内存池 */
delay_ms(10000); //串口反应迟钝,所以延迟一段时间再打印信息
freertos_demo();
}