FreeRTOS任务调度启动流程

2023-05-16

FreeRTOS任务调度启动流程

  • Preface
  • Preview
  • Attention
  • FreeRTos目录结构
    • 解释
  • FreeRTos任务调度
    • 一、vTaskStartScheduler函数中需要注意的细节
    • 二、xPortStartScheduler函数中需要注意的细节
    • 三、prvStartFirstTask函数中需要注意的细节
    • 四、vPortSVCHandler函数中需要注意的细节
  • 总结

Preface

上一篇博客写了关于FreeRTos背景知识,有了基础的认识。

本篇博文正式开始讲诉FreeRTos源码

Preview

Attention

FreeRTos源码版本是V9.0.0

源码阅读工具:VS code

PS:在阅读源码的过程中需要注意以下三点

  • 遇到没见过的函数,只需先知道该函数的函数名称,知道函数的功能,至于函数的具体实现我们可以先不了解
  • 阅读源码的过程中会出现大量的条件编译,如果对某个宏定义的意思不了解那就不必要了解
  • FreeRTos源码中有大量回调函数。这些回调函数一般需要用户编写并且需要在头文件中配置,阅读源码时不需要关注

Attention:

在阅读源码的过程中涉及到大量关于Cortex-M4架构相关的基础知识,但是我在该系列博客中是不会去讲解的,我会在ARM内核系列博客中会讲。之所以这么做就是因为按照这种方式才不会混乱。

FreeRTos目录结构

解释

如上图所示

  • include文件夹中包含了FreeRTos使用到的头文件
  • portable文件夹中包含了移值需要的内容,且内容的实现根据需要移值的芯片不同会有比较大的差异(本系列博文是基于Cortex-M4F
  • 剩下的源文件就是与硬件平台无关的FreeRTos的源代码

FreeRTos任务调度

一、vTaskStartScheduler函数中需要注意的细节

  • Idle任务一定会被创建,只不过创建的方式会有所不同罢了

Idle任务到底是以静态的形式还是动态的形式取决于你自己

  • 失能中断

可能很多人会有疑问,为什么这里需要失能中断。

因为在xPortStartScheduler()中使能了Systick,而它会以一定的时间(操作系统的心脏)周期性的触发中断,为了避免在FreeRTos任务调度的启动过程中出现流程分叉,因此预先失能中断

  • 初始化全局变量

    我觉得在任务调度的启动流程中唯一有用的就是标记任务调度器处于运行状态!

二、xPortStartScheduler函数中需要注意的细节

  • 启动系统滴答定时器

这个其实我觉得不用说,因为操作系统的运行肯定是要遵循一定的节拍,而这个节拍就是由系统滴答定时器来提供。

  • 临界区变量初始化为0

这个我觉得它初始化为0的含义已经显而易见了

  • 使能惰性压栈

使能惰性压栈的目的在于能够快速的响应中断。

三、prvStartFirstTask函数中需要注意的细节

  • 恢复栈顶指针

在启动过程中调用到了若干个函数,调用函数就使用到了栈,因此在启动第一个任务之前,恢复默认的栈顶指针。

这里需要说明一下:

栈顶指针的值是在编译的时候就已经确定的,至于它存放在什么地方你可以去看下权威指南

  • 使能中断

使能中断的目的是为了后面的触发 SVC中断做准备

四、vPortSVCHandler函数中需要注意的细节

该函数执行完之后就会开始处理第一个待执行的任务了。

这个函数就是ARM体系结构中的异常返回机制,ARM体系结构我打算在其它连载博客中讲诉。

总结

以上就是FreeRTos任务调度的启动流程,在该系列博客中但凡是和ARM内核相关的知识都不会讲太多,这个大家可以自己去看权威指南。

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

FreeRTOS任务调度启动流程 的相关文章

  • 详解FreeRTOS中的软件定时器

    软件定时器用于让某个任务定时执行 或者周期性执行 比如设定某个时间后执行某个函数 或者每隔一段时间执行某个函数 由软件定时器执行的函数称为软件定时器的回调函数 参考资料 Mastering the FreeRTOS Real Time Ke
  • 【FreeRtos学习笔记】STM32 CubeMx——Timers(定时器)

    目录 1 软件定时器 2 示例程序 2 1 例程功能 2 2 步骤 2 3 实验结果 2 4 函数讲解 1 软件定时器 定时器是MCU常用的外设 我们在学习各种单片机时必然会学习它的硬件定时器 但是 MCU自带的硬件定时器资源是有限的 而且
  • 【FreeRTOS 信号量】互斥信号量

    互斥信号量与二值信号量类似 但是互斥信号量可以解决二值信号量出现的优先级翻转问题 解决办法就是优先级继承 普通互斥信号量创建及运行 参阅安富莱电子demo 互斥信号量句柄 static SemaphoreHandle t xMutex NU
  • 解决错误“ #error “include FreeRTOS.h“ must appear in source files before “include event_groups.““例子分享

    今天来给大家分享一下 关于之前自己在学习FreeRTOS过程中遇到的一个错误提示 话不多说 我们直接来看 错误分析 首先 我们看一下错误的提示 error 35 error directive include FreeRTOS h must
  • FreeRTOS系列

    本文主要介绍如何在任务或中断中向队列发送消息或者从队列中接收消息 使用STM32CubeMX将FreeRTOS移植到工程中 创建两个任务以及两个消息队列 并开启两个中断 两个任务 Keyscan Task 读取按键的键值 并将键值发送到队列
  • STM32移植FreeRTOS的Tips

    转自 http bbs armfly com read php tid 7140 1 在FreeRTOS的demo文件夹中拷贝对应的FreeRTOSConfig h文件后 需要加入一行 define configUSE MUTEXES 1
  • 【FreeRTOS】队列的使用

    作者主页 凉开水白菜 作者简介 共同学习 互相监督 热于分享 多加讨论 一起进步 专栏资料 https pan baidu com s 1nc1rfyLiMyw6ZhxiZ1Cumg pwd free 点赞 收藏 再看 养成习惯 订阅的粉丝
  • FreeRTOS临界区

    FreeRTOS临界区是指那些必须完整运行 不能被打断的代码段 比如有的外设的初始化需要严格的时序 初始化过程中不能被打断 FreeRTOS 在进入临界区代码的时候需要关闭中断 当处理完临界区代码以后再打开中断 FreeRTOS 系统本身就
  • Error: L6218E: Undefined symbol vApplicationGetIdleTaskMemory (referred from tasks.o).

    我用的是F103ZET6的板子 移植成功后 编译出现两个错误是关于stm32f10x it c 里 void SVC Handler void void PendSV Handler void 两个函数的占用问题 随后编译出现以下两个问题
  • STM32F103移植FreeRTOS必须搞明白的系列知识---2(FreeRTOS任务优先级)

    STM32F103移植FreeRTOS必须搞明白的系列知识 1 Cortex CM3中断优先级 STM32F103移植FreeRTOS必须搞明白的系列知识 2 FreeRTOS任务优先级 STM32F103移植FreeRTOS必须搞明白的系
  • FreeRTOS学习(三)开关中断

    声明及感谢 跟随正点原子资料学习 在此作为学习的记录和总结 环境 keil stm32f103 背景知识 Cotex M3的NVIC最多支持240个IRQ 中断请求 1个不可屏蔽 NMI 1个Systick 滴答定时器 Cortex M处理
  • FreeRTOS之事件

    FreeRTOS之事件 声明 本人按照正点原子的FreeRTOS例程进行学习的 欢迎各位大佬指责和批评 谢谢 一 事件定义 事件 事件集 与高数上的集合意义差不多 事件啊 其实是实现任务间通信的机制 主要用于实现多任务间的同步 但是事件类型
  • FreeRTOS笔记(一)简介

    这个笔记主要依据韦东山freertos快速入门系列记录 感谢韦东山老师的总结 什么是实时操作系统 操作系统是一个控制程序 负责协调分配计算资源和内存资源给不同的应用程序使用 并防止系统出现故障 操作系统通过一个调度算法和内存管理算法尽可能把
  • FreeRTOS笔记(二)

    FreeRTOS笔记 二 静态任务 文章目录 FreeRTOS笔记 二 静态任务 一 任务定义 二 任务创建 2 1 定义任务栈 2 2 定义任务函数 2 3 定义任务控制块 2 4 实现任务创建函数 三 实现就绪列表 3 1 定义就绪列表
  • FreeRTOS临界段

    1 临界段 在访问共享资源时不希望被其他任务或者中断打断的代码 这段要执行的代码称为临界段代码 2 设置临界段的目的 保护共享资源 例如 全局变量 公共函数 不可重入函数 函数里面使用 了一些静态全局变量 malloc 等 保护外设的实时性
  • STM32 Freertos 添加 外部sram heap_5.c

    1 添加外部SRAM 初始化 2 添加heap 5 c 3 初始化heap 5 c 外部堆栈 Define the start address and size of the two RAM regions not used by the
  • 13-FreeRTOS任务创建与删除

    任务创建和删除API函数位于文件task c中 需要包含task h头文件 task h里面包函数任务的类型函数 例如 对xTaskCreate的调用 通过指针方式 返回一个TaskHandle t 变量 然后可将该变量用vTaskDele
  • 小型 ARM 微控制器的 RTOS 内核之间的可量化差异 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 有许多不同的 RTOS 可用于微控制器 我专门寻找支持 ARM Cortex M 处理器的 RTOS 另外 我对闭源解决方案不感兴趣 试图从网站
  • 哪些变量类型/大小在 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

随机推荐

  • PX4最新版固件

    最近研究PX4在Ubuntu20上的仿真 xff0c 然后下载PX4并且更新了子模块 xff0c 特地备份一下 xff0c 也分享出来 可以看到是所有子模块都更新完成的 xff0c 我是在make px4 gazebo之前备份的 xff0c
  • 第一章 无人机入门(二)软件架构

    前言 之前我写了一篇关于无人机硬件架构的博客 xff0c 接下来我继续写关于软件架构的 什么是软件 xff1f 百度百科里面软件的定义是 按照特定顺序组织的计算机数据和指令的集合 xff0c 在这里我们只需要理解为程序即可 xff0c 也就
  • CV学术笔记(一)从小白开始入门科研:学习基础理论

    前言 这两个月开始学习深度学习与计算机视觉 xff0c 从懵懵懂懂到初入门槛 xff0c 从完全不懂科研的小白到复现第一篇论文 xff08 2023 4 1日完成MobileNet复现与Resnet复现 xff09 虽然磕磕绊绊 xff0c
  • C++面试常见题目问与答(汇总一)

    此次整理来自QQ群186588041 xff0c 所有资料来自谭校长 张教主 H神 Robort fight for dream 刀刀 二货 主要是总结了一些经常被问道的面试题 欢迎加入群182374342 xff08 原来那个群已经解散了
  • 13.注意力机制

    从RNN中得到启发 我们使用递归神经网络进行序列到序列的预测 xff0c 接受一些输入序列然后输出一些序列 xff08 比如说翻译 xff0c 或者视频字幕 xff09 xff0c 其中的工作方式如下 xff1a 一个称为编码器的循环神经网
  • 12.循环神经网络

    前文总结 之前已经讲了包括CNN结构 训练方法等 xff0c 但是这些实际上只是一种前馈结构 xff0c 所有的信息都是前向传播 xff08 有分支 xff09 xff0c 每一层都接受单一输入 xff08 如图像等 xff09 xff0c
  • 14.卷积神经网络的可视化与理解

    CNN的可视化与理解 在之前我们讨论了一系列内容 注意力机制 xff1a 注意力如何成为我们可以添加到当前的神经网络中的机制 xff0c 让模型在不同的时间步长上专注于输入的不同部分 xff0c 然后构建通用自注意力层 xff0c 用来构建
  • docker常用镜像命令总结,包含将docker镜像推送到dockerhub,全程无废话

    01 查看镜像 docker images span class token punctuation span root 64 i rbj0ryi8 span class token punctuation span span class
  • 无人机-2多翼无人机的结构与硬件

    一 多旋翼无人机的机体布局 1 多旋翼无人机的结构布局 动力输出轴上判断几轴飞行器 动力轴越多 xff0c 飞行稳定性相对越好 xff0c 可靠性相对降低 xff08 模块多 xff0c 隐患多 xff09 常规固定式 xff1a 分为带边
  • 无人机-4无人机结构设计

    一 需求分析 概述 xff1a 设计上的纸面参数做到一个切实用到飞机上的一个设计参数的一个过程 1 飞机的任务是什么 针对设计目的有不同结构需求的 物流无人机 xff1a 仓储位置 摄影无人机 xff1a 拍照 xff0c 搭载稳定的三轴云
  • ubuntu20.04安装ros noetic以及创建ros工作空间catkin_ws

    章节目录 一 安装ROS1 设置下载源2 安装依赖项3 安装ros4 配置环境变量5 运行ROS6 rosdep初始化7 安装rosinstall8 启动例子 xff08 小海龟 xff09 二 创建ROS工作空间 catkin ws1 创
  • MATLAB学习笔记(注释超详细)

    1 matlab数据类型转换 xff0c 例 xff1a uint8函数将数值数据转换成无符号8位整数 xff0c int8将数值数据转换为带符号8位整数 x 61 int8 129 因为带符号8位整型数的最大值为127 xff0c 129
  • 一、SLAM算法与导航实战(毕设开源分享)

    目录 1 开源分享 2 建图结果 2 1 多观测点环境结果 xff1a 2 2 长廊环境建图结果 xff1a 1 开源分享 今天终于完成了毕设项目的落地和算法实现 xff0c 比较感叹这里面的坑 xff0c 不仅仅是Linux ROS xf
  • 【3D视觉工坊】第二期公开课:相机标定的基本原理与经验分享 笔记

    课程链接 xff1a 3D视觉工坊 第二期公开课 xff1a 相机标定的基本原理与经验分享 哔哩哔哩 bilibili
  • writeup-RrEeGgEeXx EKOPARTY

    State of the art on authentication mechanisms 题目如上 xff0c 下载完附件 xff0c 扔进IDA xff0c 发现又是c 的 于是又扔进reflector反编译一下 分析了下发现有一个对字
  • FreeRTOS 学习笔记(自用)

    前言 xff1a 本文章用于记录学习FreeRTOS xff08 韦老师 xff09 期间的笔记以及一些个人理解 xff08 带完善 xff09 一 学习内容 xff1a 1 裸机及操作系统 2 FreeRTOS功能及其实现原理 3 线程通
  • 《单片机串口》—将传感器获取的数值在上位机显示

    这里写目录标题 1 单片机通过串口发送单个字符2 单片机通过串口发送字符串3 单片机将传感器获取到的数字值发送到上位机 之前在学蓝牙通信的时候如何将单片机获取到的传感器的数值发送到上位机遇到了不少的问题 由于数据的发送一种是字符格式一种是
  • 三天让车立起来!STM32平衡车入门PID —— 第三天(PID调参)

    说明 xff1a 本文章适用于STM32初学者 xff0c 想完成一个好玩且有深度的项目但不知道从何下手的同学 PID调参是平衡车的精髓所在 xff0c 参数整定的好坏直接影响到平衡车的平衡效果 有的车平衡时来回晃而参数选的好的车就能稳稳地
  • PCB笔记-原理图

    1 学习路线 画PCB追求的是效率 xff01 xff01 xff01 2 元件库的创建 2 1 元件符号 元件符号是元件在原理图上的表现形式 xff0c 主要由元件边框 xff0c 管脚 xff08 包括管脚序号和管脚名称 xff09 x
  • FreeRTOS任务调度启动流程

    FreeRTOS任务调度启动流程 PrefacePreviewAttentionFreeRTos目录结构解释 FreeRTos任务调度一 vTaskStartScheduler函数中需要注意的细节二 xPortStartScheduler函