FreeRTOS任务状态

article/2025/8/27 4:34:18

1. 任务状态介绍

FreeRTOS中的任务状态,可以简单的分为运行态(running)和非运行态(not running)。

但是对于非运行态我们还可以继续细分:

  • 阻塞状态(Blocked)
  • 暂停(挂起)状态(Suspended)
  • 就绪状态(Ready)

2. 阻塞状态

上一篇介绍FreeRTOS优先级的博客文章中,所展示的示例代码中,创建的任务是永远都可以执行的,他们一直在不停地执行着自己的任务,而没有去等待其他的任何事件。

但是在实际的产品开发中,我们是不会让一个任务一直在运行的,而是使用“事件驱动”的方法让它运行。就是说任务要等待某个事件发生后它才能运行,这个等待某个事件的过程中就是处于阻塞状态,处于阻塞状态的任务是不会消耗CPU资源的。

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

  • 时间相关的事件。
    • 可以是等待一段时间,比如等3秒钟。使用vTaskDelay函数实现,等待的时间到了任务就会变为就绪态
    • 也可以是等到某个绝对的时间点。使用vTaskDelayUntil函数实现,等到了某个时间点任务就会进入就绪态
  • 同步事件,由其他任务或者中断产生,比如任务A给任务B发送数据,或者任务A等待用户按下按键。同步事件的来源很多,如下:
    • 队列(queue)
    • 二进制信号量(binary semaphores)
    • 互斥量(mutexes)
    • 递归互斥量、递归锁(recursive muxtexes)
    • 事件组(event groups)
    • 任务通知(task notifications)

3.暂停(挂起)状态

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

void vTaskSuspend( TaskHandle_t xTaskToSuspend );

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

任务进入暂停态后,想要退出暂停状态,那只能由别的任务来操作:

  • 其他任务调用vTaskResume
  • 中断程序调用xTaskResumeFromISR

其他任务或中断调用上面这两个函数,才能使得进入暂停态的任务退出暂停状态。

但是在实际开发中,暂停状态很少用。

4. 就绪状态

就绪状态比较简单,就是这个任务既没有阻塞也没有,也没有挂起,那么这个任务就是处于就绪状态的。处于就绪状态的任务是随时都可以被运行的,只是当前还没有运行。

一般任务创建后,就是处于就绪状态的。

5. 状态转换图

如下图,完整的展示了一个任务的各种状态转换。
在这里插入图片描述


http://chatgpt.dhexx.cn/article/Ih8qFw5t.shtml

相关文章

FreeRTOS延时

1、相对延时函数 将当前任务添加到阻塞列表pxDelayedTaskList,任务进入阻塞态。 vTaskDelay → prvAddCurrentTaskToDelayedList → vListInsert( pxDelayedTaskList, &( pxCurrentTCB->xStateListItem ) )。任务的阻塞时间更新到状态列表项xStateListItem x…

FreeRTOS多任务管理

文章目录 1、任务1.1 任务简介1.2 任务调度1.3 任务的状态 (就绪态 / 运行态 / 阻塞态 / 挂起态)1.4 空闲任务 2、动态创建两个任务2.1 定义动态内存空间的堆2.2 定义任务函数2.3 定义 任务控制块 指针2.4 动态创建任务 xTaskCreate()2.5 启动任务 vTaskStartScheduler() 3、常…

FreeRTOS 移植

源码 FreeRTOS源码 选择 FreeRTOS 的最新版本 V9.0.0(2016 年)比较稳定 1)解压后的文件 提取的文件, FreeRTOS—>Source->portable目录下的MemMang,RVDS MemMang 存放内存相关的源文件,heap_1.c,heap_2.c,he…

初识FreeRTos

初识FreeRTos Preface一、FreeRTos简介二、 为什么选择FreeRTos三、FreeRTos资料和源码的下载四、介绍我自己的开发环境4.1FreeRTos4.2AlienTek Summary Preface 距离我上一次写博客已经差不多有5个月了,最近想给自己挖个新坑,讲一讲关于FreeRTos 相关的…

FreeRTOS移植

1. 前言 本文是基于FreeRTOSv9.0.0版本的实时系统,移植到STM32F103芯片平台上。移植环境使用的是MDK5.32版本,我在移植之前就已经构建好了一个裸机工程源码了,而且已经确保了这份裸机代码是没有问题的。开始移植之前我强烈建议一定要确认自己…

FreeRTOS快速入门-初探FreeRTOS

首发,公众号【一起学嵌入式】 对于 RTOS 入门系列文章,已经更新完一款(RT-Thread): 助你快速入门 RT-Thread 这个系列的文章结合 RT-Thread,介绍过 RTOS 相关的核心知识。 接下来,开始另外一…

FreeRTOS系列|FreeRTOS简介

1. RTOS简介 RTOS全称为 Real Time Operation System,即实时操作系统。RTOS强调的是实时性,又分为硬实时和软实时。硬实时要求在规定的时间内必须完成操作,不允许超时;而软实时里对处理过程超时的要求则没有很严格。RTOS的核心就…

freertos任务基础知识(freertos篇)

多任务 对于单任务系统就是常说裸机大while循环,有的时候也需要加一些中断服务函数完成一些处理,相比于多任务而言上面的单任务系统也叫做前后台系统,即(中断服务函数叫前台程序,大while叫后台程序) 前后台…

FreeRTOS学习,适用于FreeRTOS初学者,FreeRTOS整体知识框架

目录 一、为什么要学习FreeRTOS 二、前言------从0到1认识FreeRTOS 1、逻辑系统与多任务系统 1.1、裸机系统:裸机系统通常分成轮询系统和前后台系统 1.2、多任务系统 2、数据结构-列表与列表项 三、任务 3.1基本属性 3.1.1任务栈 3.1.2任务控制块 3.1.3任…

一、初识FreeRTOS之FreeRTOS简介

目录 一、什么是FreeRTOS? 二、为什么选择FreeRTOS? 三、FreeRTOS的特点 四、FreeRTOS资料与源码下载 五、FreeRTOS源码文件介绍 一、什么是FreeRTOS? Free即免费的,RTOS的全称是Real time operating system,中文就是实时操作…

Docker技术入门与实战-第3版.pdf OCR 高清 可复制

Docker技术入门与实战-第3版.pdf OCR 高清 可复制 Docker技术入门与实战-第3版.pdf OCR 高清 可复制简介预览下载地址 Docker技术入门与实战-第3版.pdf OCR 高清 可复制 简介 本书从Docker基本原理开始,深入浅出地讲解Docker的构建与操作,内容系统全面…

从docker到kubernetes(k8s)入门与实战--docker教程

安装docker 装个依赖 yum -y install gcc gcc-c 卸载旧版本 yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-selinux \ docker-engine-selinux \ docker-engine 安装依…

Docker 入门到实战教程(二)安装Docker

一.卸载旧版本 较旧的 Docker 版本称为 docker 或 docker-engine 。如果已安装这些程序,请卸载它们以及相关的依赖项。 $ sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate…

Docker入门及进阶教程

阅读声明: 该教程笔记来源于dockers——菜鸟教程 一、Docker介绍 1. Docker教程 Docker是一个开源的容器引擎,基于Go语言并遵从Apache2.0协议开源。 Docker可以让开发者打包他们的应用以及依赖包到一个轻量级,可移植的容器,然后发…

Docker 实战

目录 一、常用操作 1、镜像创建 2、镜像查询 3、镜像删除 4、镜像运行 5、查询容器进程 6、查询容器执行日志 7、删除容器 8、进入容器 二、导入和导出 1、save 和 load 2、export 和 import 3、区别 三、案例 1、检查是否安装依赖 2、安装依赖 3、docker打包镜…

Docker 实战教程之从入门到提高 (四)

本系列的前三篇文章,我们学习了如何在 Ubuntu 操作系统安装 Docker,并且通过实战练习,了解了 Docker 和宿主机操作系统文件目录互相隔离的实现原理,以及 Docker Volume 的工作原理。通过动手对 Nginx Docker 镜像进行修改&#xf…

Docker快速入门实战

为什么使用容器? 1、上线流程繁琐 2、资源利用率低 3、扩容/缩容不及时 4、服务器环境臃肿 5、环境不一致性 容器VS虚拟机 VM VS Container Docker 是什么 1、使用最广泛的开源容器引擎 2、一种操作系统级的虚拟化技术 3 、依赖于Linux内核特性&#xff1…

Docker教程(Docker实战)

Docker快速入门教程 **欢迎关注公众号【程猿薇茑】** 【仅需一次订阅,作者所有专栏都能看】 推荐【Kafka】https://bigbird.blog.csdn.net/article/details/108770504 推荐【rabbitmq】https://bigbird.blog.csdn.net/article/details/81436980 推荐【Flink】https://blog.csdn…

Docker最全教程——从理论到实战(一)

容器是应用走向云端之后必然的发展趋势,因此笔者非常乐于和大家分享我们这段时间对容器的理解、心得和实践。 本篇教程持续编写了2个星期左右,只是为了大家更好地了解、理解和消化这个技术,能够搭上这波车。 你可以关注我们的公众号“magicco…

Docker 实战教程之从入门到提高(二)

本系列第一篇文章,Docker 实战教程之从入门到提高 (一),我们已经介绍了如何在 Ubuntu 操作系统中安装 Docker,以及 Proxy 和 Insecure Registry 的配置。 本文继续 Docker 的实战学习。 练习1:通过一个简单例子学习 Docker 和宿…