FreeRTOS笔记—第一章 FreeRTOS概述

2023-05-16

1.1 认识FreeRTOS

1.1.1 什么是操作系统

        操作系统(Operating System,简称OS)是管理计算机硬件与软件资源的计算机程序。简单说就是一种管理计算机资源的软件。目的是为了高效、合理、简单、安全的利用有限的计算机硬件与软件资源。

        最初的电脑没有操作系统,人们通过各种按钮来控制计算机,后来出现了汇编语言,操作人员通过有孔的纸带将程序输入电脑进行编译。这些将语言内置的电脑只能由制作人员自己编写程序来运行,不利于程序、设备的共用。为了解决这种问题,就出现了操作系统,这样就很好实现了程序的共用,以及对计算机硬件资源的管理。

        操作系统如同一个国家的管理,比如图书馆,医院,学校,矿产,耕地等等都是国家公共资源,如同计算机的硬件和软件公共资源。公共资源是有限的,国家就需要对资源进行管理,合理的利用,把资源优先分配给最需要的人,使得尽可能公平。操作系统也是对计算机的硬件和软件公共资源进行管理,合理的利用。

万字长文详细介绍操作系统基本概念

1.1.2 操作系统类型

        根据实际用途不同,又发展出了不用类型的操作系统。分别有 分时系统、实时系统、批处理系统、网络操作系统等。其中 分时系统、实时系统 是最常见的。

分时系统(Time Share Operating System):可以实现用户的人机交互需要,多个用户共同使用一个主机,很大程度上节约了资源成本。 分时系统具有多路性、独立性、交互性、及时性的优点,能够将用户-系统-终端任务实现。常见有:Windows、Linux、IOS、Android等。

实时系统(Real Time Operating System,简称 RTOS):是指系统可以快速的对外部命令进行响应,在对应的时间里处理问题,协调系统作。在嵌入式领域中,嵌入式实时操作系统正得到越来越广泛的应用。采用嵌入式实时操作系统(RTOS)可以更合理、更有效地利用CPU的资源,简化应用软件的设计,缩短系统开发时间,更好地保证系统的实时性和可靠性。不过实时性是相对分时系统大型系统而言的。玩过单片机人都知道直接立刻操作硬件资源实时性是最高的。常见有:μC/OS-II、μC/OS-III、FreeRTOS、RT-Thread、RTT、VxWorks.等。

常见的操作系统及应用领域


1.1.3 FreeRTOS简介

        FreeRTOS是一个开源免费迷你的实时操作系统内核(Free自由,RTOS实时操作系统,通过字意就能知道是免费的)。作为一个轻量级的操作系统,功能包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能、软件定时器、协程等,可基本满足较小系统的需要。

        由于RTOS需占用一定的系统资源(尤其是RAM资源),只有μC/OS-II、embOS、salvo、FreeRTOS等少数实时操作系统能在小RAM单片机上运行。相对μC/OS-II、embOS等商业操作系统,FreeRTOS操作系统是完全免费的操作系统,具有源码公开、可移植、可裁减、调度策略灵活的特点,可以方便地移植到各种单片机上运行。

1.1.4 常见实时系统比较

其他参考:

rtthrea-ucosii-freertos三系统学习总结

[RTOS]uCOS、FreeRTOS、RTThread、RTX等RTOS的对比之特点

1.2 FreeRTOS源码下载和文件介绍

1.2.1 FreeRTOS官方源码下载

官方网址:https://www.freertos.org

 下载下来的源码:

1.2.2 FreeRTOS源码文件目录结构树

        下载下来的源码是包含了一些库和工程实例等,用户需要提炼出有用的源码。

主要涉及2个目录:

  • Demo

    • Demo目录下是工程文件,以"芯片和编译器"组合成一个名字, 比如:CORTEX_STM32F103_Keil

  • Source

    • 根目录下是核心文件,这些文件是通用的

    • include目录下头文件

    • portable目录下是移植时需要实现的文件

      • 内存管理文件 目录名为:[compiler]/[architecture]

      • [IDE名]/[芯片内核]目录下文件,比如:RVDS/ARM_CM3,这表示cortexM3架构在RVDS工具上的移植文件

1.2.3 FreeRTOS源码 核心文件 介绍

FreeRTOS/Source/下的文件作用
tasks.c必需,所有任务相关函数
list.c必须,列表,在内核整体控制上都使用了列表格式数据处理
queue.c基本必需,提供队列操作、信号量(semaphore)操作,任务和任务之间的通讯
timer.c可选,软件定时器,以任务形式存在
event_groups.c可选,提供 事件标志组 功能。
croutine.c可选,过时了,协线程(协程)文件,和任务类似,在系统资源比较缺乏下使用,

FreeRTOS的最核心文件只有2个:

  • FreeRTOS/Source/tasks.c

  • FreeRTOS/Source/list.c

1.2.4 FreeRTOS源码 内存文件 介绍

文件在...../portable/MemMang下内存管理文件,它也是放在portable目录下,表示你可以提供自己的函数。

源码中默认提供了5个文件,对应内存管理的5种方法。

参考文章:FreeRTOS说明书吐血整理【适合新手+入门】

文件优点缺点应用场合
heap_1.c分配简单,没有碎片,时间确定只分配、不回收

适用要求非常严格的系统里,不允许使用动态内存的场景

heap_2.c动态分配、最佳匹配算法碎片、时间不定过时了,不推荐Heap_2。用Heap_4替代Heap_2,更高效。
heap_3.c调用标准库函数速度慢、时间不定适用使用标准C库中的malloc、free函数的场景
heap_4.c动态分配、相邻空闲内存可合并较少碎片问题、时间不定适用频繁分配、释放不同大小内存的场景
heap_5.c在heap_4基础上支持分隔的内存块较少碎片问题、时间不定适用内存块地址不连续的场景

注:通过对比可以看出一般最常用的是heap_4.c内存管理方式。

1.2.5 FreeRTOS源码 头文件 介绍

FreeRTOS需要3个头文件目录:

  • 移植时用到的头文件:FreeRTOS/Source/portable/[IDE名]/[芯片内核名]

  • 含有配置文件FreeRTOSConfig.h的目录

  • FreeRTOS本身的头文件:FreeRTOS/Source/include

头文件作用
portmacro.h实现与单片机接口的相关宏定义,系统移植文件。用于不通的编译器和芯片架构的移植、(不需要修改)
FreeRTOSConfig.hFreeRTOS的配置文件,比如选择调度算法:configUSE_PREEMPTION
每个demo都必定含有FreeRTOSConfig.h
建议去修改demo中的FreeRTOSConfig.h,而不是从头写一个
FreeRTOS.h

使用FreeRTOS API函数时,必须包含此文件。
在FreeRTOS.h之后,再去包含其他头文件,比如:
task.h、queue.h、semphr.h、event_group.h

预编译指令。定义缺省值,或者编译的时候给出#error信息。(不需要修改)

task.h任务管理:创建任务,删除任务,任务调度,等等 (不需要修改)
list.h 数据链表文件,FreeRTOS是用数据链表来进行任务管理的,该文件包含了对数据链表的操作函数。(不需要修改)
queue.h队列文件 管理消息队列等等。(不需要修改)
timers.h软件定时器头文件。(不需要修改)
event_groups.h提供 事件标志组头文件。(不需要修改)
crouting.h进程管理(不需要修改)
stream_buffer.h流缓冲区头文件。流缓冲区传递一个连续的字节流。
message_buffer.h消息缓冲区头文件。消息缓冲区传递大小可变但离散的消息。消息缓冲区使用流缓冲区进行数据传输
semphr.h信号量的一些宏函数。(不需要修改)
projdefs.h用于定义系统常用到的常量宏。(不需要修改)
stack_macros.h堆栈管理的一宏函数。(不需要修改)。V10.0.0开始为了一致性,已经重命名了StackMacros.h头文件stack_macros.h。为了兼容这两文件目前都在源码中。使用时直接删除StackMacros.h,选择stack_macros.h即可(新的源码不再使用StackMacros.h)。
StackMacros.h堆栈管理的一宏函数,旧文件。(不需要修改)
mpu_prototypes.h

当使用MPU时,标准(非MPU)API函数被映射到启动“MPU”的等效函数,其原型在此头文件中定义。

MPU是,即CPU升级芯片。

mpu_wrappers.h该文件重新定义要通过包装器宏调用的API函数,但仅适用于使用MPU的端口。
atomic.h

原子操作支持头文件。该文件通过全局禁用中断来实现原子函数。每个编译器目录下都可以提供具有特定于体系结构的原子指令的实现。

原子操作是指不可中断的一个或者一系列操作, 也就是不会被线程调度机制打断的操作, 运行期间不会有任何的上下文切换(context switch)。原子操作是在多线程环境下避免数据不一致必须的手段。  处理器使用基于对缓存加锁或总线加锁的方式来实现多处理器之间的原子操作。

例如:在单核CPU中, 能够在一个指令中完成的操作都可以看作为原子操作,因为中断只发生在指令间。

deprecated_definitions.h将过时的定义分离成单独一个新头文件,这些过时的定义在一些上年头的演示例程中仍会使用,必须包含在编译文件中。

1.3 官方Demo工程移植

       官方Demo工程移植是有别于FreeRTOS移植,官方Demo工程是官方在一些常见芯片上的移植示例工程,还有很多芯片并没有示例工程,没有的就需要用户自己去移植,这需要对FreeRTOS操作系统和芯片硬件熟悉才行!对于初学者先移植官方Demo工程学习,有能力和需要再去移植FreeRTOS。

        官方Demo工程是预先配置好的、没有编译错误的工程。目的是让你可以基于它进行修改,以适配你的单板。这些Demo还可以继续精简:

  • main函数中只需要保留2个函数:

    • prvSetupHardware()

    • vTaskStartScheduler()

1.4 数据类型和编程规范

1.4.1 数据类型

每个移植的版本都含有自己的portmacro.h头文件,里面定义了2个数据类型:

  • TickType_t:

    • FreeRTOS配置了一个周期性的时钟中断:Tick Interrupt

    • 每发生一次中断,中断次数累加,这被称为tick count

    • tick count这个变量的类型就是TickType_t

    • TickType_t可以是16位的,也可以是32位的

    • FreeRTOSConfig.h中定义configUSE_16_BIT_TICKS时,TickType_t就是uint16_t

    • 否则TickType_t就是uint32_t

    • 对于32位架构,建议把TickType_t配置为uint32_t

  • BaseType_t:

    • 这是该架构最高效的数据类型

    • 32位架构中,它就是uint32_t

    • 16位架构中,它就是uint16_t

    • 8位架构中,它就是uint8_t

    • BaseType_t通常用作简单的返回值的类型,还有逻辑值,比如pdTRUE/pdFALSE

1.4.2 变量名

变量名有前缀:

变量名前缀含义
cchar
sint16_t,short
lint32_t,long
xBaseType_t,
其他非标准的类型:结构体、task handle、queue handle等
uunsigned
p指针
ucuint8_t,unsigned char
pcchar指针

1.4.3 函数名

函数名的前缀有2部分:返回值类型、在哪个文件定义。

函数名前缀含义
vTaskPrioritySet返回值类型:void
在task.c中定义
xQueueReceive返回值类型:BaseType_t
在queue.c中定义
pvTimerGetTimerID返回值类型:pointer to void
在tmer.c中定义

1.4.4 宏的名

宏的名字是大小,可以添加小写的前缀。前缀是用来表示:宏在哪个文件中定义。

宏的前缀含义:在哪个文件里定义
port (比如portMAX_DELAY)portable.h或portmacro.h
task (比如taskENTER_CRITICAL())task.h
pd (比如pdTRUE)projdefs.h
config (比如configUSE_PREEMPTION)FreeRTOSConfig.h
err (比如errQUEUE_FULL)projdefs.h

通用的宏定义如下:

pdTRUE1
pdFALSE0
pdPASS1
pdFAIL0

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

FreeRTOS笔记—第一章 FreeRTOS概述 的相关文章

  • 4.1 Hbase的安装与简单操作

    第一关 Hbase数据库的安装 1 首先要在官网下载好Hbase的安装包 xff08 educoder已装到 opt目录下 xff09 2 将安装包解压到 app目录下 mkdir app cd opt ulimit f 1000000 t
  • numpy 多级排序 :lexsort 函数详解

    目录 1 lexsort 排的是个啥 2 举个例子 1 lexsort 排的是个啥 lexsort 函数的定义如下 xff1a def lexsort keys axis 61 None lexsort是一种多级排序方法 作用为对给定的 k
  • 5.1 Spark的安装与使用

    第一关 Scala语言开发环境的部署 1 下载解压 在Scala官网根据平台选择下载Scala的安装包scala 2 17 7 tgz 解压到 app目录下 xff1a mkdir app 创建 app 目录 cd opt tar zxvf
  • 5.7 Spark简单算子案例(Python版)

    第一关 WordCount 词频统计 编程要求 对文本文件内的每个单词都统计出其出现的次数 按照每个单词出现次数的数量 xff0c 降序排序 文本文件内容如下 xff08 单词与单词之间以空格进行分割 xff09 xff1a hello j
  • day01 开始

    一 介绍 夏培肃 造计算机第一代 李国杰 黄令仪 胡伟武 刘阳 底层 应用层 APP 金庸 xff1a 内练一口气 外练筋骨皮 内功 外功 操作系统 BIOS 3w 操作系统原理 计算机原理 STM32 100 30 70 上午 xff1a
  • day02 LED

    一 回顾 1 C int char short typedef 起别名 指针 函数 void fun T int x int y 结构体 2 嵌入式 以应用为中心 物联网的框架 xff1a 感知层 网络层 平台层 应用层 3 搭建开发环境
  • day03 timer

    一 回忆 计算机体系结构 总线的概念 数据总线 地址总线 控制总线 如 xff1a 0x12345678上放0x100 AHB AHB1 AHB2 APB1 APB2 编译原理 hello c 预处理 xff08 预处理器 xff09 he
  • ubuntu安装CMake

    CMake是什么呢 xff1f 根据百度百科的解释 xff0c CMake是一个跨平台的安装 xff08 编译 xff09 工具 xff0c 可以用简单的语句来描述所有平台的安装 编译过程 xff0c 能够输出各种各样的makefile或者
  • Ubuntu安装ifconfig工具

    安装命令 xff1a sudo apt install net tools
  • 通关必读—linux面试题(带答案)

    答案linux考试题 1 在登录Linux时 xff0c 一个具有唯一进程ID号的shell将被调用 xff0c 这个ID是什么 b A NID B PID C UID C CID 答 xff1a w命令查看用户tty终端信息 ps ef
  • shell判断整数变量的奇偶性

    为了简化问题和突出重点 xff0c 这里我们假设脚本的输入参数一定为合法的整数类型 xff0c 因而在脚本内部将不再进行参数的合法性判断 span class token punctuation span root 64 xieqichao
  • 《云计算全栈》-python篇:编写石头剪刀布小游戏、附带升级脚本-循环版石头剪刀布小游戏

    3 案例3 xff1a 编写石头剪刀布小游戏 3 1 问题 编写game py脚本 xff0c 实现以下目标 xff1a 计算机随机出拳 玩家自己决定如何出拳 代码尽量简化 123 3 2 方案 引用random模块生成0 2的随机数 xf
  • pytorch 层标准化 LayerNorm 的用法

    目录 1 为什么要标准化 xff08 理解的直接跳过到这部分 xff09 2 LayerNorm 解释 3 举例 只对最后 1 个维度进行标准化 4 举例 对最后 D 个维度进行标准化 1 为什么要标准化 xff08 理解的直接跳过到这部分
  • Python全套语法

    目录 学Python你应该get到的三句话 xff01 跟紧潮流不是随波逐流 xff01 投靠大佬不是投机取巧 xff01 赚取利益不是急功近利 xff01 Python全套语法重磅来袭 xff01 初识python之概念认知篇 初识pyt
  • 初识python之元组列表篇

    我们知道python的数据类型有 字符串 xff0c 数字 xff0c 列表 xff0c 元组 xff0c 字典 xff0c 函数等 xff0c 这些都是我们在进行实际开发中 xff0c 必备的一些基础性语法 xff0c 本期文章 xff0
  • Python如何把字典写入到CSV文件

    在实际数据分析过程中 xff0c 我们分析用Python来处理数据 xff08 海量的数据 xff09 xff0c 我们都是把这个数据转换为Python的对象的 xff0c 比如最为常见的字典 比如现在有几十万份数据 xff08 当然一般这
  • C 判断

    C 判断 判断结构要求程序员指定一个或多个要评估或测试的条件 xff0c 以及条件为真时要执行的语句 xff08 必需的 xff09 和条件为假时要执行的语句 xff08 可选的 xff09 C 语言把任何非零和非空的值假定为 true x
  • C 数组

    lt div class 61 34 article intro 34 id 61 34 content 34 gt C 数组 C 语言支持数组数据结构 xff0c 它可以存储一个固定大小的相同类型元素的顺序集合 数组是用来存储一系列数据
  • 为什么访问亚马逊的网站卡顿?

    lt h4 class 61 34 sectiontitle 34 gt 为什么访问亚马逊的网站卡顿 xff1f lt h4 gt 购买了 华北 北京四 的服务器 xff0c 在亚马逊开办了跨境电商网站 xff0c 使用过一段时间后 xff
  • 一文了解公有云、私有云、混合云、边缘云、专有云、分布式云

    1 公有云 公有云是为大众建的 xff0c 所有入驻用户都称租户 xff0c 不仅同时有很多租户 xff0c 而且一个租户离开 xff0c 其资源可以马上释放给下一个租户 xff0c 一如饭店里一桌顾客走了马上迎来下一桌顾客 公有云是最彻底

随机推荐

  • 区块链基本概念

    传统商业网络 在当前传统商业网络中 xff0c 作为整个商业网络的参与方 xff0c 各商业机构及政府 金融机构等各方独立 系统不通 xff0c 各自维护自己的数据 当发生交易时 xff0c 交易双方修改各自账本并本地维护 xff0c 形成
  • ChatGPT——OpenAI推出的人工智能聊天机器人

    ChatGPT OpenAI推出的人工智能聊天机器人 目录 隐藏 1 什么是ChatGPT 2 ChatGPT的应用领域 3 3 ChatGPT的原理 4 ChatGPT的发展历程 5 ChatGPT爆火的原因 6 ChatGPT带来的变革
  • HBase

    架构设计 核心概念 xff1a Client xff1a 发起读写请求的角色 xff0c 面向hbase client 编程 首先hbase查询Meta表 xff0c 找到读或写的数据的region区域位置信息 然后向region对应的HR
  • python 数组的排列与组合:combinations 与 permutations

    combinations 与 permutations 函数在python 的 itertools 库中 xff0c 因此在使用前需要 import itertools combinations 函数的作用就是罗列出所有数组中 n 个元素的
  • 在STM32下完成一个基于FreeRTOS的多任务程序

    在STM32下完成一个基于FreeRTOS的多任务程序 一 FreeRTOS简述二 MDK下移植FreeRTOS三 总结 一 FreeRTOS简述 FreeRTOS是一个热门的嵌入式设备用即时操作系统核心 已被经成功移植到35种不同的微控制
  • 【K8S】Kubernetes集群搭建流程详解

    文章目录 一 购买云服务器二 搭建Docker环境三 根据K8S官网搭建 基础环境 四 安装K8S三剑客 xff1a kubelet kubeadm kubectl五 安装K8S节点需要使用的镜像六 使用kubeadm初始化Master节点
  • springBoot maven打包[分层打包]

    打jar包 xff0c 很大 xff0c 发服务器也慢 get到一种打包方式 直接挨着cv直接就能用 一 src目录下创建assembly文件夹下assembly xml lt assembly xmlns 61 34 http maven
  • 链表-倒序排列鏈表

    剑指 Offer 06 从尾到头打印链表 38 输入一个链表的头节点 xff0c 从尾到头反过来返回每个节点的值 xff08 用数组返回 xff09 示例 1 xff1a 输入 xff1a head 61 1 3 2 输出 xff1a 2
  • 使用远程桌面链接CentOS 7

    需求 xff1a Gnome桌面环境 Xrdp Xrdp是Microsoft远程桌面协议 RDP 的开源实现 xff0c 它允许您以图形方式控制远程系统 Gnome安装 yum groupinstall 34 GNOME Desktop 3
  • vscode的下载速度会特别慢问题处理

    1 xff0c 下载太慢大部分是因为VSCODE官网服务器跟我们国内的链接速度有关 xff0c 当我们去官网下载会出现下面的情况 2 xff0c 复制下载的链接 xff0c 并且修改红框中的内容为 span style background
  • Dockerfile

    Dockerfile Dockerfile基本结构指令FROMMAINTAINERRUNCMDEXPOSEENVADDCOPYENTRYPOINTVOLUMEUSERWORKDIRONBUILD 创建镜像 Dockerfile 基本结构 D
  • 使用git时本地代码被覆盖怎么办

    1 遇事不要慌 xff0c 看本地历史记录 右键要想要恢复的代码或文件夹 61 右键 61 Local History 61 gt Show History 2 我一下就找到了本地历史记录 看右边有了不同时间的代码 xff0c 去点一下试试
  • Ubuntu截图工具flameshot的安装与快捷键设置

    https blog csdn net sexyluna article details 105884224
  • moveit配置过后gazebo加载不出来机械臂模型的问题

    我使用moveit setup assistant对dubot magician机械臂的urdf进行配置 xff0c 配置完成后发现运行gazebo launch可以打开gazebo xff0c 但是却什么也没有 xff0c 机械臂模型加载
  • 上传本地项目代码到GitHub的方法

    预备知识 xff1a 有一个GitHub账号 xff0c 然后知道怎么进GitHub网页 之前往GitHub上传代码都是现场百度找指令操作的 xff0c 从来不记 xff0c 这次干脆做个记录当个笔记吧 Git是一个版本控制软件 xff0c
  • 单片机之蜂鸣器

    蜂鸣器简介 无源蜂鸣器 xff1a 有绿色电路板的一种 有源蜂鸣器 xff1a 没有电路板用黑胶封闭的一种 其实蜂鸣器的种类有很多 例如 xff1a 电磁式蜂鸣器 xff1a 由振荡器 电磁线圈 磁铁 振动膜片及外壳组成 同时电磁式蜂鸣器也
  • Centos Stream 9 安装 Docker 23.0.2 社区版 官方安装教程

    目录 一 内核的版本必须大于3 10使用下面的命令来检查是否满足docker的要求 xff0c 进行依赖性检查 二 安装docker容器引擎 xff0c 需要一个具有sudo权限的账户登录进行操作 1 更新现有yum包 2 遇到提示请输入y
  • AttributeError: module numpy has no attribute int .报错解决方案

    在训练YOLO模型时突然发现这个报错 xff0c 后来发现是numpy版本问题 xff0c yolo官方给的是大于等于1 18 5 xff0c 当你执行pip install r requirements txt命令时 xff0c 他默认安
  • 单片机(嵌入式)程序分层架构

    目录 前言 嵌入式3层软件架构 嵌入式4层软件架构 1 驱动层 操作系统层 中间件层 应用层 嵌入式4层软件架构 2 硬件层 嵌入式微处理芯片 嵌入式存储器系统 嵌入式I O接口 中间层 系统软件层 RTOS 文件系统 GUI 应用层 嵌入
  • FreeRTOS笔记—第一章 FreeRTOS概述

    1 1 认识FreeRTOS 1 1 1 什么是操作系统 操作系统 xff08 Operating System xff0c 简称OS xff09 是管理计算机硬件与软件资源的计算机程序 简单说就是一种管理计算机资源的软件 目的是为了高效