FreeRTOS_任务管理

一、任务管理相关API

2.1、创建任务

动态分配内存:

BaseType_t xTaskCreate(	TaskFunction_t pxTaskCode,
							const char * const pcName,		
							const configSTACK_DEPTH_TYPE usStackDepth,
							void * const pvParameters,
							UBaseType_t uxPriority,
							TaskHandle_t * const pxCreatedTask )
参数描述
pxTaskCode函数指针, 任务函数
pcName任务名,仅用于调试目的
usStackDepth分配栈的大小,单位为字节
pvParameters传入的参数
uxPriority优先级,数值越大优先级越高
pxCreatedTask任务的句柄Handle
返回值pdPASS:成功 errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY:内存不足,失败

静态分配内存:

TaskHandle_t xTaskCreateStatic(	TaskFunction_t pxTaskCode,
									const char * const pcName,
									const uint32_t ulStackDepth,
									void * const pvParameters,
									UBaseType_t uxPriority,
									StackType_t * const puxStackBuffer,
									StaticTask_t * const pxTaskBuffer )
参数描述
puxStackBuffer静态分配的栈内存
pxTaskBuffer静态分配的StaticTask_t结构体的指针
返回值成功:返回句柄 失败:NULL

使用示例:

static StackType_t g_pucStackOfColorTask[128];  //给任务分配一段静态栈
static StaticTask_t g_TCBOfColorTask;              //静态分配的任务结构体
static TaskHandle_t xColorTaskHandle=NULL;          //任务句柄

xColorTaskHandle=xTaskCreateStatic(ColorLED_Test,"led_task",128,NULL,osPriorityNormal,g_pucStackOfColorTask,&g_TCBOfColorTask);
if(xColorTaskHandle!=NULL)
printf("Create Task Success!!");

2.2、删除任务

void vTaskDelete( TaskHandle_t xTaskToDelete )

当在本任务的结尾删除自己时可以直接传入NULL;要想删除其他任务,则要传入相应任务的句柄Handle。

2.3、配置任务优先级

/*使用下面的函数可获取任务的优先级*/
UBaseType_t uxTaskPriorityGet( const TaskHandle_t xTask );
/*使用下面的函数来设置指定任务的优先级*/
void vTaskPrioritySet( TaskHandle_t xTask,          //任务句柄
                       UBaseType_t uxNewPriority ); //设置的优先级

2.4、进入阻塞(Blocked)状态

  • vTaskDelay()
void vTaskDelay( const TickType_t xTicksToDelay );
参数描述
xTicksToDelay表示需要延迟的时间,以系统时钟节拍数(Tick)为单位
  • vTaskDelayUntil()
    此函数用于任务的固定周期执行。
void vTaskDelayUntil( TickType_t * const pxPreviousWakeTime,
                      const TickType_t xTimeIncrement );

参数说明:

参数描述
pxPreviousWakeTime指针,指向上次任务触发的时间
xTimeIncrement任务执行的时间间隔

具体使用:

TickType_t PreTime;//定义变量,用来存储任务触发的时间
PreTime = xTaskGetTickCount();
//用于获取当前系统的时钟节拍数(tick count)(在while前使用,因为第一次使用需要人为赋值)
vTaskDelayUntil(&PreTime,500);//此函数在while中用于延时,PreTime后面会由此函数自动更新

2.5、进入挂起(Suspend)状态

void vTaskSuspend( TaskHandle_t xTaskToSuspend );
//参数xTaskToSuspend表示要暂停的任务,如果为NULL,表示暂停自己。

2.6、恢复就绪(Ready)状态

void vTaskResume( TaskHandle_t xTaskToResume )
//参数xTaskToSuspend表示要恢复的任务。只能由其他任务恢复。

二、任务状态

1.1、运行(Running)状态

当任务实际执行时,它被称为处于运行状态。 任务当前正在使用处理器。 如果运行 RTOS 的处理器只有一个内核, 那么在任何给定时间内都只能有一个任务处于运行状态。

1.2、就绪(Ready)状态

任务已经准备好进入运行态了,但是还有其它任务正在运行,此时,它就处于就绪态。

1.3、阻塞(Blocked)状态

如果任务当前正在等待时间或外部事件,则该任务被认为处于阻塞状态。 例如,如果一个任务调用vTaskDelay(),它将被阻塞(被置于阻塞状态), 直到延迟结束。 任务也可以通过阻塞来等待队列、信号量、事件组、通知或信号量事件。 处于阻塞状态的任务通常有一个"超时"期, 超时后任务将被超时,并被解除阻塞, 即使该任务所等待的事件没有发生。
“阻塞”状态下的任务不使用任何处理时间,不能被选择进入运行状态。

1.4、挂起(Suspend)状态

与“阻塞”状态下的任务一样, “挂起”状态下的任务不能 被选择进入运行状态,但处于挂起状态的任务 没有超时。
并且任务只有在分别通过 vTaskSuspend()xTaskResume() API 调用明确命令时 才会进入或退出挂起状态。

1.5、完整的状态转换图

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值