(5)FreeRTOS任务函数api

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

任务的相关函数

在这里插入图片描述

我的默认参数

#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
  • 25
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值