【ESP32+freeRTOS学习笔记-(一)freeRTOS介绍】

news2024/11/17 13:20:46

目录

  • FreeRTOS基本情况
  • FreeRTOS的特色
  • 发行版的目录结构与文件说明
    • 原生程序的下载与目录结构
    • FreeRTOS的主要文件说明
    • 头文件说明
    • 关于FreeRTOSConfig.h的说明
  • 主要的数据类型说明
    • 重要数据类型 -- TickType_t
    • 重要数据类型 -- BaseType_t
  • 一些默认的规则
    • 变量名的规则
    • 函数的命名规则
    • 宏的命名规则
  • 总结

FreeRTOS基本情况

FreeRTOS是一个迷你的实时操作系统内核。作为一个轻量级的操作系统,功能包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能、软件定时器、协程等,可基本满足较小系统的需要。由于RTOS需占用一定的系统资源(尤其是RAM资源),只有μC/OS-II、embOS、salvo、FreeRTOS等少数实时操作系统能在小RAM单片机上运行。相对μC/OS-II、embOS等商业操作系统,FreeRTOS操作系统是完全免费的操作系统,具有源码公开、可移植、可裁减、调度策略灵活的特点,可以方便地移植到各种单片机上运行。 –百度百科

FreeRTOS由Real Time Engineers有限公司独家拥有、开发和维护。是一个长期维护的开源软件。有开源免费版,也有商业授权版。

在FreeRTOS中,每个执行线程被称为“任务”。FreeRTOS通过调度策略以及任务的优先级的共同配合完成多任务的调度与切换。

FreeRTOS的特色

 Pre-emptive or co-operative operation (具有抢占式调度 、 合作调度模式)
 Very flexible task priority assignment (具有非常灵活的任务优先级分配方式)
 Flexible, fast and light weight task notification mechanism (灵活,快速与轻量化的任务通知机制)
 Queues (队列)
 Binary semaphores (二进制信号量)
 Counting semaphores (计数型信号量)
 Mutexes (互斥锁)
 Recursive Mutexes (递归互斥锁)
 Software timers (软件定时器)
 Event groups (事件组)
 Tick hook functions (tick 勾子函数)
 Idle hook functions (空闲勾子函数)
 Stack overflow checking (栈溋出检测)
 Trace recording (跟踪记录调试功能)
 Task run-time statistics gathering (任务的运行时统计)
 Optional commercial licensing and support (可选的商业许可和支持)
 Full interrupt nesting model (for some architectures) (针对一些平台的全中断嵌套模型)
 A tick-less capability for extreme low power applications (适用于极低功耗应用的无tick功能)
 Software managed interrupt stack when appropriate (this can help save RAM) (软件管理中断堆栈)

发行版的目录结构与文件说明

原生程序的下载与目录结构

从官网的链接中https://freertos.org/index.html中去下载FreeRTOS发行版是一个压缩包:如图
在这里插入图片描述
解压后的目录结构如下:
在这里插入图片描述

上图的红框部分是主要的库文件(上方的event_groups.c也是),include包含了所有的头文件的目录。portable是移植到不同平台的对应文件目录。
以上是标准的FreeRTOS目录文件,相当的精简。当需要移植到不同编译环境和适配不同MCU平台时,需要使用的portable这个目录里对应的文件。具体内容可以打开目录看一下。
由于本文的环境是ESP32,乐鑫已经针对ESP32平台做了FreeRTOS的移植和适配。因此,这里的不需要另外下载。在安装完ESP-IDF环境后,就已经自带了FreeRTOS了。在这里我们为了区分原生的FreeRTOS和ESP32的FreeRTOS,延用乐鑫的叫法,把原生的FreeRTOS叫做Vanilla FreeRTOS,ESP32里的叫做ESP-IDF FreeRTOS
为了集中注意力理清FreeRTOS的逻辑,不再针对ESP32以外的平台的移植相关内容进行展开。

FreeRTOS的主要文件说明

文件名说明
task.c任务相关的库文件,完成任务的操作的函数集
list.c链表操作相关的库文件,链表是FreeRTOS里重要的数据结构,相应的操作函数在这个库里
queue.c队列和信号量相关的库文件。实现队列与信号量的操作函数
timers.c软件定时器相关的库文件。
event_groups.c事件组相关的库文件。

头文件说明

使用 FreeRTOS API 的源文件必须包含“FreeRTOS.h”,后跟包含正在使用的 API 函数原型的头文件——“task.h”、“queue.h”、“semphr.h”、“timers.h”或“event_groups.h”。

关于FreeRTOSConfig.h的说明

官方原文里对FreeRTOSConfig.h文件的使用要求如下:

FreeRTOS由一个名为FreeRTOSConfig.h的头文件配置。FreeRTOSConfig.h用于定制特定应用程序中使用的FreeRTOS。例如,FreeRTOSConfig.h包含诸如configUSE_PREEMPTION之类的常量,其设置定义将使用协作调度算法还是抢占调度算法。因为FreeRTOSConfig.h包含特定于应用程序的定义,它应该位于正在构建的应用程序的一部分目录中,而不是包含FreeRTOS源代码的目录中。

在ESP32,基本无需配置这个文件(这个文件在/esp/esp-idf/components/freertos/include/esp_additions/freertos/FreeRTOSConfig.h),这些设置里有一部分由ESP-IDF中的menuconfig这个功能对所有涉及到的内容时行配置的,使用起来会更加的直观和便利。这就是ESP32适配完FreeRTOS的使用上的区别。

主要的数据类型说明

重要数据类型 – TickType_t

以下为官方原文

1、 FreeRTOS 配置了一个称为滴答(tick)中断的周期性中断。
2、自 FreeRTOS 应用程序启动以来发生的滴答中断次数称为滴答计数(tick count)。滴答计数用作时间的度量。
两个滴答中断之间的时间称为滴答周期。时间被指定为tick周期的倍数。TickType_t 是用于保存滴答计数值的数据类型,并用于指定时间。
TickType_t可以是无符号16位类型或无符号32位类型,具体取决于FreeRTOSConfig.h中configUSE_16_bit_TICKS的设置。如果configUSE_16BIT_TICKS设置为1,则TickType_t定义为uint16_t。如果configUSE_16_BIT_TICKS设置为0,则TickType_t定义为uint32_t。
使用16位类型可以大大提高8位和16位架构的效率,但严重限制了可以指定的最大块周期。没有理由在32位体系结构上使用16位类型。

解释:
由于FreeRTOS是可以面向不同的平台的RTOS,因此在时间的计量上,独立于平台通过一个自定义的tick中断来实现不同平台下的统计计时。这个中断的周期做为计时的基础来转换成时间。定义的这个重要的基础数据类型TickType_t本质就是一个32位(现在基本都是32位的MCU了)的无符号整数。时间的内部表达就是从开机到现在经历了多少个tick中断。也即TickType_t类型用于保存tick中断的次数。
这样系统的时间内部表示就在不同的平台有了一个统一的标准,就是tick中断次数。但是这样做毕竟不利于开发者控制时间,因此我们习惯的时间表达方式是秒,毫秒等。这个要和tick中断次数如何表达呢。这里系统提供了很多多转换的宏,如pdMS_To_TICKS(毫秒)(宏pdMS_TO_TICKS()能被用于转换毫秒到ticks)等,来实现我们习惯的时间与系统计时单位的转换。

重要数据类型 – BaseType_t

以下为官方原文
这总是被定义为架构中最有效的数据类型。通常,这是32位体系结构上的32位类型,16位体系结构中的16位类型,以及8位体系结构的8位类型。
BaseType_t通常用于只能接受非常有限的值范围的返回类型,以及pdTRUE/pdFALSE类型的布尔值。

解释:
这个数据类型简单理解就是FreeRTOS里定义的用于标准化返回值的一个数据类型。为了规避不同编译系统可能给true或false带来的不同定义,所以FreeRTOS官方通过这个BaseType_t类型来统一返回类型为pdTRUE 或 pdFALSE。

一些默认的规则

变量名的规则

变量名称
变量以其类型为前缀:“c”表示char,“s”表示int16_t(短),“l”表示int32_t(长),“x”表示BaseType_t和任何其他非标准类型(结构、任务句柄、队列句柄等)。
如果变量是无符号的,它也会以“u”作为前缀。如果变量是指针,它也会以“p”作为前缀。例如,uint8_t类型的变量将以“uc”为前缀,而指向char的指针类型的变量则以“pc”为前缀。

函数的命名规则

函数名称
函数以返回的类型和在其中定义的文件为前缀。例如:
 vTaskPrioritySet()返回一个void,并在task.c中定义。
 xQueueReceive()返回BaseType_t类型的变量,并在queue.c中定义。
 pvTimerGetTimerID()返回指向void的指针,并在timer.c中定义。
文件范围(专用)函数前缀为“prv”。

宏的命名规则

在这里插入图片描述

总结

关于FreeRTOS的介绍,内容比较多,也比较杂,相互之前的逻辑性也不是很强。初学FreeRTOS一时对这些内容的不易理解也正常。但这些内容是必须要了解和知道的。然后在接下来的学习中,自然而然就明白了。因为在接下来的各个知识块里都会有这些相关联的内容。因此在这里所有的知道只能点到为止。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/72985.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

你在网络上发布的内容真的归你所有吗?有Web3.0和元宇宙的未来是什么样的?

欢迎来到Hubbleverse 🌍 关注我们 关注宇宙新鲜事 📌 预计阅读时长:9分钟 本文仅代表作者个人观点,不代表平台意见,不构成投资建议。 你认为你在微博、抖音等社交媒体上发布的内容是属于你的吗?事实并非…

Dashed lines generator for 3dMax 虚线生成器插件使用教程

Dashed lines generator虚线生成器是一个3DMAX建模工具,可以通过简单的步骤自动生成所有类型的虚线:它可以用于模拟交通标志标准;使用“蒙皮修改器SKIN MODIFIER”选项,可以非常容易地操纵创建的虚线,更改其位置和方向…

关于Pytorch模型检查点大小和参数量的一些观察

目录 背景和需求 一、模型的参数量统计 二、模型检查点大小查看 三、检查点大小和模型参数量之间的关系 总结 背景和需求 一个Pytorch模型的大小可以从两个方面来衡量:检查点大小和模型的参数量。现在我从两个方面都拿到了具体数值,想要验证它们两个是否…

数据开源 | Magic Data开源DMS驾驶员行为数据集

由于近几年人工智能、芯片技术的发展,自动驾驶被资本市场越炒越热。目前大部分车企正在朝着完全自动驾驶努力,大部分已经落地的无人驾驶技术仍然是L2与L3级。同时,汽车行业也逐渐在汽车上集成了辅助自动驾驶和智能助手等功能,让驾…

C语言结构体详解

邀请加入嵌入式社区,您可以在上面发布问题,博客链接,公众号分享,行业消息,招聘信息等。 目录 结构体有什么用? 结构体声明 正常的结构体声明 匿名结构体 匿名结构体只有在创建的时候可以建立变量 两个…

vuex通过Mutations来修改状态的原理及devtools插件的下载

状态修改: 通过Mutations来修改状态,并配合devtools调试工具会记录这个状态何时被修改过; 好处是因为所有组件都可以访问和修改状态,通过Mutations配合调试工具能知道状态被哪个组件什么时候被修改过,方便追溯&#…

如何让 ChatGPT 写短篇小说?

故事一 请根据下面内容续写故事,要求800字。 在一个晴朗的秋日下午,男主人 Jack 抱着他的妻子 Rose,两人坐在沙发上看着电视。 这是,Jack对Rose说:”亲爱的,我们来玩一个游戏吧。” ChatGPT回答&#xff1a…

华为机试 - 端口合并

目录 题目描述 输入描述 输出描述 用例 题目解析 算法源码 题目描述 有M(1<M<10)个端口组&#xff0c; 每个端口组是长度为N(1<N<100)的整数数组&#xff0c; 如果端口组间存在2个及以上不同端口相同&#xff0c;则认为这2个端口组互相关联&#xff0c;可以…

CentOS部署主从DNS服务器

几个概念&#xff1a; 域名解析为IP地址&#xff1a;正向解析 IP地址解析为域名&#xff1a;反向解析 主DNS服务器&#xff1a;在特定区域内具有唯一性&#xff0c;负责维护该区域内的域名和IP地址之间的对应关系。 从DNS服务器&#xff1a;从服务器中获得域名和IP地址对应关系…

PCIE2PCI104载板转接卡

功能型号 PCIE2PCI104 此无源扩展卡允许开发人员将PCI104或PC/104plus卡安装到通用PCI总线系统中。适配器配备了一个堆栈式连接器。 功能描述 规格 适用于标准&#xff1a;Universal.3.3V或5V PCI插槽 工业温度工作范围&#xff1a;-40至85 C 连接器/接口&#xff1a;包括一个带…

干货 | 肖特基二极管4大特性

前言 肖特基二极管是重要的电子元器件&#xff0c;因为其承载着保护电路的重要作用&#xff0c;所以显得格外的不可或缺&#xff0c;我们都知道在选择肖特基二极管时&#xff0c;主要看它的正向导通压降、反向耐压、反向漏电流等。 但我们却很少知道其在不同电流、不同反向电压…

固定支撑约束在ANSYS有限元计算中的三大注意事项

固定支撑是在结构有限元中&#xff0c;大家最常用的一种约束条件了。如图1所示给出了设置固定支撑操作的方法。 图1 设置固定支撑操作方法 固定支撑约束&#xff0c;可以应用在点&#xff0c;线和面特征上。固定支撑表示被约束为位置为刚性&#xff0c;但是在现实工程结构中&a…

解决“Vector Hardware Manager无法连接This Computer”(能够独立解决问题,体现一个人的综合能力)

1. 引子 Vector Hardware Manager是先前配置工具Vector Hardware Config的继承者,是Vector Hardware Config工具的升级版或替代产品 什么是Vector Hardware Config? CANoe里打开: 界面: 而Vector Hardware Manager其实就是把Vector Hardware Config里的功能搬到了这里实…

UE5 + VS2022和UE4 + VS2019 编译踩坑

1&#xff0c;卡住且没有cl.exe进程 &#xff08;1&#xff09;&#xff0c;卸载Incredibuild&#xff0c;Incredibuild也是利用进程虚拟化技术&#xff0c;加速包括编译的方法&#xff0c;和firstbuild是一样的&#xff0c;所以优先选择了Incredibuild的方式&#xff0c;但是2…

PDF文件添加水印怎么添加?只需要两步轻松添加水印

PDF文件添加水印怎么添加&#xff1f;我们在处理工作文件时&#xff0c;都非常在意文件的隐私性&#xff0c;我们经常会使用一些方法来确保我们文件的内容不被别人窃取&#xff0c;其中一种方法就是给PDF文件添加水印&#xff0c;这样文件的内容就不会轻易被窃取了&#xff01;…

ControllerAdvice统一异常处理失效

问题描述 在common模块增加统一异常处理代码&#xff0c;如下。在service业务处理类中抛出异常&#xff0c; 但是接口返回的为spring统一的500错误。 package com.tea.common.exception; import com.tea.common.entity.ResponseResult; import com.tea.common.entity.Status…

基于java springboot的小说阅读微信小程序含后台管理系统源码

系统运行环境 开发工具 eclipse(idea)&#xff0c;mysql5.7&#xff08;大于5.5&#xff09;&#xff0c;navicat&#xff0c;小程序开发工具 硬件要求 windows操作系统 cpu&#xff1a;2.4GHz 内存&#xff1a;4G 硬盘&#xff1a;100G 开发及运行环境 windows10操作…

ArcGIS基础:栅格数据中的NoData数值(空值)的处理

先看下实验操作数据&#xff0c;也是原始数据&#xff0c;如下所示&#xff1a; 是一个非常普通的DEM栅格数据&#xff0c;中间空了一大块&#xff0c;也就是nodata&#xff0c;那么如果进行数据运算处理时&#xff0c;nodata值的像元是不参与&#xff0c;因此&#xff0c;需要…

Google Earth Engine(GEE)——将每小时降水量转化为逐日的降水量

很多时候我们获取影像的时间分辨率为逐小时,但是如何获取影像的累积降水量?这里的整体思路就是获取不同时间影像的时间序列,然后分别获取每天的降水量,最后同一秋累计值,如果要进行时序图片展示的情况,我们就可以再秋累计值的时候就可以建立一个时间属性,这样可以建立时…

【WebGL-iTwin.js】先导篇:用bentley-iTwin.js搭建模型在线可视化平台

一、先导篇说明 本篇博客为先导篇&#xff0c;方便快速搭建可视化平台。后面会慢慢补充WebGL相关的知识&#xff0c;理论原理和代码实战都会涉及&#xff0c;采用的技术是iTwin.js&#xff0c;它是由bentley推出的基于Cesium的开源图形框架&#xff0c;主要用于工程数字化BIM应…