目录
一、任务状态介绍
1、任务状态转换图
2、阻塞状态
- 任务要等待某个事件,事件发生后它才能运行
- 在等待事件过程中,它不消耗CPU资源
- 在等待事件的过程中,这个任务就处于阻塞状态(Blocked)
在阻塞状态的任务,它可以等待两种类型的事件:
- 时间相关的事件
- 可以等待一段时间:我等2分钟
- 也可以一直等待,直到某个绝对时间:我等到下午3点
- 同步事件:这事件由别的任务,或者是中断程序产生
- 例子1:任务A等待任务B给它发送数据
- 例子2:任务A等待用户按下按键
- 同步事件的来源有很多:
- 队列(queue)
- 二进制信号量(binary semaphores)
- 计数信号量(counting semaphores)
- 互斥量(mutexes)
- 递归互斥量、递归锁(recursive mutexes)
- 事件组(event groups)
- 任务通知(task notifications)
在等待一个同步事件时,可以加上超时时间。比如等待队里数据,超时时间设为10ms:
- 10ms之内有数据到来:成功返回
- 10ms到了,还是没有数据:超时返回
3、暂停状态
void vTaskSuspend( TaskHandle_t xTaskToSuspend );
参数xTaskToSuspend表示要暂停的任务,如果为NULL,表示暂停自己
要退出暂停状态,只能由别人来操作:
- 别的任务调用:vTaskResume
- 中断程序调用:xTaskResumeFromISR
4、就绪状态
这个任务完全准备好了,随时可以运行:只是还轮不到它。这时,它就处于就绪态(Ready)。
二、任务状态例程
1、实现目标
任务一使用按键控制任务三的暂停和运行,任务二阻塞状态用来计时
2、代码
任务一二不需要被操作,因此不需要任务句柄,任务三需要创建任务句柄。
//任务状态
xTaskCreate(task_state1,"task_state1",128,NULL,osPriorityNormal,NULL);
xTaskCreate(task_state2,"task_state2",128,NULL,osPriorityNormal,NULL);
xTaskCreate(task_state3,"task_state3",128,NULL,osPriorityNormal,&taskstate3handle);
具体函数实现如下
void task_state1(void *param)
{
for( ;; )
{
if(key[0].single_flag == 1)
{
vTaskSuspend(taskstate3handle);
key[0].single_flag = 0;
}
if(key[0].long_flag == 1)
{
vTaskResume(taskstate3handle);
key[0].long_flag = 0;
}
}
}
void task_state2(void *param)
{
for( ;; )
{
led_toggle(green);
vTaskDelay(200);
}
}
void task_state3(void *param)
{
int num = 0;
for( ;; )
{
sprintf(text,"num:%d",num);
OLED_ShowString(0,0,(uint8_t *)text,16);
num ++;
vTaskDelay(500);
}
}