FreeRTOS——任务状态

目录

一、任务状态介绍

1、任务状态转换图

2、阻塞状态

3、暂停状态

4、就绪状态

二、任务状态例程

1、实现目标

2、代码


一、任务状态介绍

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);
  }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

琪琪猫不会嵌入式

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值