FreeRTOS学习--30讲 任务相关API

常见任务相关API:

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)

 需在 FreeRTOSConfig.h 文件中设置配置项 configUSE_TRACE_FACILITY 1
4. 获取指定任务的任务信息
void vTaskGetInfo(
 TaskHandle_t        xTask,
 TaskStatus_t *      pxTaskStatus,
 BaseType_t          xGetFreeStackSpace,
 eTaskState          eState);
参数:目标任务,接收信息的变量, 任务栈历史剩余最小值,任务状态(可输入eInvalid 获取状态)  
形参 eState的枚举类型有  
typedef enum
{
 eRunning = 0,         /* 运行态 */
 eReady,                  /* 就绪态 */
 eBlocked,                /* 阻塞态 */
 eSuspended,          /* 挂起态 */
 eDeleted,                /* 任务被删除 */
 eInvalid                   /* 非法值 */
} eTaskState;
需在 FreeRTOSConfig.h 文件中设置配置项 configUSE_TRACE_FACILITY 1
5.获取当前系统正在运行的任务的任务句柄            xTaskGetCurrentHandle()
6.通过任务名获取任务句柄                                     xTaskGetHandle()
7.获取空闲任务的任务句柄                                     xTaskGetIdleTaskHandle()
8. 获取指定任务 的 任务栈的历史剩余最小值         uxTaskGetStackHighWaterMark()
9. 获取指定任务的状态                                             eTaskGetState()
10 . 获取指定任务的任务名                                      pcTaskGetName()
11.统计任务的运行时间信息                ​​​​​​​        ​​​​​​​        ​​​​​​​    vTaskGetRunTimeState(char* pcWriteBuffer)
参数:接收信息的缓存指针或地址        ​​​​​​​        ​​​​​​​        会以表格的形式存储
                  
           

任务信息的结构体

typedef struct xTASK_STATUS
{
 TaskHandle_t                                 xHandle;                  /* 任务句柄 */
 const char *                                    pcTaskName;          /* 任务名 */
 UBaseType_t                                 xTaskNumber;          /* 任务编号 */
 eTaskState                                     eCurrentState;         /* 任务状态 */
 UBaseType_t                                 uxCurrentPriority;     /* 任务优先级 */
 UBaseType_t                                 uxBasePriority;         /* 任务原始优先级 */
 configRUN_TIME_COUNTER_TYPE ulRunTimeCounter; /* 任务被分配的运行时间 */
 StackType_t *                                 pxStackBase;           /* 任务栈的基地址 */
 configSTACK_DEPTH_TYPE usStackHighWaterMark;  /* 任务栈历史剩余最小值 */
} TaskStatus_t;
任务状态查询实验

freertos_demo代码

//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

main.c

#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();

}

你可能感兴趣的:(学习)