FreeRTOS任务的定义和任务切换的实现

2023-05-16

创建任务

定义任务栈

  • 在多任务系统中需要为每个任务分配单独的栈空间(数组实现或者动态分配), 存在RAM中

定义任务函数

  • 任务函数在main.c中定义, 每个任务函数都是一个独立, 无限循环且不能返回的函数

定义任务控制块

  • 多任务系统为了顺利调度任务, 为每个任务定义了一个任务控制块, 其中包含了该任务的所有信息, 如:任务的栈指针, 任务名称, 任务形参等
  • 定义任务控制块的数据类型在task.h中声明

实现任务创建函数

  • xTaskCreateStatic()函数

    • 联系任务的栈, 任务的函数实体, 任务的控制块; 该函数在task.c中定义, 在task.h中声明
  • prvInitialiseNewTask()函数

    • 创建新任务, 该函数在task.c中实现, 在task.h中声明
  • pxPortInitialiseStack()函数

    • 初始化任务栈, 并更新栈顶指针, 任务第一次运行的环境参数就存在任务栈中; 该函数在port.c(freeRTOS\portable\RVDS\ARM_CM3)中定义

实现就绪列表

定义就绪列表

  • 任务创建好后, 需要将任务添加到就绪列表中, 表示任务已经就绪, 系统可以随时调度; 就绪列表在task.c中定义, 在task.h中声明(就绪列表的实质就是List_t类型的数组, 数组大小由在FreeRTOSConfig.h中定义的宏决定; 数组的下标就是任务的优先级, 同一优先级的任务统一插入到就绪列表的同一条链表中)

就绪列表初始化

  • 就绪列表的初始化在函数prvInitialiseTaskLists()实现

将任务插入到就绪列表

  • 任务控制块中有一个xStateListItem成员, 数据类型是ListItem_t, 在prvinitialiseTaskLists()函数中调用这个成员, 实现将任务挂载到就绪列表中的某一级优先级上

实现调度器

  • 调度器是操作系统的核心, 主要功能是实现任务的切换, 即从就绪列表中找到优先级最高的任务并执行; 调度器有几个全局变量和实现任务切换的函数组成, 在task.c中实现

启动调度器

  • vTaskStartScheduler()函数

    • 调度器的启动(调用xPortStartScheduler()函数)
  • xPortStartScheduler()函数

    • 启动调度器, 调度器启动成功该函数不会返回; 函数在port.c中实现
  • prvStartFirstTask()函数

    • 在xPortStartScheduler()函数中调用, 以启动第一个任务, 启动成功后不返回, 函数由汇编编写, 在port.c中实现
  • vPortSVCHandler()函数

    • 汇编编写的函数, 真正实现启动第一个任务, 在port.c中实现

任务切换(寻找优先级最高的任务并执行)

  • taskYIELD()

  • xPortPendSVHander函数

  • vTaskSwitchContext()函数

    • 选择优先级最高的任务, 然后更新pxCurrentTCB; 在task.c中定义

main函数

[涉及的ARM汇编指令]

ARM常用汇编指令https://blog.csdn.net/m0_51593568/article/details/120937181

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FreeRTOS任务的定义和任务切换的实现 的相关文章

  • FreeRTOS系列

    1 多任务系统 1 1 前后台系统 单片机裸机开发时 一般都是在main函数里面用while 1 做一个大循环来完成所有的处理 循环中调用相应的函数完成所需的处理 有时也需要在中断中完成一些处理 相对于多任务系统而言 这就是单人单任务系统也
  • 基于HAL库的FREERTOS----------二.任务API函数

    任务API函数览概 CUBEMX对 做了API的封装 很多 的函数没有封装到位 可以用原函数调用 任务API函数分别介绍 1 uxTaskPriorityGet 此函数用来获取指定任务的优先级 要使用此函数的话宏 INCLUDE uxTas
  • FreeRTOS 软件定时器的使用

    FreeRTOS中加入了软件定时器这个功能组件 是一个可选的 不属于freeRTOS内核的功能 由定时器服务任务 其实就是一个定时器任务 来提供 软件定时器是当设定一个定时时间 当达到设定的时间之后就会执行指定的功能函数 而这个功能函数就叫
  • FreeRTOS简述和移植文档

    FreeRTOS简述和移植文档 文章目录 FreeRTOS简述和移植文档 1 前言 2 FreeRTOS简述 1 概述 2 实现 3 主要特色 4 支持平台 3 移植FreeRTOS 4 最后 1 前言 目前由于IOT的飞速发展 针对单片机
  • 一文教你学会keil软件仿真

    仿真在我们调试代码中是非常重要的 通过仿真 我们可以快速定位到错误代码 或者错误逻辑的地方 这里我就以上一篇博客为例 教大家如何软件仿真 软件仿真不需要单片机 直接通过keil软件进行代码调试 一 打开工具 二 选择软件仿真 三 开始仿真
  • Freertos中vTaskDelay()是怎么用的

    1 常见的使用场景 void vLED Task void pvParameters while 1 Heartbeat LED vTaskDelay 1000 portTICK RATE MS 说明 上面这段代码的意思是 led翻转后经过
  • 【FreeRTOS开发问题】FreeRTOS内存溢出

    FreeRTOS内存溢出 如下图所示 FreeRTOS编译完成后可以看到 系统提示无法分配内存到堆 Objects Template axf Error L6406E No space in execution regions with A
  • 【FreeRTOS(三)】任务状态

    文章目录 任务状态 任务挂起 vTaskSuspend 取消任务挂起 vTaskResume 挂起任务调度器 vTaskSuspendAll 取消挂起任务调度器 xTaskResumeAll 代码示例 任务挂起 取消任务挂起 代码示例 挂起
  • freeRTOS使用uxTaskGetStackHighWaterMark函数查看任务堆栈空间的使用情况

    摘要 每个任务都有自己的堆栈 堆栈的总大小在创建任务的时候就确定了 此函数用于检查任务从创建好到现在的历史剩余最小值 这个值越小说明任务堆栈溢出的可能性就越大 FreeRTOS 把这个历史剩余最小值叫做 高水位线 此函数相对来说会多耗费一点
  • stm32f103zet6移植标准库的sdio驱动

    sdio移植 st官网给的标准库有给一个用于st出的评估板的sdio外设实现 但一是文件结构有点复杂 二是相比于国内正点原子和野火的板子也有点不同 因此还是需要移植下才能使用 当然也可以直接使用正点原子或野火提供的实例 但为了熟悉下sdio
  • 基于STM32的FreeRTOS学习之中断测试实验(五)

    记录一下 方便以后翻阅 本章内容是接着上一章节进行的实际演练 1 实验目的 FreeRTOS可以屏蔽优先级低于configMAX SYSCALL INTERRUPT PRIORITY的中断 不会屏蔽高于其的中断 本次实验就是验证这个说法 本
  • Arduino IDE将FreeRTOS用于STM32

    介绍 适用于STM32F103C8的FreeRTOS STM32F103C是一种能够使用FreeRTOS的ARM Cortex M3处理器 我们直接在Arduino IDE中开始使用STM32F103C8的FreeRTOS 我们也可以使用K
  • RT-Thread记录(五、RT-Thread 临界区保护与FreeRTOS的比较)

    本文聊聊临界区 以及RT Thread对临界区的处理 通过源码分析一下 RT Thread 对临界区保护的实现以及与 FreeRTOS 处理的不同 目录 前言 一 临界区 1 1 什么是临界区 1 2 RTOS中的临界区 二 RT Thre
  • FreeRTOS多任务调度器基础

    Cortex M4中SysTick调度器核心 Cortex M4中的中断管理 Cortex M4中影子栈指针 Cortex M4中SVC和PendSV异常 1 Cortex M4中SysTick调度器核心 systick每一次中断都会触发内
  • 使用 GCC 编译器的 ARM 内核的堆栈回溯(当存在 MSP 到 PSP 切换时)

    核心 ARM Cortex M4 编译器 GCC 5 3 0 ARM EABI 操作系统 免费 RTOS 我正在使用 gcc 库函数 Unwind Reason Code Unwind Backtrace Unwind Trace Fn v
  • 如何将 void* 转换为函数指针?

    我在 FreeRTOS 中使用 xTaskCreate 其第四个参数 void const 是传递给新线程调用的函数的参数 void connect to foo void const task params void on connect
  • 有可用的 FreeRTOS 解释语言库吗?

    我在一家公司工作 该公司使用 FreeRTOS 为多个设备创建固件 最近 我们对新功能的要求已经超出了我们固件工程师的工作能力 但我们现在也无力雇用任何新人 即使进行微小的更改 也需要固件人员在非常低的级别上进行修改 我一直在为 FreeR
  • GNU Arm Cortex m4 上的 C++ 异常处理程序与 freertos

    2016 年 12 月更新现在还有一个关于此行为的最小示例 https community nxp com message 862676 https community nxp com message 862676 我正在使用带有 free
  • 哪些变量类型/大小在 STM32 微控制器上是原子的?

    以下是 STM32 微控制器上的数据类型 http www keil com support man docs armcc armcc chr1359125009502 htm http www keil com support man d
  • 有关 CMake 错误的问题:没有为目标提供源

    我正在尝试使用 cmake 和 eclipse 将 FreeRtos 添加到我的项目中 但出现错误 我运行的是 debian 10 我的 cmake 版本是 3 13 4 cmake 的文件可以在以下位置找到这个 git 仓库 https

随机推荐

  • 编码电机PID调试(速度环|位置环|跟随)

    文章目录 1 编码电机认识2 上位机波形显示1 功能介绍2 协议说明 3 速度环调试验证4 位置环调试验证5 实现跟随效果 前面的文章中有讲过编码电机串级PID相关的知识 xff0c 以及一些PID的调试经验 xff0c 这里我最近正好又把
  • 树莓派安装ubuntu mate记录

    文章目录 1 系统下载1 ubuntu下载2 ubuntu mate下载 2 系统安装3 系统使用1 ubuntu系统2 ubuntu mate系统 这个算个失败的记录贴吧 xff0c 这个系统安装过程不太流畅 xff0c 使用起来也有很多
  • 平衡小车的一些常见问题总结

    文章目录 1 基本理论2 直立环速度环串级pid3 代码差异的解释4 转向环 1 基本理论 PID控制 pid控制值对偏差进行比例 xff0c 积分和微分的控制 xff0c 分别是三个部分 xff0c 对应为比例单元 xff0c 积分单元和
  • Ubuntu下tar命令使用详解 .tar解压、.tar压缩

    1 tar参数选项2 tar压缩命令3 tar解压缩命令4 解压安装5 tar bz2解压缩命令6 Linux压缩和解压 bz2文件 bzip2 Linux tar 命令 在Linux平台 xff0c tar是主要的打包工具 tar命令通常
  • 裸机开发之驱动开发

    一 驱动开发的基础理解 在计算中 xff0c 设备驱动程序是一种计算机程序 xff0c 用于操作或控制连接到计算机的特定类型的设备 驱动程序提供了与硬件设备的软件接口 xff0c 使操作系统和其他计算机程序可以访问硬件功能 xff0c 而无
  • STM32HAL库使用ESP8266模块

    ESP8266模块是一个可是实现蓝牙和WiFi一体的模块 xff0c ESP8266 是一个完整且自成体系的 WiFi 网络解决方案 xff0c 能够独立运行 xff0c 也可以作为 slave 搭载于其他 Host 运行 ESP8266模
  • 几种数字传感器介绍(一)————温湿度传感器(HDC1080)

    一 温湿度采集传感器 xff08 HDC1080 xff09 1 简要概述 HDC1080是一种集成温度传感器的数字湿度传感器 xff0c 具有出色的测量精度和超低的功耗 其具有14位测量分辨率 xff0c 相对湿度精度为 2 温度精度为
  • STM32F103xx / STM32F429VET6最小系统原理图

    STM32F429VET6核心板原理图 一 前言 先前使用过的是STM32F1系列 xff0c 只使用和绘制过STM32F103C8T6和STM32F103ZET6的板子 心血来潮想试一下STM32F4系列和F1系列在编程上有什么差别 xf
  • FreeRTOS - 多任务使用要点

    一 临界段应用 1 临界段作用 在程序访问资源时 xff0c 不希望被其他任务或者中断打断 xff0c 这段要执行的代码 xff0c 称为临界代码段 1 1不想被打断访问的资源 xff08 临界段保护 xff09 读取或者修改变量 xff0
  • 项目准备及自我介绍

    项目准备及自我介绍 1 自我介绍 面试官你好 xff0c 我叫XXX xff0c 就读于重庆邮电大学 xff1b 实验室是国家信息无障碍研发中心 xff1b 研究生期间 xff0c 参与两起机器人项目 xff0c 一是基于SLAM的清洁机器
  • 卸载重装Android Studio导入先前的版本,或者是误判SDK installed解决方法。(包含window,mac,Linux)

    我安装了几次Android Studio 之前一直不太稳定 xff0c 特别是想要导入别人的项目时 xff0c 版本不兼容真的会导致很多问题 尤其是他会下载gradle版本 xff0c 花费很长时间占用内存也就罢了 xff0c 更过分的是如
  • gcc编译过程

    gcc编译过程 文章目录 gcc编译过程1 预处理 Preproceessing 2 编译 Compilation 3 汇编 Assembly 4 链接 Linking 一般在windows下编译代码的时候是直接生成了可执行文件 xff0c
  • STM32串口printf调试输出(SSCOM V5.13.1)

    文章目录 1 原理图分析2 配置使能串口USART13 添加代码4 烧录连接显示5 浮点数输出 1 原理图分析 PC与CPU相互通信就是通过USB Type C接口和USB电平转换实现的 我们可以看到 xff0c CPU通过管脚USART1
  • CMakeLists文件的编译

    文章目录 CMakeLists的编译CMakeLists编译原理 文件路径 xff1a 编写CMakeLists txt CMakeLists常用命令 CmkeLists的基本步骤1 1 CMake版本1 2 软件包名称1 3 查找相关的C
  • 决策树--CART算法

    文章目录 1 Crat算法 分类树 1 1基尼系数1 2连续型特征处理1 3CART算法1 5 举例说明1 5 代码 2 回归树 1 Crat算法 分类树 1 1基尼系数 CART是基于基尼 Gini 系数最小化准则来进行特征选择 xff0
  • 深度学习——几种学习类型

    迁移学习 深度学习中 xff0c 最强大的理念之一就是 xff0c 有的时候神经网络可以从一个任务中习得知识 xff0c 并将这些知识应用到另一个独立的任务中 所以例如 xff0c 也许你已经训练好一个神经网络 xff0c 能够识别像猫这样
  • Ubuntu16.04无法更新apt,一直报错

    我是在VirtualBox里用的Ubuntu xff0c 安装好后一直无法更新apt Ubuntu版本是16 04 试过换各种源都失败了 xff0c 已经折磨我三天了 求求各位大佬帮我解答一下什么原因 图一是从系统设置里换源的问题 xff1
  • 用JS实现猜数字游戏

    实现目标 随机生成一个1到10的整数 xff0c 由你来猜 xff0c 直到猜对为止 实现效果图 实现方法 1 随机生成一个1到10的整数 使用Math random 方法 2 需要一直猜到正确为止 所以使用while循环更简单 3 核心算
  • 低版本Matlab(2020b)与高版本Visual Studio(VS2022)实现M、C/C++混合编程(调试)

    目录 前言一 构造编译器的配置文件到Matlab安装目录二 在Matlab中配置为使用 39 Microsoft Visual C 43 43 2022 C 39 以进行 C 语言编译三 验证M文件与C文件混合编译四 配置Cuda加速Mat
  • FreeRTOS任务的定义和任务切换的实现

    创建任务 定义任务栈 在多任务系统中需要为每个任务分配单独的栈空间 数组实现或者动态分配 存在RAM中 定义任务函数 任务函数在main c中定义 每个任务函数都是一个独立 无限循环且不能返回的函数 定义任务控制块 多任务系统为了顺利调度任