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

笔记2 FreeRTOS任务

笔记2 FreeRTOS任务


FreeRTOS配置

1、FreeRTOSConfig.h配置文件作用

对FreeRTOS进行功能配置和裁剪,以及API函数的使能。

2、学习途径

  1. 官方的在线文档中有详细说的说明:https://www.freertos.org/a00110.html 。
  2. 正点原子《FreeRTOS开发指南》第三章的内容 — FreeRTOS系统配置。

3、配置文件中相关宏的分类

相关宏大致可以分为三类。

  • ‘INCLUDE’开头 — 配置FreeRTOS中可选的API函数。
  • ’config‘开头 — 完成FreeRTOS的功能配置和裁剪(如调度方式、使能信号量功能等)。
  • 其他配置 — PendSV宏定义、SVC宏定义。

FreeRTOS任务创建和删除


一、任务创建和删除API函数

1、任务创建和删除的本质

任务创建和删除的本质就是调用FreeRTOS的API函数。
在这里插入图片描述

2、任务动态创建和静态创建的区别

  • 动态创建任务 :任务的任务控制块以及任务的栈空间所需的内存,均由FreeRTOS从FreeRTOS管理的堆中分配。
  • 静态创建任务 :任务的任务控制块以及任务的栈空间所需的内存,需要用户分配提供。

3、任务控制块结构体成员介绍

在这里插入图片描述

  1. 任务栈栈顶,在任务切换时的任务上下文保存、任务恢复息息相关。
  2. 每个任务都有属于自己的任务控制块,类似身份证。

4、什么是临界区保护

临界区保护,保护那些不想被打断的程序段,关闭freertos所管理的中断,中断无法打断,滴答中断和PendSV中断无法进行不能实现任务调度 。

5、动态创建优点

动态创建使用起来相对简单。在实际的应用中,动态方式创建任务是比较常用的,除非有特殊的需求,一般都会使用动态方式创建任务 。

6、静态创建优点

静态创建可将任务堆栈放置在特定的内存位置,并且无需关心对内存分配失败的处理 。

7、创建任务时任务堆栈所存内容

在这里插入图片描述

  1. 寄存器下PSR被初始为0x01000000,其中bit24被置1,表示使用Thumb指令。
  2. 寄存器PC被初始化为任务函数指针(任务A,即我们写的任务函数的地址),这样当某次任务切换后,任务A获得CPU控制权,任务函数(任务A)被出栈到PC寄存器,之后会执行任务A的代码。
  3. LR寄存器初始化为函数指针prvTaskExitError,这个函数是FreeRTOS提供的,是一个出错处理函数。
  4. 子函数的调用通过寄存器R0~R3传递参数,创建任务时,我们传入的参数被保存到R0中,用来向任务传递参数。

二、任务创建—动态方法

1、动态任务创建函数

函数参数:在这里插入图片描述

函数返回值:

在这里插入图片描述

2、实现动态创建任务流程

  1. 将FreeRTOSConfig.h文件中宏configSUPPORT_DYNAMIC_ALLOCATION配置为1。
  2. 定义函数入口参数。
  3. 编写任务函数。

动态任务创建函数创建的任务会立刻进入就绪态,由任务调度器调度运行。

3、动态任务创建函数内部实现简述

  1. 申请堆栈内存&任务控制块内存。
  2. TCB结构体(任务控制块)成员赋值。
  3. 添加新任务到就绪列表中。

三、任务创建—静态方法(掌握)

1、静态任务创建函数

函数参数:在这里插入图片描述

函数返回值:

在这里插入图片描述

2、实现静态创建任务流程

  1. 将FreeRTOSConfig.h文件中宏configSUPPORT_STATIC_ALLOCATION配置为1。
  2. 定义空闲任务&定时器任务的任务堆栈以及TCB。
  3. 实现两个接口函数(vAppLicationGetldleTaskMemory() 空闲任务接口函数和vApplicationGetTimerTaskMemory()定时器任务接口函数)。
  4. 定义函数入口参数。
  5. 编写任务函数。

静态任务创建函数创建的任务会立刻进入就绪态,由任务调度器调度运行。

3、静态任务创建函数内部实现简述

  1. TCB结构体成员赋值。
  2. 添加新任务到就绪列表中。

四、任务删除

1、任务删除函数

在这里插入图片描述

任务删除函数用于删除已经被创建的任务,被删除的任务将从就绪任务列表、阻塞任务列表、挂起任务列表和事件列表中移除。

注意:

  1. 当传入的参数为NULL,则代表删除任务自身(当前正在运行的任务)。
  2. 空闲任务会负责释放被删除任务中由系统分配的内存,但是由用户在任务删除前申请的内存空间,必须用户在任务被删除前提前释放,否则将会导致内存泄漏。

2、删除任务流程

  1. 使用删除任务函数,将FreeRTOSConfig.h文件中宏INCLUDE_vTaskDelete配置为1。
  2. 入口参数输入需要删除的任务句柄(NULL代表删除本身)。

3、删除任务函数内部实现简述

  1. 获取所要删除的任务控制块 — 通过传入的任务句柄,判断所需要删除哪个任务,NULL代表删除自身。

  2. 将被删除任务移除所在列表 — 将该任务所在列表中移除,包括:就绪、阻塞、挂起、事件等列表。

  3. 判断所需要删除的任务

    –> 删除任务自身,需要先添加到等待删除列表,内存释放将在空闲任务执行。

    –> 删除其他任务,释放内存,任务数量。

  4. 更新下个任务的阻塞时间 — 更新下一个任务的阻塞超时时间,以防止被删除的任务就是下一个阻塞超时的任务。


http://www.xdnf.cn/news/1456669.html

相关文章:

  • 如何在Spring Boot项目中使用MapStruct?
  • 旅游安全急救实训室助力应急处置技能实战化
  • Websocket的Key多少个字节
  • 【Big Data】云原生与AI时代的存储基石 Apache Ozone 的技术演进路径
  • 深度学习篇---SENet网络结构
  • 【C语言】第二课 基础语法
  • 【开题答辩全过程】以 基于微信小程序的宠物领养系统为例,包含答辩的问题和答案
  • 理解 C# `async` 的本质:从同步包装到状态机
  • 云手机与网络游戏相结合的优势?
  • AI大模型企业落地指南-笔记05
  • 【75】OpenCV C++实战篇——OpenCV 图像拼接、全景拼接(教程合集)
  • 【华为培训笔记】ASON原理
  • 关于嵌入式学习——嵌入式硬件3
  • 如何在MacOS上卸载并且重新安装Homebrew
  • 企业微信SCRM工具推荐:微盛AI·企微管家为什么是首选?
  • c#泛型公共类示例
  • Next.js App Router 中文件系统路由与页面跳转实践(以用户详情页面为例)
  • 1688拍立淘接口对接实战案例
  • Playwright-ui自动化工具
  • 如何设置PPTX的默认打开应用为PowerPoint
  • ​​AI生成PPT工具推荐,从此以后再也不用担心不会做PPT了​​
  • Effective Python 第10条 - 用赋值表达式减少重复代码
  • 股价暴跌后扔出 “王炸”,美团 LongCat 大模型到底是续命还是真有料?
  • Linux网络服务——基础设置
  • 【Kubernetes】知识点4
  • 吐槽一下福昕pdf阅读器高级专业版
  • git命令常用指南
  • openEuler2403安装部署Kafbat
  • 用遗传算法破解一元函数最大值问题:从原理到 MATLAB 实现
  • 关于多Agent协作框架的讨论:以产品经理工作流为例对比Sub Agent与AutoGen