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