提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
任务的相关函数
我的默认参数
#define task2_PRIO 3
#define task2_STK_SIZE 50
TaskHandle_t task2_Handler;
void task2_void(void *pvParameters);
void freertos_begin(void)
{
xTaskCreate((TaskFunction_t )start_task,
(const char* )"start_task",
(uint16_t )START_STK_SIZE,
(void* )NULL,
(UBaseType_t )START_TASK_PRIO,
(TaskHandle_t* )&StartTask_Handler);
vTaskStartScheduler();
}
void start_task(void *pvParameters)
{
taskENTER_CRITICAL();
xTaskCreate((TaskFunction_t )task2_void,
(const char* )"task2_void",
(uint16_t )task2_STK_SIZE,
(void* )NULL,
(UBaseType_t )task2_PRIO,
(TaskHandle_t* )&task2_Handler);
vTaskDelete(NULL);
taskEXIT_CRITICAL();
}
void task2_void(void *pvParameters)
{
while(1)
{
vTaskDelay(500);
}
}
一、uxTaskPriorityGet
获取一个任务的优先级,返回一个整数
代码如下(示例):
void task2_void(void *pvParameters)
{
while(1)
{
int a=uxTaskPriorityGet(task2_Handler);
printf("%d\r\n",a);
vTaskDelay(500);
}
}
打开串口助手输出task2的优先级
vTaskPrioritySet
设置一个任务的优先级,搭配uxTaskPriorityGet可以看到效果
代码如下(示例):
void task2_void(void *pvParameters)
{
vTaskPrioritySet(task2_Handler,5);
while(1)
{
int a=uxTaskPriorityGet(task2_Handler);
printf("%d\r\n",a);
vTaskDelay(500);
}
}
uxTaskGetNumberOfTasks
获取所有进行的任务
代码如下(示例):
void task2_void(void *pvParameters)
{
while(1)
{
UBaseType_t a=uxTaskGetNumberOfTasks();
printf("%ld\r\n",a);
vTaskDelay(500);
}
}
uxTaskGetNumberOfTasks
获取所有进行的任务
这个函数比前面几个要难
首先他有三个参数
第一个参数TaskStatus_t * const pxTaskStatusArray要求是结构体首地址,可以根据pvPortMalloc得出,下面有使用案例
第二个参数是结构体中有几个数组,也就是有几个任务,我们可以根据uxTaskGetSystemState得出
第三个参数是时间,一般不用,NULL就好
代码如下(乱码不要在意,复制粘贴到keil就好了):
uint8_t i=0;
UBaseType_t a;
TaskStatus_t* status=0;
a=uxTaskGetNumberOfTasks();
status=pvPortMalloc(a * sizeof( TaskStatus_t ) );
a=uxTaskGetSystemState( status,a,NULL);
printf("ÈÎÎñÃû×Ö\tÈÎÎñÓÅÏȼ¶\r\n");
for(i=0;i<a;i++)
{
printf("%s\t%ld\r\n",status[i].pcTaskName,status[i].uxCurrentPriority);
}
while(1)
{
vTaskDelay(500);
}
vTaskGetInfo
获取单个任务的状态
从源码可以看出他没有返回值
void vTaskGetInfo( TaskHandle_t xTask,
TaskStatus_t *pxTaskStatus,
BaseType_t xGetFreeStackSpace,
eTaskState eState );
xTask:任务句柄
pxTaskStatus:结果存放的数组
xGetFreeStackSpace:pdFALSE/pdTRUE
**eState **:是否检测任务的状态
代码如下(示例):
void task2_void(void *pvParameters)
{
TaskStatus_t* status=0;
status=pvPortMalloc(sizeof( TaskStatus_t ) );
printf("ÈÎÎñÃû×Ö\tÈÎÎñÓÅÏȼ¶\tÈÎÎñ±àºÅ\tÈÎÎñ״̬\r\n");
vTaskGetInfo( task1_Handler, status, pdTRUE, eInvalid);
printf("%s\t%ld\t%ld\t%d\r\n",status->pcTaskName,
status->uxCurrentPriority,
status->xTaskNumber,
status->eCurrentState);
while(1)
{
vTaskDelay(500);
}
}
常用输出参数解释:
参数 | Value |
---|---|
pcTaskName | 任务名称 |
uxCurrentPriority | 任务优先级 |
xTaskNumber | 任务编号 |
eCurrentState | 任务状态 |
ulRunTimeCounter | 任务运行时间(configGENERATE_RUN_TIME_STATS) |
xTaskGetCurrentTaskHandle
获取当前任务的句柄
代码如下(示例):
void task2_void(void *pvParameters)
{
while(1)
{
UBaseType_t a=uxTaskGetNumberOfTasks();
printf("%ld\r\n",a);
vTaskDelay(500);
}
}
eTaskGetState
获取任务状态
代码如下(示例):
void task2_void(void *pvParameters)
{
eTaskState status=eTaskGetState( &task1_Handler );
printf("%d",status);
while(1)
{
vTaskDelay(500);
}
}
小知识
类型 | 输出格式 |
---|---|
eTaskState | %d |
UBaseType_t | %ld |
TaskStatus_t | %s |
TaskHandle_t | %p |