当前位置: 首页 > news >正文

《FreeRTOS任务基础知识篇》

FreeRTOS任务基础知识

  • 1. 什么是多任务系统?
  • 2. FreeRTOS任务
  • 3. 任务状态
    • 3.1 运行态
    • 3.2 就绪态
    • 3.3 阻塞态
    • 3.4 挂起态
  • 4. 任务优先级
  • 5. 任务的实现
  • 6. 任务控制块
  • 7. 任务堆栈

FreeRTOS的核心是任务管理,以下介绍FreeRTOS任务的一些基础知识。

1. 什么是多任务系统?

  • FreeRTOS是一个抢占式多任务系统,它的任务调度器也是抢占式的。
  • 基本原理:
    1. 高优先级的任务可以打断低优先级的任务,取得CPU的使用权,从而保证紧急任务的运行。
    2. 高优先级的任务执行完成后,重新释放CPU的使用权,低优先级的任务才可以继续执行。
      在这里插入图片描述

2. FreeRTOS任务

  • 每个实时应用都可以作为一个独立的任务。
  • 任何一个时间点只能有一个任务运行,具体运行哪一个任务是由任务调度器来决定的,因此任务调度器会不断地的开启、关闭每个任务。
  • 任务调度器的职责是确保每个任务开始执行时其上下文环境(寄存器值、堆栈内容等)和任务上一次退出的时候相同。为了做到这一点,每个任务都必须有个堆栈,当任务切换时将上下文环境保存到堆栈中,这样任务再次执行时就可以从堆栈中取出上下文环境,任务恢复执行。

3. 任务状态

3.1 运行态

  • 一个任务运行时,就处于就绪态,处于运行态的任务就是当前正在执行的任务。

3.2 就绪态

  • 处于就绪态的任务就是那些已经准备就绪的任务(未被挂起或者阻塞),但是还没有运行是因为有一个同优先级或者更高优先级的任务正在运行。

3.3 阻塞态

  • 如果一个任务正在等候某一个外部事件,则该任务处于阻塞态。任务进入阻塞态会有一个超时时间,超过这个超时时间任务会退出阻塞态,即使所等待的事件还没有来临。

3.4 挂起态

  • 任务进入挂起态后不能被任务调度器调用进入运行态,但是进入挂起态的任务没有超时时间。
  • 任务进入和退出挂起态只有通过调用函数 vTaskSuspend() 和 vTaskResume() 来实现。
    在这里插入图片描述

4. 任务优先级

  • 每个任务都可以分配一个从0 ~ (configMAX_PRIORITIES - 1) 的优先级。
  • 优先级的数字越低表示任务的优先级越低,0是最低优先级。
  • 空闲任务的优先级最低,为0。
  • FreeROTS调度器确保处于就绪态或者运行态的高优先级的任务获取处理器使用权。处于就绪态的高优先级任务才会运行。
  • 当宏 configUSE_TIME_SLICING 定义为1,多个任务可以共用一个优先级,数量不限。系统默认设置为1,处于就绪态的优先级相同的多个任务会使用时间片轮转调度器获取运行时间。

5. 任务的实现

  • 使用FreeRTOS过程中,创建任务会使用函数 xTaskCreate() 或 xTaskCreateStatic() 。
  • 两个函数的第一个参数都是 pxTaskCode,表示任务的任务函数,任务函数就是完成本任务工作的函数。
/* 任务函数示例 */
/* 函数返回值类型一定要为void类型,任务的参数也是void指针类型。 */
void vTaskCode( void * pvParameters )
{for( ;; ){/* Task code goes here. */vTaskDelay(); /* 此处只要是能让FreeRTOS发生任务切换的函数即可。 */}/* 正常任务不允许退出循环,如果要跳出,则需要删除任务 */vTaskDelete(NULL);
}

6. 任务控制块

  • FreeRTOS每个任务都有一个属性需要存储,把这些属性集合到一起用一个结构体来表示,这个结构体就是任务控制块:TCB_t。
  • 使用任务创建函数时,会自动给每个任务分配一个任务控制块。
typedef struct tskTaskControlBlock       /* The old naming convention is used to prevent breaking kernel aware debuggers. */
{volatile StackType_t * pxTopOfStack; /*< Points to the location of the last item placed on the tasks stack.  THIS MUST BE THE FIRST MEMBER OF THE TCB STRUCT. */#if ( portUSING_MPU_WRAPPERS == 1 )xMPU_SETTINGS xMPUSettings; /*< The MPU settings are defined as part of the port layer.  THIS MUST BE THE SECOND MEMBER OF THE TCB STRUCT. */#endifListItem_t xStateListItem;                  /*< The list that the state list item of a task is reference from denotes the state of that task (Ready, Blocked, Suspended ). */ListItem_t xEventListItem;                  /*< Used to reference a task from an event list. */UBaseType_t uxPriority;                     /*< The priority of the task.  0 is the lowest priority. */StackType_t * pxStack;                      /*< Points to the start of the stack. */char pcTaskName[ configMAX_TASK_NAME_LEN ]; /*< Descriptive name given to the task when created.  Facilitates debugging only. */ /*lint !e971 Unqualified char types are allowed for strings and single characters only. */#if ( ( portSTACK_GROWTH > 0 ) || ( configRECORD_STACK_HIGH_ADDRESS == 1 ) )StackType_t * pxEndOfStack; /*< Points to the highest valid address for the stack. */#endif#if ( portCRITICAL_NESTING_IN_TCB == 1 )UBaseType_t uxCriticalNesting; /*< Holds the critical section nesting depth for ports that do not maintain their own count in the port layer. */#endif#if ( configUSE_TRACE_FACILITY == 1 )UBaseType_t uxTCBNumber;  /*< Stores a number that increments each time a TCB is created.  It allows debuggers to determine when a task has been deleted and then recreated. */UBaseType_t uxTaskNumber; /*< Stores a number specifically for use by third party trace code. */#endif#if ( configUSE_MUTEXES == 1 )UBaseType_t uxBasePriority; /*< The priority last assigned to the task - used by the priority inheritance mechanism. */UBaseType_t uxMutexesHeld;#endif#if ( configUSE_APPLICATION_TASK_TAG == 1 )TaskHookFunction_t pxTaskTag;#endif#if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 )void * pvThreadLocalStoragePointers[ configNUM_THREAD_LOCAL_STORAGE_POINTERS ];#endif#if ( configGENERATE_RUN_TIME_STATS == 1 )configRUN_TIME_COUNTER_TYPE ulRunTimeCounter; /*< Stores the amount of time the task has spent in the Running state. */#endif#if ( ( configUSE_NEWLIB_REENTRANT == 1 ) || ( configUSE_C_RUNTIME_TLS_SUPPORT == 1 ) )configTLS_BLOCK_TYPE xTLSBlock; /*< Memory block used as Thread Local Storage (TLS) Block for the task. */#endif#if ( configUSE_TASK_NOTIFICATIONS == 1 )volatile uint32_t ulNotifiedValue[ configTASK_NOTIFICATION_ARRAY_ENTRIES ];volatile uint8_t ucNotifyState[ configTASK_NOTIFICATION_ARRAY_ENTRIES ];#endif/* See the comments in FreeRTOS.h with the definition of* tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE. */#if ( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) /*lint !e731 !e9029 Macro has been consolidated for readability reasons. */uint8_t ucStaticallyAllocated;                     /*< Set to pdTRUE if the task is a statically allocated to ensure no attempt is made to free the memory. */#endif#if ( INCLUDE_xTaskAbortDelay == 1 )uint8_t ucDelayAborted;#endif#if ( configUSE_POSIX_ERRNO == 1 )int iTaskErrno;#endif
} tskTCB;/* The old tskTCB name is maintained above then typedefed to the new TCB_t name* below to enable the use of older kernel aware debuggers. */
typedef tskTCB TCB_t;

7. 任务堆栈

  • FreeRTOS之所以能够正确恢复一个任务的运行,就是因为有任务堆栈。
  • 创建任务的时候需要指定任务堆栈,如果使用动态创建任务的方式,任务堆栈会有函数自动分配。如果使用静态创建任务的方式,需要程序员手动分配任务堆栈。
  • 任务堆栈的数据类型为StackType_t,以下为该类型在DSP中的定义。
typedef unsigned int   __uint16_t;
typedef	__uint16_t		uint16_t;
#define portSTACK_TYPE  uint16_t
typedef portSTACK_TYPE StackType_t;

相关文章:

《FreeRTOS任务基础知识篇》

FreeRTOS任务基础知识 1. 什么是多任务系统&#xff1f;2. FreeRTOS任务3. 任务状态3.1 运行态3.2 就绪态3.3 阻塞态3.4 挂起态 4. 任务优先级5. 任务的实现6. 任务控制块7. 任务堆栈 FreeRTOS的核心是任务管理&#xff0c;以下介绍FreeRTOS任务的一些基础知识。 1. 什么是多任…...

前端面试笔试(二)

目录 一、数据结构算法等综合篇 1.HTTP/2、ETag有关 二、代码输出篇 1.new URL&#xff0c;url中的hostname&#xff0c;pathname&#xff0c;href 扩展说一下url的组成部分和属性 URL的组成部分 urlInfo 对象的属性 2.一个递归的输出例子 3.数组去重的不普通方法1 4.数…...

基于Python 和 pyecharts 制作招聘数据可视化分析大屏

在本教程中&#xff0c;我们将展示如何使用 Python 和 pyecharts 库&#xff0c;通过对招聘数据的分析&#xff0c;制作一个交互式的招聘数据分析大屏。此大屏将通过不同类型的图表&#xff08;如柱状图、饼图、词云图等&#xff09;展示招聘行业、职位要求、薪资分布等信息。 …...

探索光耦:晶体管光耦——智能家居的隐形桥梁,让未来生活更智能

在这个日新月异的科技时代&#xff0c;智能家居正以前所未有的速度融入我们的日常生活&#xff0c;从智能灯光到温控系统&#xff0c;从安防监控到语音助手&#xff0c;每一处细节都透露着科技的温度与智慧。而在这场智能化浪潮中&#xff0c;一个看似不起眼却至关重要的组件—…...

三、模板与配置(上)

三、模板与配置 1、WXML模板语法-数据、属性绑定 讲解&#xff1a; 1-1、数据绑定的基本原则 在data中定义数据 Page({data: {//这里是你需要定义的数据} })在WXML中使用数据 {{ 你定义的数据 }}1-2、在data中定义页面的数据 在页面对应的.js文件中&#xff0c;把数据定…...

基于SpringBoot和Vue的公司文档管理系统设计与开发(源码+定制+开发)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…...

Java21 Switch最全使用说明

Java21 Switch最全使用说明 Java 21 对 switch 语句进行了重大的改进和增强&#xff0c;使其变得更加灵活和强大。本文将详细介绍 Java 21 中 switch 语句的各种用法&#xff0c;包括基本语法、新特性、高级用法和最佳实践。 1. 基本语法 1.1 传统的 switch 语句 传统的 sw…...

普通电脑上安装属于自己的Llama 3 大模型和对话客户端

#大模型下载地址&#xff1a;# Llama3 因为Hugging Face官网正常无法访问&#xff0c;因此推荐国内镜像进行下载&#xff1a; 官网地址&#xff1a;https://huggingface.co 国内镜像&#xff1a;https://hf-mirror.com GGUF 模型文件名称接受&#xff0c;如上述列表中&…...

微信小程序原生 canvas画布截取视频帧保存为图片并进行裁剪

html页面&#xff1a; 视频尺寸过大会画布会撑开屏幕&#xff0c;要下滑 尺寸和视频链接是从上个页面点击传过来的&#xff0c;可自行定义 <canvas id"cvs1" type"2d" style"width: {{videoWidth}}px;height: {{videoHeight}}px;"><…...

社交网络图中结点的“重要性”计算

题目描述 输入 输出 输入样例1 9 14 1 2 1 3 1 4 2 3 3 4 4 5 4 6 5 6 5 7 5 8 6 7 6 8 7 8 7 9 3 3 4 9 输出样例1 Cc(3)0.47 Cc(4)0.62 Cc(9)0.35 AC代码 #include <iostream> #include <vector> #include <queue> #include <iomanip>using na…...

前端(1)——快速入门HTML

参考&#xff1a; W3school 1. HTML 我使用的是vs code&#xff0c;在使用之前&#xff0c;先安装以下几个插件&#xff1a; Auto Rename TageHTML CSS SupportLive Server 1.1 HTML标签 HTML全称是 Hypertext Markup Language(超文本标记语言) HTML通过一系列的标签(也称为…...

gitlab角色、权限

GitLab是一个基于Web的Git仓库管理工具&#xff0c;它提供了一套完整的角色和权限管理机制&#xff0c;以控制用户对项目和仓库的访问和操作权限。以下是GitLab中不同角色的基本权限概述&#xff1a; 访客&#xff08;Guest&#xff09;&#xff1a; 可以查看项目中的公开信息。…...

Python办公——批量eml文件提取附件

目录 专栏导读背景1、库的介绍2、库的安装3、核心代码4、完整代码总结专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️‍🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注 👍 该系列文章专栏:请点击——>Python办公自动…...

Spring Boot 中 Druid 连接池与多数据源切换的方法

Spring Boot 中 Druid 连接池与多数据源切换的方法 在Spring Boot项目中&#xff0c;使用Druid连接池和进行多数据源切换是常见的需求&#xff0c;尤其是在需要读写分离、数据库分片等复杂场景下。本文将详细介绍如何在Spring Boot中配置Druid连接池并实现多数据源切换。 一、…...

JavaScrip中私有方法的创建

在 JavaScript 中&#xff0c;私有方法是指只能在类的内部使用&#xff0c;外部无法访问的函数。为了实现这一点&#xff0c;JavaScript 提供了几种方法&#xff0c;主要通过以下几种方式来创建私有方法&#xff1a; 1. 使用 #&#xff08;私有字段和方法&#xff09; 从 ECM…...

.Net Core根据文件名称自动注入服务

.Net Core根据文件名称自动注入服务 说明分析逻辑所有代码一键注入 说明 这个适用于.Net Core 的Web项目,且需要在服务中注入接口的需求.因为之前些Java Web习惯了,所以会有Dao层,Serivce层和Controller层.但是如果一个项目里面对于不同的数据库会有多个Dao,如果一个一个引入会…...

APT 参与者将恶意软件嵌入 macOS Flutter 应用程序中

发现了一些恶意软件样本&#xff0c;这些样本据信与朝鲜民主主义人民共和国 (DPRK)&#xff08;又称北朝鲜&#xff09;有关&#xff0c;这些样本使用 Flutter 构建&#xff0c;Flutter 的设计可以对恶意代码进行混淆。JTL 深入研究了恶意代码的工作原理&#xff0c;以帮助保护…...

第 3 章 -GO语言 基本语法

1. 注释 在编程中&#xff0c;注释是帮助理解代码的重要工具。Go语言支持两种类型的注释&#xff1a; 单行注释&#xff1a;以 // 开头&#xff0c;直到行尾都是注释。多行注释&#xff1a;以 /* 开始&#xff0c;以 */ 结束&#xff0c;可以跨越多行。 示例 package maini…...

【qt】控件

1.frameGeometry和Geometry区别 frameGeometry是开始从红圈开始算&#xff0c;Geometry从黑圈算 程序证明&#xff1a;使用一个按键&#xff0c;当按键按下,qdebug打印各自左上角的坐标&#xff08;相当于屏幕左上角&#xff09;&#xff0c;以及窗口大小 Widget::Widget(QWid…...

入侵检测算法平台部署LiteAIServer视频智能分析平台行人入侵检测算法:科技守护安全的新篇章

在现代化城市快速发展的背景下&#xff0c;安全防范已成为城市管理与社会生活中不可或缺的一环。随着人工智能、大数据、物联网等技术的飞速发展&#xff0c;智能化安防系统正逐步改变着传统的安全防护模式&#xff0c;特别是在行人入侵检测领域&#xff0c;视频智能分析平台Li…...

# 让工具自己声明并发安全:我把调度逻辑砍到一行

让工具自己声明并发安全&#xff1a;我把调度逻辑砍到一行 这是 《写完一个 AI 编程助手之后&#xff0c;我才确定 prompt 工程不是重点》 的第四篇。前几篇讲了进程模型和权限系统&#xff0c;这一篇讲并发调度。 代码&#xff1a;[https://github.com/sishenaichipingguo/cod…...

学习刷题公众号管理系统

功能特点支持视频、音频、图文三种课程形式&#xff0c;按知识点分类管理&#xff0c;支持自由添加和编辑课程章节。课程可设置为免费或付费模式&#xff0c;支持VIP会员免费学习权限设置。提供智能组卷功能&#xff0c;学员可按知识点自主组卷&#xff0c;系统从题库中随机抽题…...

为什么你的无锁队列在压测中崩了——从 ABA 问题到 Hazard Pointer,追踪 lock-free 内存回收的生死时序

你的 lock-free queue 通过了所有单元测试,在 4 线程环境下稳定跑了整整一周,性能数据漂亮,直到你把压测线程数拉到 64,跑了 17 分钟后收到 SIGSEGV,打开 coredump 一看,崩溃地址指向的那块内存已经被 free 掉又被另一次 enqueue 重新 allocate 成了一个全新的节点,而 d…...

指纹采集器模块选型指南|如何选择合适的指纹采集模块

在做指纹门禁、指纹考勤、指纹保险箱或嵌入式终端时&#xff0c; 指纹采集器模块几乎是整个系统的核心。 模块选对了&#xff0c;项目推进顺畅&#xff1b;选错了&#xff0c;后期调试、售后问题不断。 本文不讲复杂参数&#xff0c;只从实际应用出发&#xff0c; 用最通俗的方…...

从VOC到YOLO:用Labelimg标注后,一键转换数据格式的完整避坑指南

从VOC到YOLO&#xff1a;数据格式转换的工程化实践与避坑指南 当你用Labelimg完成目标检测任务的标注工作&#xff0c;看着满屏的XML文件&#xff0c;是否觉得离模型训练还差"最后一公里"&#xff1f;这恰恰是许多初学者从标注到训练的关键断裂点。本文将带你深入VOC…...

书评质量断崖式提升的关键一步,Perplexity辅助写作的3层认知跃迁与2个致命误用陷阱

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;书评质量断崖式提升的关键一步&#xff0c;Perplexity辅助写作的3层认知跃迁与2个致命误用陷阱 Perplexity 不是搜索引擎的替代品&#xff0c;而是面向深度思考的“认知协作者”。当用于技术书评写作时&#x…...

YOLOv8模型家族全解析:P2、P6、标准版到底该选哪个?一张图帮你搞定选择困难症

YOLOv8模型家族全解析&#xff1a;P2、P6、标准版到底该选哪个&#xff1f; 在计算机视觉项目的初期&#xff0c;模型选型往往是最令人头疼的环节。面对GitHub仓库中琳琅满目的YAML配置文件&#xff0c;即便是经验丰富的工程师也难免陷入选择困难。YOLOv8作为当前最先进的目标检…...

《ROS 2机器人开发从入门到实践》 2.3 使用功能包组织C++节点

简介&#xff1a; 上一小节我们用功能包组织了python节点&#xff0c;这节我们把C节点也装进功能包。 参考资料&#xff1a; 参考资料均来自于鱼香ROS社区创始人小鱼&#xff0c;资源如下&#xff1a; ①&#xff1a;【《ROS 2机器人开发从入门到实践》 2.3 使用功能包组织…...

Source Han Serif CN:开源中文字体跨平台部署完全指南

Source Han Serif CN&#xff1a;开源中文字体跨平台部署完全指南 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 还在为项目中的中文字体选择而纠结吗&#xff1f;既要考虑版权合规&a…...

Scarab空洞骑士模组管理器:5个步骤掌握现代模组管理艺术

Scarab空洞骑士模组管理器&#xff1a;5个步骤掌握现代模组管理艺术 【免费下载链接】Scarab An installer for Hollow Knight mods written with Avalonia. 项目地址: https://gitcode.com/gh_mirrors/sc/Scarab 还在手动解压、复制、配置空洞骑士模组吗&#xff1f;Sc…...