S1-01 FreeRTOS

什么是FreeRTOS

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

Free: 开源的
R: Real
T: Time
O: Operating
R: System
RTOS: 实时操作系统

Super Loop程序

在这里插入图片描述

所有程序都在一个大循环中进行,在未执行完第一个任务的时候不会执行第二个任务
当有中断进入的时候,先处理中断,然后在回到原来的位置执行未执行文的任务

Task程序

在这里插入图片描述

多个任务并行处理,根据任务优先级决定谁先执行

什么是Arduino

Arduino是一套便捷、灵活、容易上手的硬件开发平台,它包括多种型号的Arduino控制电路板,和专用编程开发软件。Arduino省略了很多繁琐的底层开发,让人们可以专注在功能实现,快速的开发出智能硬件原型。Arduino的硬件价格也相对便宜,所以,Arduino可以说是适合每个人的硬件开发平台。

有一位意大利依夫雷亚交互设计学院的副教授, 叫马西莫·班兹教授和他的学生赫尔南多·巴拉甘一起开发了一个简单易用的电路板和开发工具,并准备推向市场销售。他们以常去的一家酒吧名字来命名了这个产品。这家酒吧就叫“Bar di re Arduino”,这个名字来源于意大利的末代皇帝杜安,Arduin。

安装Arduino

下载地址:https://www.arduino.cc/en/donate/
按默认选择安装即可
安装完毕后需要添加ESP32的开发环境
打开文件 -> 首选项 : 设置 -> 附加开发板管理器地址
填入
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_dev_index.json
两个地址
确定后打开,工具 -> 开发板 -> 开发板管理器,在其中搜索ESP32,如果出现的列表中有2.0以上版本,选择这个,否则就是因为被墙了,需要科学上网才能下载

开发板选择 ESP32S3
调整FlashMode为DIO 80M
调整Partition Table为16MFlash的
其他下载不好使

创建第一个Arduino程序

void setup() {
  Serial.begin(115200);
  Serial.println("Hello, ESP32-S3!");
}
void loop() {
  delay(10);
}

Android分为两个大的函数,分别是setup和loop。
setup函数只运行一次,根据名称可以知道,用于最初的硬件设备驱动设置和安装。
loop是大循环,程序运行到这里后会不断重复执行这个函数,永不退出。

setup函数中,通过 Serial.begin(115200) 函数初始化了串口,这是设置了波特率是115200,但其实还隐含设置了其他三个参数。
串口初始化一般需要 波特率、停止位、校验位、数据位四个参数,在这个初始化中默认停止位1位,没有校验位,8个数据位,也就是我们常说的1N8方式初始化,这也是我们最常用的一种方式,而115200和9600两个波特率也是常用的波特率,在物联网通讯中,为了确保速度,一般都选择115200以上的速率,但也不是随便选的,大家可以参考一下Arduino或者串口调调试助手列出的整数波特率,不要自己写一些奇怪的数字,很有可能丢数据。
串口初始化完毕之后,可以通过 Serial.print() 或者 Serial.println() 向串口输出一些内容,本阶段我们只用于调试程序用,在实际开发中,可以通过Serial指令做一些交互菜单。

使用WOKWI模拟运行程序

https://wokwi.com/

单任务点灯

共享代码位置:https://wokwi.com/projects/362344392422014977

void setup() {
  // 设置引脚为输出模式
  pinMode(4, OUTPUT);
}
void loop() {
  // 设置引脚输出高电平
  digitalWrite(4, HIGH);
  // 等待1秒
  delay(1000);
  // 设置引脚输出低电平
  digitalWrite(4, LOW);
  // 等待1秒
  delay(1000);
  // 重复循环
}

在Arduino中,通过pinMode设置引脚的I/O模式,第一个参数是开发板的引脚编号,第二个参数可选择为OUTPUT或者INPUT,目前我们只作为输出使用。
通过 digitalWritedigitalRead 对引脚的电平进行操作,digitalWrite 包含两个参数,第一个依然是引脚编号,第二个只能是 HIGH 或者 LOW 表示高或者低。
digitalRead 只需要一个参数,就是引脚编号,但他会返回一个枚举值,可以理解为数字,0表示低电平,1表示高电平。
digital开头的函数都是对引脚进行数字操作,结果结果也只能是0或者1。

使用单任务控制多个LED闪烁逻辑非常复杂,如果使用多任务,事情就变得非常简单了。

电路设计

需要补全

改为多任务执行

多任务执行,同时控制三个灯
共享代码位置:https://wokwi.com/projects/362344652502445057

// 第一个任务,控制红灯,每1秒亮灭一次
void task1(void *param_t){
  pinMode(4, OUTPUT);
  while(1){
    // 先读取引脚的高低电平,然后翻转,最后重新设置给这个引脚
    digitalWrite(4, !digitalRead(4));
    // 等待1秒钟
    vTaskDelay(1000/portTICK_PERIOD_MS);
  }
}
// 第二个任务,控制绿灯,每2秒亮灭一次
void task2(void *param_t){
  pinMode(5, OUTPUT);
  while(1){
    digitalWrite(5, !digitalRead(5));
    vTaskDelay(2000/portTICK_PERIOD_MS);
  }
}
// 第三个任务,控制蓝灯,每3秒亮灭一次
void task3(void *param_t){
  pinMode(6, OUTPUT);
  while(1){
    digitalWrite(6, !digitalRead(6));
    vTaskDelay(3000/portTICK_PERIOD_MS);
  }
}
void setup() {
  Serial.begin(115200);
  xTaskCreate(task1, "Blink Red",1024,NULL,1,NULL);
  Serial.println("第一个任务被创建,将控制红灯每秒亮灭一次");
  xTaskCreate(task2, "Blink Green",1024,NULL,1,NULL);
  Serial.println("第二个任务被创建,将控制红灯每2秒亮灭一次");
  xTaskCreate(task3, "Blink Blue",1024,NULL,1,NULL);
  Serial.println("第三个任务被创建,将控制红灯每3秒亮灭一次");
}
void loop() {
}

该程序中,首先通过函数创建了一个任务的入口,格式如下
void 函数名称(void *pt)
所以该函数需要插入一个指针类型的参数作为任务运行的参数,本节课暂时用不到,下节课的时候我们会讲到传参。
digitalWrite(5, !digitalRead(4));
这段代码的意思是,首先将引脚4的电平读出,然后通过逻辑操作符对这个电平进行翻转,高边低,低变高,最后在写回到这个端口上。
在Arduino的程序中,我们是通过delay进行延时的,在FreeRTOS的Arduino中,其实也可以直接用这个delay函数,框架已经贴心的为我们做了封装,但作为好习惯,在FreeRTOS中,我们尽量还是使用FreeRTOS自身的函数。
FreeRTOS中延时函数使用的是 vTaskDelay 其中传入的是一个Tick值。
Tick可以理解为芯片的心跳间隔时间,也是我们可以最小的延时单位,在不同CPU中心跳都不同,在ESP32-S3中,我们初始设置了Tick为1,表示没间隔1ms产生一次心跳,也就是每秒钟跳1000下。
所以我们通过需要delay的时间(毫秒) ÷ 心跳间隔,就得出了我们应该停留多长时间,当然这里直接写1000也行。
因为这个Tick在后续ESP-IDF开发中我们是需要根据实际情况修改的,所以我们保持好习惯,尽可能通过计算方式获得。
portTICK_PERIOD_MS 是系统的一个常量,可以打印一下试试看。

任务通过 xTaskCreate 创建,在代码中,我们通过

xTaskCreate(task1, "Blink Red",1024,NULL,1,NULL);

这个函数的原型是:


BaseType_t xTaskCreate( TaskFunction_t pvTaskCode, 
                                        const char *const pcName, 
                                        const uint32_t usStackDepth, 
                                        void *const pvParameters, 
                                        UBaseType_t uxPriority, 
                                        TaskHandle_t *const pxCreatedTask)

创建了第一个任务,这里一共传入了6个参数,依次为:
pvTaskCode 入口函数,这个函数必须是一个 void(void*)类型的,没有返回值,并有一个指针参数
pcName 表示任务名称的字符串
usStackDepth 任务栈空间的大小,单位是字节,1024表示1kB
pvParameters 任务需要传入的参数,指针类型
uxPriority 优先级,数字越大优先级越高,一般有系统设定的 configMAX_PRIORITIES 参数决定,但一般不建议超过32,不同任务优先级可以相同
pxCreatedTask 返回的任务,用于后续的操作

任务创建后将进入就绪状态,带调度到这个任务的时候开始执行,需要注意的是,任务执行完毕后将退出这个函数,并不会想loop一样重复执行,具体为什么我们下节课会讲。

setup函数中一共创建了三个线程,但第一个线程运行的时候并不会卡主,当他delay的时候会将时间让给其他线程执行,这就是多线程的真谛。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

11Spring IoC注解式开发(下)(负责注入的注解/)

1负责注入的注解 负责注入的注解,常见的包括四个: ValueAutowiredQualifierResource 1.1 Value 当属性的类型是简单类型时,可以使用Value注解进行注入。Value注解可以出现在属性上、setter方法上、以及构造方法的形参上, 方便起见,一般直…

虚拟主机 如何上传大于100M的文件 php网站程序

问题 虚拟主机上传文件大小限制100m, 有时会遇到非常大的文件上传,上传过程中耗时非常久, 可能服务器的限制设置了上传文件尺寸,返回“413 request entity too large” 整体逻辑 前端:上传文件时,进行文…

高精度彩色3D相机:开启崭新的彩色3D成像时代

3D成像的新时代 近年来,机器人技术的快速发展促使对3D相机技术的需求不断增加,原因在于,相机在提高机器人的性能和实现多种功能方面发挥了决定性作用。然而,其中许多应用所需的解决方案更复杂,仅提供环境的深度信息是…

Linux CentOS 7.6安装nginx详细保姆级教程

一、通过wget下载nginx压缩包 1、进入home文件并创建nginx文件夹用来存放nginx压缩包 cd /home //进入home文件夹 mkdir nginx //创建nginx文件夹 cd nginx //进入nginx文件夹2、下载nginx,我这里下载的是Nginx 1.24.0版本,如果要下载新版本可以去官网进行下载:…

ChatGPT付费创作系统V2.5.5独立版+前端

ChatGPT付费创作系统V2.5.5版本优化了很多细节,功能增加增加长篇写作功能。该版本为编译版无开源,本版本特别处理了后台弹窗、暗链网址。特别优化了数据库。升级过程中未发现任何BUG,全新安装或者升级安装均未出现400或者500错误,…

LeetCode刷题--- 地下城游戏

个人主页:元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 http://t.csdnimg.cn/yUl2I 【C】 ​​​​​​http://t.csdnimg.cn/6AbpV 数据结构与算法 ​​​http://t.csdnimg.cn/hKh2l 前言:这个专栏主要讲述动…

降低运营成本:采用安全托管服务(Managed Security Service,MSS)

文章目录 安全托管服务(MSS)?安全托管服务的内容安全风险评估安全监控预警安全应急响应安全问题咨询 企业为什么需要安全托管服务?与MSS合作的好处是什么?MSP和MSSP有何区别?MSSP如何向客户呈现服务内容企业可以托管哪些网络资产威胁管理托管…

算法训练营第四十二天|动态规划:01背包理论基础 416. 分割等和子集

目录 动态规划&#xff1a;01背包理论基础416. 分割等和子集 动态规划&#xff1a;01背包理论基础 文章链接&#xff1a;代码随想录 题目链接&#xff1a;卡码网&#xff1a;46. 携带研究材料 01背包问题 二维数组解法&#xff1a; #include <bits/stdc.h> using namesp…

楼宇管理新智慧:Panorama SCADA楼宇管理系统应用实例

一、背景介绍 楼宇管理系统旨在集中控制和监测楼宇运营&#xff0c;涵盖暖通空调&#xff08;HVAC&#xff09;、照明、电力系统、消防和安全系统等。通过直观的用户界面&#xff0c;用户得以实时监测和精准掌控这些系统&#xff0c;从而提升能源效率、确保设备正常运行&#…

Python - Bert-VITS2 语音推理服务部署

目录 一.引言 二.服务搭建 1.服务配置 2.服务代码 3.服务踩坑 三.服务使用 1.服务启动 2.服务调用 3.服务结果 四.总结 一.引言 上一篇文章我们介绍了如果使用 conda 搭建 Bert-VITS2 最新版本的环境并训练自定义语音&#xff0c;通过 1000 个 epoch 的训练&#xf…

如何彻底卸载Edge

要彻底卸载Edge浏览器&#xff0c;你可以按照以下几种方法操作&#xff1a; 方法一&#xff1a;使用控制面板 点击任务栏的“开始”按钮&#xff0c;打开“控制面板”。在控制面板中&#xff0c;选择“程序和功能”。在程序列表中找到Edge浏览器&#xff0c;右键点击它并选择…

如何使用ChemiCloud搭建WordPress外贸站完全指南(2024)

ChemiCloud是一家成立于2016年的云虚拟主机提供商&#xff0c;他们在全球范围内设有多个机房&#xff0c;并提供高性价比的服务。作为市场上最出色的WordPress外贸主机之一&#xff0c;ChemiCloud经过小编两个月的监控测试表现出色。 ChemiCloud的正常运行时间达到了99.99%&am…

工业以太网的网络安全与数据传输性能

工业以太网主要是一种用于工业控制系统的网络通信协议&#xff0c;它基于以太网技术&#xff0c;将其应用于工业环境中&#xff0c;以实现高速、可靠、安全的数据传输。跟传统的专用工业网络比较&#xff0c; 工业以太网具有更大的带宽、更低的成本以及更好的扩展性&#xff0c…

What does `wget -O` do?

wget -O 下载文件 并 重命名 wget -O 会 显示下载过程 wget -o 不会 显示下载过程 wget http://download.redis.io/releases/redis-4.0.9.tar.gz -O /usr/local/src/redis.tar.gz 或者 wget -O /usr/local/src/redis.tar.gz http://download.redis.io/releases/redis-…

爬虫01-爬虫原理以及爬虫前期准备工作

文章目录 1 爬虫基本原理什么是爬虫爬虫功能详解爬虫基本流程两个概念&#xff1a;request和response 2 一些问题爬虫能抓取什么样的数据&#xff1f;抓取的数据怎么提取部分内容&#xff1f;数据解析方式。为什么我爬虫抓取的数据和浏览器看到的不一样怎样解决JavaScript渲染的…

【办公技巧】Excel单元格隐藏的部分如何显示出来

Excel工作表中的有些单元格隐藏了数据&#xff0c;如何取消隐藏行列呢&#xff1f;今天分享几个方法给大家 方法一&#xff1a; 选中隐藏的区域&#xff0c;点击右键&#xff0c;选择【取消隐藏】就可以了 方法二&#xff1a; 如果工作表中有多个地方有隐藏的话&#xff0c;…

SpringBoot+Vue药品ADR不良反应智能监测系统源码

药品不良反应&#xff08;Adverse Drug Reaction&#xff0c;ADR&#xff09;是指合格药品在正常用法用量下出现的与用药目的无关的有害反应&#xff0c;不包括超说明书用药、药品质量问题等导致的不良后果。 ADR智能监测系统开发环境 ❀技术架构&#xff1a;B/S ❀开发语言&…

Hbuilder X 设置格式化代码时清除空白行

将 preserve_newlines 的值改为 false "preserve_newlines": false, //保留空行

Prometheus实战篇:Prometheus监控docker

Prometheus实战篇:Prometheus监控docker 准备环境 监控docker 为了能够获取到Docker容器的运行状态,用户可以通过Docker的stats命令获取当前主机上运行容器的统计信息,可以查看容器的CPU利用率,内存使用量,网络IO总量以及磁盘IO总量等信息. docker stats除了使用命令以外,用户…

番外篇-区块链基础知识入门

今天聊聊番外篇之Web3、区块链的基础知识~ 1. 区块链是如何工作的&#xff1f; Hash算法 将输入的数据映射为一个固定长度的字符串字符串是64长度&#xff0c;16进制&#xff08;2^4&#xff09;&#xff0c;4 * 64 256【SHA256】hash演示&#xff1a;https://andersbrownwo…