【FreeRtos基础入门】任务状态

简介: 【FreeRtos基础入门】任务状态

前言


freertos使用stm32系列单片机,使用其他的也可以,如esp系列等…

任务管理是实时操作系统(RTOS)的核心功能之一,它允许开发者以并发的方式组织和管理多个任务。FreeRTOS 是一个流行的开源RTOS,它提供了强大的任务管理功能,让开发者能够轻松创建和控制任务。本文将介绍 FreeRTOS 的任务管理功能,包括任务的创建、删除、挂起、恢复和优先级控制等方面的内容。


一、任务状态


以前我们很简单地把任务的状态分为2中:运行(Runing)、非运行(Not Running)。

这两种"非运行"状态就不一样,可以细分为:

阻塞状态(Blocked)

暂停状态(Suspended)

就绪状态(Ready)


1.阻塞状态(Blocked)

在日常生活的例子中,母亲在电脑前跟同事沟通时,如果同事一直没回复,那么母亲的工作就被卡住了、被堵住了、处于阻塞状态(Blocked)。重点在于:母亲在等待。

在 上个博客的 实验中,如果把任务2中的vTaskDelay没有调用,那么任务1根本没有执行的机会,任务1被"饿死"了(starve)。

在实际产品中,我们不会让一个任务一直运行,而是使用"事件驱动"的方法让它运行:

任务要等待某个事件,事件发生后它才能运行

在等待事件过程中,它不消耗CPU资源

在等待事件的过程中,这个任务就处于阻塞状态(Blocked)

在阻塞状态的任务,它可以等待两种类型的事件:

时间相关的事件

可以等待一段时间:我等2分钟

也可以一直等待,直到某个绝对时间:我等到下午3点

同步事件:这事件由别的任务,或者是中断程序产生

例子1:任务A等待任务B给它发送数据

例子2:任务A等待用户按下按键

同步事件的来源有很多(这些概念在后面会细讲):

队列(queue)

二进制信号量(binary semaphores)

计数信号量(counting semaphores)

互斥量(mutexes)

递归互斥量、递归锁(recursive mutexes)

事件组(event groups)

任务通知(task notifications)

在等待一个同步事件时,可以加上超时时间。比如等待队里数据,超时时间设为10ms:

10ms之内有数据到来:成功返回

10ms到了,还是没有数据:超时返回


2.暂停状态(Suspended)

在日常生活的例子中,母亲正在电脑前跟同事沟通,母亲可以暂停:

好烦啊,我暂停一会

领导说:你暂停一下

FreeRTOS中的任务也可以进入暂停状态,唯一的方法是通过vTaskSuspend函数。函数原型如下:

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


参数为要暂停任务的句柄,如果为NULL,表示暂停自己。

要退出暂停状态,只能由别人来操作:

别的任务调用:vTaskResume

中断程序调用:xTaskResumeFromISR

实际开发中,暂停状态用得不多。

uint32_t count = 0;
TaskHandle_t mytaskHandle;
TaskHandle_t mytaskHandle2;
void Task(void *p)
{
  int32_t *i = (int*)p;
  while(1)
  {
    printf("Count:%d\r\n",*i);
   (*i)++;
    vTaskDelay(pdMS_TO_TICKS(500));
  }
  vTaskDelete(NULL);
}
void Task2(void *p)
{
  uint8_t Priority = 1;
  while(1)
  {
    if(key_scan(0) == KEY0_PRES)
    {
      Priority++;
      vTaskResume(mytaskHandle);
    }
    vTaskDelay(20);
  }
  vTaskDelete(NULL);
}
void csdnTaskTest(void)
{
  xTaskCreate(Task,"MyTask",50,&count,1,&mytaskHandle);
  xTaskCreate(Task2,"MyTask2",50,&count,3,&mytaskHandle2);
  vTaskSuspend(mytaskHandle);
  vTaskStartScheduler();
}


在这个代码中,我们调用了vTaskSuspend(mytaskHandle);来暂停mytaskHandle,运行结果如下:

9b32b1fb180a45fb986aa2c8f1bd6d22.png

这边就没有任何打印了。

我们可以使用vTaskResume(TaskHandle_t xTaskToSuspend)来开启任务

然后我们点击key0就可以继续运行这个任务了。当我们按按键后就像下面

3bc95a7235584e5b9214fce9897d48e0.png


3.就绪状态(Ready)

这个任务完全准备好了,随时可以运行:只是还轮不到它。这时,它就处于就绪态(Ready)。


总结


提示:这里对文章进行总结:

例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

相关文章
|
传感器 调度 开发者
【Freertos基础入门】freertos任务的优先级
【Freertos基础入门】freertos任务的优先级
511 0
|
数据可视化 中间件 API
FreeRTOS记录(一、熟悉开发环境以及CubeMX下FreeRTOS配置)
熟悉 在 STM32 CubeMX 下面的 FreeRTOS 使用
1644 1
FreeRTOS记录(一、熟悉开发环境以及CubeMX下FreeRTOS配置)
|
6月前
|
消息中间件 调度
FreeRTOS入门教程(任务状态)
FreeRTOS入门教程(任务状态)
246 0
|
5月前
|
消息中间件 算法 编译器
【FreeRTOS(一)】FreeRTOS新手入门——初识FreeRTOS
【FreeRTOS(一)】FreeRTOS新手入门——初识FreeRTOS
|
5月前
|
传感器 物联网 调度
从0入门FreeRTOS之第一节 什么是FreeRTOS?
FreeRTOS(Free Real-Time Operating System)是一款开源的实时操作系统(RTOS),专为嵌入式系统设计。由Real Time Engineers Ltd.开发和维护,FreeRTOS以其小巧、高效、易于使用的特点广受欢迎。FreeRTOS支持多种微控制器和微处理器平台,提供丰富的实时操作系统功能,使开发者能够轻松构建高效、实时响应的应用程序。
344 0
|
5月前
|
存储 安全 算法
从0入门FreeRTOS之第二节FreeRTOS的体系结构
FreeRTOS的体系结构设计精巧且高效,专为嵌入式系统量身打造。理解FreeRTOS的体系结构对开发高效、稳定的嵌入式应用至关重要。下面,我们详细介绍FreeRTOS的核心组件、内核机制、中断管理和内存管理等内容。
192 0
|
调度 开发者
【Freertos基础入门】2个Freertos的Delay函数
【Freertos基础入门】2个Freertos的Delay函数
816 1
|
6月前
|
API
FreeRTOS软件定时器的原理以及使用实例
FreeRTOS软件定时器的原理以及使用实例
143 0
|
6月前
|
消息中间件 存储 数据采集
FreeRTOS入门教程(任务通知)
FreeRTOS入门教程(任务通知)
125 0