目录标题
一、任务管理相关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 调用明确命令时 才会进入或退出挂起状态。