【正点原子FreeRTOS学习笔记】————(9)FreeRTOS任务相关API函数

一、FreeRTOS任务相关API函数介绍(熟悉)

在这里插入图片描述

UBaseType_t  uxTaskPriorityGet(  const 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,
                                      				configRUN_TIME_COUNTER_TYPE * const pulTotalRunTime  )

此函数用于获取系统中所有任务的任务状态信息,使用该函数需将宏 configUSE_TRACE_FACILITY 置 1
在这里插入图片描述

typedef struct xTASK_STATUS
{
    TaskHandle_t 			xHandle;                       		/* 任务句柄 */ 
    const char *		 		pcTaskName;                     	/* 任务名 */ 
    UBaseType_t			xTaskNumber;                     	/* 任务编号 */ 
    eTaskState e				CurrentState;                    	/* 任务状态 */ 
    UBaseType_t 			uxCurrentPriority;               	/* 任务优先级 */ 
    UBaseType_t 			uxBasePriority;                 	/* 任务原始优先级*/ 
    configRUN_TIME_COUNTER_TYPE 	ulRunTimeCounter; 		/* 任务运行时间*/
    StackType_t * 			pxStackBase;                    	/* 任务栈基地址 */ 
    configSTACK_DEPTH_TYPE 	usStackHighWaterMark;  	/* 任务栈历史剩余最小值 */ 
} TaskStatus_t;
void vTaskGetInfo( 	TaskHandle_t 	xTask,	         	TaskStatus_t * 	pxTaskStatus,		         	BaseType_t 		xGetFreeStackSpace,		         	eTaskState 		eState  )  

此函数用于获取指定的单个任务的状态信息,使用该函数需将宏 configUSE_TRACE_FACILITY 置 1
在这里插入图片描述

typedef enum
{   
	eRunning = 0,	/* 运行态 */ 
	eReady		/* 就绪态 */ 
	eBlocked, 		/* 阻塞态 */ 
	eSuspended, 	/* 挂起态 */ 
	eDeleted, 		/* 任务被删除 */ 
	eInvalid		/* 无效 */ 
} eTaskState;
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
在这里插入图片描述

eTaskState    eTaskGetState(TaskHandle_t xTask)

此函数用于查询某个任务的运行状态,使用此函数需将宏 INCLUDE_eTaskGetState 置1
在这里插入图片描述

typedef enum
{   
	eRunning = 0,	/* 运行态 */ 
	eReady		/* 就绪态 */ 
	eBlocked, 		/* 阻塞态 */ 
	eSuspended, 	/* 挂起态 */ 
	eDeleted, 		/* 任务被删除 */ 
	eInvalid		/* 无效 */ 
} eTaskState;
void   vTaskList(char * pcWriteBuffer)

此函数用于以“表格”的形式获取系统中任务的信息 ;
使用此函数需将宏 configUSE_TRACE_FACILITY 和configUSE_STATS_FORMATTING_FUNCTIONS 置1
在这里插入图片描述
表格如下所示:
在这里插入图片描述

Name : 创建任务的时候给任务分配的名字。
State : 任务的壮态信息, B 是阻塞态, R 是就绪态, S 是挂起态, D 是删除态
Priority :任务优先级。
Stack : 任务堆栈的“高水位线”,就是堆栈历史最小剩余大小。
Num : 任务编号,这个编号是唯一的,当多个任务使用同一个任务名的时候可以通过此编号来做区

二、任务状态查询API函数实验(掌握)

1、实验目的:学习 FreeRTOS 任务状态与信息的查询API函数
2、实验设计:将设计两个任务:start_task、task1
两个任务的功能如下:
在这里插入图片描述

/**
 * @brief       task1
 * @param       pvParameters : 传入参数(未用到)
 * @retval      无
 */
 void task1(void *pvParameters)
{
    uint32_t        i               = 0;
    UBaseType_t     task_num        = 0;
    TaskStatus_t    *status_array   = NULL;
    TaskHandle_t    task_handle     = NULL;
    TaskStatus_t    *task_info      = NULL;
    eTaskState      task_state      = eInvalid;
    char            *task_state_str = NULL;
    char            *task_info_buf  = NULL;
    /* 第一步:函数uxTaskGetSystemState()的使用 */
     printf("/********第一步:函数uxTaskGetSystemState()的使用**********/\r\n");
     task_num = uxTaskGetNumberOfTasks();                            /* 获取系统任务数量 */
     status_array = mymalloc(SRAMIN, task_num * sizeof(TaskStatus_t));
     task_num = uxTaskGetSystemState((TaskStatus_t* )status_array,   /* 任务状态信息buffer */
                                    (UBaseType_t   )task_num,       /* buffer大小 */
                                    (uint32_t*     )NULL);          /* 不获取任务运行时间信息 */
    printf("任务名\t\t优先级\t\t任务编号\r\n");
    for (i=0; i<task_num; i++)
    {
        printf("%s\t%s%ld\t\t%ld\r\n",
                status_array[i].pcTaskName,
                strlen(status_array[i].pcTaskName) > 7 ? "": "\t",
                status_array[i].uxCurrentPriority,
                status_array[i].xTaskNumber);
    }
    myfree(SRAMIN, status_array);
    printf("/**************************结束***************************/\r\n");
    printf("按下KEY0键继续!\r\n\r\n\r\n");
    while (key_scan(0) != KEY0_PRES)
    {
        vTaskDelay(10);
    }
     /* 第二步:函数vTaskGetInfo()的使用 */
    printf("/************第二步:函数vTaskGetInfo()的使用**************/\r\n");
    task_info = mymalloc(SRAMIN, sizeof(TaskStatus_t));
    task_handle = xTaskGetHandle("task1");                          /* 获取任务句柄 */
    vTaskGetInfo((TaskHandle_t  )task_handle,                       /* 任务句柄 */
                 (TaskStatus_t* )task_info,                         /* 任务信息buffer */
                 (BaseType_t    )pdTRUE,                            /* 允许统计任务堆栈历史最小值 */
                 (eTaskState    )eInvalid);                         /* 获取任务运行状态 */
    printf("任务名:\t\t\t%s\r\n", task_info->pcTaskName);
    printf("任务编号:\t\t%ld\r\n", task_info->xTaskNumber);
    printf("任务壮态:\t\t%d\r\n", task_info->eCurrentState);
    printf("任务当前优先级:\t\t%ld\r\n", task_info->uxCurrentPriority);
    printf("任务基优先级:\t\t%ld\r\n", task_info->uxBasePriority);
    printf("任务堆栈基地址:\t\t0x%p\r\n", task_info->pxStackBase);
    printf("任务堆栈历史剩余最小值:\t%d\r\n", task_info->usStackHighWaterMark);
    myfree(SRAMIN, task_info);
    printf("/**************************结束***************************/\r\n");
    printf("按下KEY0键继续!\r\n\r\n\r\n");
    while (key_scan(0) != KEY0_PRES)
    {
        vTaskDelay(10);
    }
     /* 第三步:函数eTaskGetState()的使用  */
    printf("/***********第三步:函数eTaskGetState()的使用*************/\r\n");
    task_state_str = mymalloc(SRAMIN, 10);
    task_handle = xTaskGetHandle("task1");
    task_state = eTaskGetState(task_handle);                        /* 获取任务运行状态 */
    sprintf(task_state_str, task_state == eRunning ? "Runing" :
                            task_state == eReady ? "Ready" :
                            task_state == eBlocked ? "Blocked" :
                            task_state == eSuspended ? "Suspended" :
                            task_state == eDeleted ? "Deleted" :
                            task_state == eInvalid ? "Invalid" :
                                                     "");
    printf("任务状态值: %d,对应状态为: %s\r\n", task_state, task_state_str);
    myfree(SRAMIN, task_state_str);
    printf("/**************************结束***************************/\r\n");
    printf("按下KEY0键继续!\r\n\r\n\r\n");
    while (key_scan(0) != KEY0_PRES)
    {
        vTaskDelay(10);
    }
    /* 第四步:函数vTaskList()的使用 */
    printf("/*************第四步:函数vTaskList()的使用*************/\r\n");
    task_info_buf = mymalloc(SRAMIN, 500);
    vTaskList(task_info_buf);                                       /* 获取所有任务的信息 */
    printf("任务名\t\t状态\t优先级\t剩余栈\t任务序号\r\n");
    printf("%s\r\n", task_info_buf);
    myfree(SRAMIN, task_info_buf);
    printf("/************************实验结束***************************/\r\n");
    
    while (1)
    {
        vTaskDelay(10);
    }
}

三、任务时间统计API函数实验(掌握)

1、实验目的:学习 FreeRTOS 任务运行时间统计相关 API 函数的使用
2、实验设计:将设计三个任务:start_task、task1、task2
三个任务的功能如下:
在这里插入图片描述
时间统计API函数介绍

Void    vTaskGetRunTimeStats( char * pcWriteBuffer ) 

此函数用于统计任务的运行时间信息,使用此函数需将宏 configGENERATE_RUN_TIME_STAT 、configUSE_STATS_FORMATTING_FUNCTIONS 置1
在这里插入图片描述
在这里插入图片描述
时间统计API函数使用流程
1、将宏 configGENERATE_RUN_TIME_STATS 置1
2、将宏 configUSE_STATS_FORMATTING_FUNCTIONS 置1
3、当将此宏 configGENERATE_RUN_TIME_STAT 置1之后,还需要实现2个宏定义:
① portCONFIGURE_TIMER_FOR_RUNTIME_STATE() :用于初始化用于配置任务运行时间统计的时基定时器;
注意:这个时基定时器的计时精度需高于系统时钟节拍精度的10至100倍!
② portGET_RUN_TIME_COUNTER_VALUE():用于获取该功能时基硬件定时器计数的计数值 。

**
 * @brief       task3
 * @param       pvParameters : 传入参数(未用到)
 * @retval      无
 */
void task3(void *pvParameters)
{
    uint8_t key             = 0;
    char    *runtime_info   = NULL;
    
    while (1)
    {
        key = key_scan(0);
        
        switch (key)
        {
            case KEY0_PRES:
            {
                runtime_info = mymalloc(SRAMIN, 100);
                vTaskGetRunTimeStats(runtime_info);             /* 获取任务运行时间信息 */
                printf("任务名\t\t运行时间\t运行所占百分比\r\n");
                printf("%s\r\n", runtime_info);
                myfree(SRAMIN, runtime_info);
                break;
            }
            default:
            {
                break;
            }
        }
        
        vTaskDelay(10);
    }
}

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-29 18:44:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-29 18:44:02       101 阅读
  3. 在Django里面运行非项目文件

    2024-03-29 18:44:02       82 阅读
  4. Python语言-面向对象

    2024-03-29 18:44:02       91 阅读

热门阅读

  1. 等级保护安全扩展要求测评对象分析汇总

    2024-03-29 18:44:02       40 阅读
  2. 自然语言处理(NLP)基础:文本预处理与词嵌入

    2024-03-29 18:44:02       53 阅读
  3. RabbitMQ3.x之五_RabbitMQ中的核心概念

    2024-03-29 18:44:02       52 阅读
  4. 基于SpringBoot IP黑白名单的实现2

    2024-03-29 18:44:02       39 阅读
  5. 文件的输入与输出(史上最全)

    2024-03-29 18:44:02       41 阅读
  6. getcap提权后,无法生效引用动态库的解决办法

    2024-03-29 18:44:02       42 阅读
  7. 代码随想录第九天: 字符串完结

    2024-03-29 18:44:02       46 阅读
  8. python镜像站点

    2024-03-29 18:44:02       43 阅读
  9. 富格林:落实正规计策阻挠虚假亏空

    2024-03-29 18:44:02       51 阅读
  10. 【Android】Base64转图片

    2024-03-29 18:44:02       35 阅读
  11. [蓝桥杯 2019 省 A] 外卖店优先级(模拟)

    2024-03-29 18:44:02       49 阅读