FreeRTOS任务状态信息查询

灰太狼 2022-06-01 00:50 551阅读 0赞

uxTaskPriorityGet():查询某个任务的优先级
vTaskPrioritySet():改变某个任务的任务优先级
uxTaskGetSystemState():获取系统中任务状态
vTaskGetInfo():获取某个任务信息
xTaskGetApplicationTaskTag():获取某个任务的标签(Tag)值
xTaskGetCurrentTaskHandle():获取当前正在运行的任务的任务句柄
xTaskGetHandle():根据任务名字查找某个任务的句柄
xTaskGetIdleTaskHandle():获取空闲任务的任务句柄
uxTaskGetStackHighWaterMark():获取任务的堆栈的历史剩余最小值,FreeRTOS 中叫做“高水位线”
eTaskGetState():获取某个任务的壮态,这个壮态是 eTaskState 类型
pcTaskGetName():获取某个任务的任务名字
xTaskGetTickCount():获取系统时间计数器值
xTaskGetTickCountFromISR():在中断服务函数中获取时间计数器值
xTaskGetSchedulerState():获取任务调度器的壮态,开启或未开启
uxTaskGetNumberOfTasks():获取当前系统中存在的任务数量
vTaskList():以一种表格的形式输出当前系统中所有任务的详细信息
vTaskGetRunTimeStats():获取每个任务的运行时间
vTaskSetApplicationTaskTag():设置任务标签(Tag)值
SetThreadLocalStoragePointer():设置线程本地存储指针
GetThreadLocalStoragePointer():获取线程本地存储指针

使用举例

  1. /* * UBaseType_t uxTaskGetNumberOfTasks( void ) * UBaseType_t uxTaskGetSystemState( TaskStatus_t * const pxTaskStatusArray, * const UBaseType_t uxArraySize, uint32_t * const pulTotalRunTime ) */
  2. TaskStatus_t *StatusArray;
  3. UBaseType_t task_num;
  4. task_num=uxTaskGetNumberOfTasks(); //获取系统任务数量
  5. printf("uxTaskGetNumberOfTasks %d\r\n", task_num);
  6. StatusArray=pvPortMalloc(task_num*sizeof(TaskStatus_t));//申请内存
  7. if(StatusArray!=NULL) //内存申请成功
  8. {
  9. ArraySize=uxTaskGetSystemState((TaskStatus_t* )StatusArray, //任务信息存储数组
  10. (UBaseType_t )task_num, //任务信息存储数组大小
  11. (uint32_t* )&TotalRunTime);//保存系统总的运行时间
  12. printf("TaskName\t\tPriority\t\tTaskNumber\t\t\r\n");
  13. for(x=0;x<task_num;x++)
  14. {
  15. printf("%s\t\t%d\t\t\t%d\t\t\t\r\n",
  16. StatusArray[x].pcTaskName, //任务名称
  17. (int)StatusArray[x].uxCurrentPriority, //任务优先级
  18. (int)StatusArray[x].xTaskNumber); //任务编号
  19. }
  20. }
  21. vPortFree(StatusArray); //释放内存

实验现象

  1. uxTaskGetNumberOfTasks 5
  2. TaskName Priority TaskNumber
  3. query_task 3 5
  4. led0_task 2 4
  5. IDLE 0 2
  6. start_task 1 1
  7. Tmr Svc 31 3

使用举例

  1. /* * TaskHandle_t xTaskGetHandle( const char *pcNameToQuery ) * void vTaskGetInfo( TaskHandle_t xTask, TaskStatus_t *pxTaskStatus, * BaseType_t xGetFreeStackSpace, eTaskState eState ) */
  2. TaskHandle_t TaskHandle;
  3. TaskStatus_t TaskStatus;
  4. TaskHandle=xTaskGetHandle("led0_task"); //根据任务名获取任务句柄
  5. //获取LED0_Task的任务信息
  6. vTaskGetInfo((TaskHandle_t )TaskHandle, //任务句柄
  7. (TaskStatus_t* )&TaskStatus, //任务信息结构体
  8. (BaseType_t )pdTRUE, //允许统计任务堆栈历史最小剩余大小
  9. (eTaskState )eInvalid); //函数自己获取任务运行壮态
  10. printf("任务名: %s\r\n",TaskStatus.pcTaskName);
  11. printf("任务编号: %d\r\n",(int)TaskStatus.xTaskNumber);
  12. printf("任务壮态: %d\r\n",TaskStatus.eCurrentState);
  13. printf("任务当前优先级: %d\r\n",(int)TaskStatus.uxCurrentPriority);
  14. printf("任务基优先级: %d\r\n",(int)TaskStatus.uxBasePriority);
  15. printf("任务堆栈基地址: %#x\r\n",(int)TaskStatus.pxStackBase);
  16. printf("任务堆栈历史剩余最小值: %d\r\n",TaskStatus.usStackHighWaterMark);

实验现象

  1. 任务名: led0_task
  2. 任务编号: 4
  3. 任务壮态: 2
  4. 任务当前优先级: 2
  5. 任务基优先级: 2
  6. 任务堆栈基地址: 0x200012e8
  7. 任务堆栈历史剩余最小值: 108

使用举例

  1. /* * eTaskState eTaskGetState( TaskHandle_t xTask ) */
  2. typedef enum
  3. {
  4. eRunning = 0, /* A task is querying the state of itself, so must be running. */
  5. eReady, /* The task being queried is in a read or pending ready list. */
  6. eBlocked, /* The task being queried is in the Blocked state. */
  7. eSuspended, /* The task being queried is in the Suspended state, or is in the Blocked state with an infinite time out. */
  8. eDeleted, /* The task being queried has been deleted, but its TCB has not yet been freed. */
  9. eInvalid /* Used as an 'invalid state' value. */
  10. } eTaskState;
  11. TaskHandle=xTaskGetHandle("query_task"); //根据任务名获取任务句柄
  12. TaskState=eTaskGetState(TaskHandle); //获取query_task任务的任务壮态
  13. switch((int)TaskState)
  14. {
  15. case eRunning:
  16. sprintf(TaskInfo,"Running");
  17. break;
  18. case eReady:
  19. sprintf(TaskInfo,"Ready");
  20. break;
  21. case eSuspended:
  22. sprintf(TaskInfo,"Suspended");
  23. break;
  24. case eDeleted:
  25. sprintf(TaskInfo,"Deleted");
  26. break;
  27. case eInvalid:
  28. sprintf(TaskInfo,"Invalid");
  29. break;
  30. }
  31. printf("任务壮态值:%d,对应的壮态为:%s\r\n",TaskState,TaskInfo);

实验现象

  1. 任务壮态值:0,对应的壮态为:Running

使用举例

  1. /* * void vTaskList( char * pcWriteBuffer ) */
  2. vTaskList(InfoBuffer); //获取所有任务的信息
  3. printf("%s\r\n",InfoBuffer);

实验现象

  1. query_task R 3 192 5
  2. IDLE R 0 108 2
  3. led0_task B 2 108 4
  4. Tmr Svc S 31 236 3

发表评论

表情:
评论列表 (有 0 条评论,551人围观)

还没有评论,来说两句吧...

相关阅读

    相关 FreeRTOS任务间通讯

    FreeRTOS 任务间通讯的方法有很多种。其中常用的方法包括: 1. 使用消息队列:在 FreeRTOS 中,可以使用 xQueueCreate 函数创建消息队列,然后使