ESP-IDF库开发教程之(4)--FLASH、BootLoader和FreeRTOS

2023-11-20

在之前的文章中,我描述了新的esp32芯片,并解释了如何设置开发环境,包括使用一种可选的图形IDE,Eclipse。

在开始开发程序之前,您需要了解框架的三个关键组件:flash,bootloader和FreeRTOS操作系统。但别担心!在本篇文章的最后,您将编写,编译并执行您的第一个程序(即使是“最小化”),并从下一个教程开始,我们将一起处理更复杂的示例。

Flash

正如我在本教程的第一篇文章中所写的,esp32芯片需要一个外部闪存来存储程序,数据,配置参数......

外部存储器通过SPI总线连接到芯片,支持的容量高达16Mb。官方Espressif模块(ESP-WROOM-32)包含由GigaDevice(GD25Q32)制造的4Mb闪存:

esp-flash01

闪存可以存储不同的元素:程序,数据...因此它被分成多个部分(分区)。闪存中的列表分区,大小和位置存储在内存本身(地址0x8000),它被称为分区表。

默认情况下定义了两种分区类型:

  • app (type 0) – partition that contains an application (program)包含应用程序(程序)的分区
  • data (type 1) – partition that contains data 包含数据的分区

在编写新程序时,开发人员可以根据程序的特定需求决定如何组织闪存。 esp-idf框架提供两种预先配置的内存布局,您可以从配置菜单中进行选择:

esp-flash02

您还可以使用make partition_table命令显示项目的分区表:

esp-flash03

I在上面的屏幕截图中,您可以看到对应于最简单配置的分区表布局(单工厂应用程序,无OTA):

  • a data partition (named “nvs“) with a size of 24Kb starting from address 0x9000
  • a data partition (named “phy_init“) with a size of 4Kb starting from address 0xf000
  • an app partition (named “factory“) with a size of 1Mb starting from address 0x10000

Bootloader

为了更好地理解为什么将闪存划分为分区,我必须描述esp32引导加载程序的工作原理,即如何启动应用程序以及如何上载新固件。

在esp32 ROM内存中有一个小程序,名为第一阶段启动加载程序。该程序在芯片的每次复位时执行:它配置对外部闪存的访问,并且如果需要,存储来自串行/ USB端口的新数据(闪存过程)。一旦完成,它将访问闪存(地址为0x1000)并加载并执行第二阶段启动加载程序。

即使esp-idf框架的标准行为是使用此第二阶段启动加载程序,也可以开发一个独立应用程序,该应用程序存储在闪存的地址0x8000处,由第一阶段启动加载程序直接执行。

第二阶段引导加载程序读取地址为0x8000的分区表并搜索应用程序分区。它根据otadata分区的内容决定执行哪个应用程序:如果此分区为空或不存在,则引导加载将执行存储在出厂分区中的应用程序。这允许实施无线(OTA)应用程序更新过程:将新版本的应用程序发送到esp32芯片;该版本存储在新的应用程序分区中。一旦上传完成,分区的ID被保存在otadata中并且芯片被重新启动;引导程序将执行新版本:

esp-flash04

FreeRTOS

esp-idf框架基于FreeRTOS实时操作系统。在像esp32这样的“小型”芯片上工作时谈论操作系统可能听起来很奇怪......但您不必认为FreeRTOS是Windows,Linux或MacOS等操作系统。嵌入式操作系统提供的主要功能(由于其内部调度程序)是多任务处理,即能够并行运行不同任务。我们知道微处理器内核可以一次执行一条指令:由于调度程序在其任务之间快速切换,似乎不同的应用程序同时运行。

esp-flash05

(FreeRTOS中不同的任务状态)

实时操作系统的设计是为了确保任务调度是确定性的:您可以预测其调度程序的行为。 FreeRTOS允许开发人员为每个任务定义优先级:调度程序使用优先级值来定义不同任务的执行模式。

Our first program

我们来编写我们的第一个使用esp-idf框架的程序。这个程序在我的Github仓库中可用,将成为所有下一个教程的基础。

首先,我们必须包含一些库:

esp-flash07

stdio.h库(Standard I / O)用于输入/输出函数(printf ...),两个freertos头文件用于定义和执行不同的任务。

每个程序都从app_main()开始执行:

esp-flash08

在app_main()中,使用xTaskCreate方法创建一个新任务。此方法需要以下参数:指向包含任务代码的函数(&loop_task)的指针,任务名称(“loop_task”),要分配给任务的堆栈内存大小(以字为单位) ,任务的附加参数(NULL),任务的优先级(5)和指针 - 可选 - 来检索任务的处理程序(NULL)。

一旦创建任务,FreeRTOS调度程序将根据不同的任务和优先级执行任务。

该任务具有以下代码:

esp-flash09

这是一个连续的循环,每秒打印一个句子Hello World!“。 vTaskDelay方法将任务暂停指定的刻度数。 portTICK_RATE_MS常量定义一个刻度的持续时间(以毫秒为单位);如果你因此将1000分为这个常数,你会在一秒钟内得到滴答的数量。

Additional files

为了能够编译你的项目,你需要添加一些额外的文件:

  • a Makefile in the main folder of your project that contains the name of the project and an include for the main makefile of the framework:项目主文件夹中的Makefile,其中包含项目的名称和框架的主makefile的include:

esp-flash10

  • a component.mk file – it can be empty – in the folder where the source code is saved into to tell the compiler to process the files in that folder:一个component.mk文件 - 它可以是空的 - 在保存源代码的文件夹中告诉编译器处理该文件夹中的文件:

esp-flash11

Test

当程序准备就绪时,您可以按照上一篇文章中的说明编译并加载到主板上:

make
make flash

如果一切正常,当用串行仿真器连接到电路板时,应该看到:

esp-flash12

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

ESP-IDF库开发教程之(4)--FLASH、BootLoader和FreeRTOS 的相关文章

  • ESP32(MicroPython)四轮差速底盘遥控

    本项目主控改为ESP32 C3 沿用之前的L298N电机驱动 12 6v 18650电池组 LM7805降压模块的方案 电机改用1 19减速比的 使用130mm车轮 主要考虑越野用途 遥控方面 本项目使用HC 14模块 实测连接到电脑可以通
  • esp32添加头文件

    环境 linux idf vsode 前言 在按照官方教程安装完成后 虽然可以编译成功 但是有些函数找不到定义 而且强迫症看到波浪号也非常难受 方法 点击小灯泡 点击第一个选项 如下图所示 拉到底点击advanced settings 让v
  • 【ESP-Matter】matter协议学习笔记--以乐鑫方案为例

    matter协议学习笔记 以乐鑫方案为例 0 写在前边的话 1 matter 协议基本概念 2 设备间的本地自动化交互 2 1 同步控制的实例 2 2 异步通知 订阅 报告 3 桥接设备 4 thread 边界路由器 5 专业名词 0 写在
  • esp32-S3专题一:初识esp32

    初识esp32 S3 初识esp32 使用esp32 s3这款芯片开发接近一年了 分享一下开发中的一些经验和项目中的亮点 希望后人能从中借鉴到一些经验 一 优势和缺点 使用的是esp32 s3这款芯片 硬件上搭配300k的RAM的代码运行内
  • Arduino IDE编译烧写ESP32 CAM

    一 安装Arduino IED 到官网下载IDE 二 安装ESP32 工具 打开菜单 文件 首选项 在设置页 附加开发板管理器网址 添加 https dl espressif com dl package esp32 index json
  • Ubuntu20.04配置ESP32-IDFV5.1环境及Component工程样例

    更新Ubuntu20 04下载源 cd etc apt 更新sources list为如下下载源 并保存 添加阿里源 deb http mirrors aliyun com ubuntu focal main restricted univ
  • ESP32串口不断输出rst:0x10 (RTCWDT_RTC_RESET),boot:0x13(SPI_FAST_FLASH_BOOT)且按BOOT键进不了下载模式

    错误现象 rst 0x10 RTCWDT RTC RESET boot 0x13 SPI FAST FLASH BOOT flash read err 1000 ets main c 371 ets Jun 8 2016 00 22 57
  • micropython Esp32 外接LED使用Thonny ValueError: pin can only be input解决办法

    micropython Esp32 外接LED使用Thonny ValueError pin can only be input解决办法 1 连接方式如下图 注意一定要加电阻 2 通过输入以下代码 报错 ValueError pin can
  • 【ESP32】VSCode添加驱动文件

    1 创建文件夹并添加驱动文件 2 修改main文件夹下的 CMakeLists txt
  • ESP32使用Arduino发布和订阅MQTT

    该项目展示了如何在ESP32上使用MQTT通信协议来发布消息和订阅主题 举例来说 我们会将BME280传感器的读数发布到Node RED仪表板 并控制ESP32输出 我们将使用Arduino IDE对ESP32进行编程 介绍 在此示例中 有
  • ESP32连接阿里云MQTT

    ESP32连接阿里云的github链接 ESP32官网文档 可下载开发文档 文章目录 一 ESP32介绍 二 搭建ESP32开发环境 一 调出终端 二 代码补全 三 ESP32接入阿里云 一 编译项目 二 配置项目 三 烧录程序 四 配置四
  • 自制教学用ESP32开发板【ESP32_Py_Board】① 开发环境搭建

    摘要 由于教学需要 自己设计了一款ESP32开发板 用于 短距离无线通信 课堂教学使用 开发板整体效果如下图 该开发板采用Type C接口供电 板载CH340K串口芯片 支持自动下载 240 240全彩SPI接口显示屏 温度传感器DS18B
  • 全网最简洁的mpy-cross教程

    大家知道我一向精干 不喜欢搞花儿的 如果去mpy官网看mpy cross的相关资料 估计又得绕蒙 跟我来 保证你三分钟学会 但是本文不涉及原理 第一 mpy cross是干嘛滴 答 把py文件转成mpy系统读的mpy文件 术语咱不懂 叫交叉
  • ESP32(Micro Python) LVGL 传感器数值显示

    本程序用于显示SR04超声波传感器和BMP280气压温度传感器的读数 由于高度数值类型不符合要求 BMP280改为显示气压和温度值 气压值分两部分显示 分别为千帕值 100 避免超出表盘显示范围 和千帕值的两位小数 由于标签不能显示动态数值
  • 【ESP-IDF】2.ESP32C3移植u8g2显示库驱动OLED

    前言 这个系列的文章属于是为了一碟醋包了一顿饺子系列 起因是看到tb上某家店的ESP32C3开发板才9 9包邮 想着研究一下 把手头有个用Arduino UNO实现的项目升级一下 于是就有了这个系列 ESP32C3的简介 2020 年末 乐
  • ESP32-cam 初体验 从esp32-cam的购买到局域网监控的实现

    ESP32 cam小项目 helloworld项目 前言 手头有一块esp32 cam闲置很久了 因为比赛和找工作的事情导致许欸小延期了很久 还是因为懒 最近从小仓库把板子捞出来了 上手玩一玩 本次学习参考了B站up 小铭同学 的教程 教程
  • cmake中的编译选项

    CMake是一个跨平台的构建系统 它可以根据简单的配置文件生成各种平台的构建工具 例如Makefile Visual Studio项目文件等 CMake使用CMakeLists txt文件来描述项目的构建规则和依赖关系 在这个文件中 可以设
  • 小白也能快速学会的Micropython编译指南

    小白也能快速学会的Micropython编译指南 大家好 我是CSDN上的 上坂龍二 哦 今天给大家带来的是 如何快速一次成功地将Micropython和自己喜欢的模块编译进自己的Esp32固件中哦 事前准备 Python python的环
  • ESP32 httpd:标头字段太长,服务器无法解释

    我想流式传输到 Android 应用程序内的 WebView 我的代码是 WebView cam WebView findViewById R id Cam cam getSettings setLoadWithOverviewMode t
  • ESP32 上的 Web 服务器:如何自动更新和显示来自服务器的传感器值?

    我在 ESP32 上有一个网络服务器 在该服务器上有一个主页 我想每隔 x 秒自动更新主页上的传感器值 无需用户输入 我无法访问文件系统 该传感器直接连接到 ESP32 传感器值位于我的 C 程序中 存储在变量中并定期更新 变量是全局的 以

随机推荐

  • 卷积神经网络CNN小结(简单实现代码mnist数据集)

    由于全连接神经网络处理图像中的需要训练参数过多的问题 而卷积神经网络中 卷积层的神经元只与前一层的部分 神经元节点相连 既它的神经元的连接是非全连接的 且同一层某些神经元之间的连接的权重w和偏移b是共享的 这样大量减少了训练参数的数量 图1
  • 多线程事务怎么回滚?说用 @Transactional 可以回去等通知了!

    背景介绍 1 最近有一个大数据量插入的操作入库的业务场景 需要先做一些其他修改操作 然后在执行插入操作 由于插入数据可能会很多 用到多线程去拆分数据并行处理来提高响应时间 如果有一个线程执行失败 则全部回滚 2 在spring中可以使用 T
  • C++day4(关系运算符的重载)

    关系运算符重载的作用 可以让两个自定义类型对象进行对比操作 代码实现关系运算符的重载 include
  • unity工程崩溃资源找回

    1 Unity死机未保存场景 当你在Unity中编辑场景 突然死机时 可以在项目文件目录中找到Temp文件夹 双击文件夹 找到 Backupscenes文件夹 把后缀为 backup的文件后缀改为 unity 然后拖进Unity的Proje
  • 2021-05-03

    一 R中安装 phyloseq 的方法 很多网上的教程使用的都是 source https bioconductor org biocLite R biocLite phyloseq 但是我尝试了很多次 最后还是没有成功 下面能成功安装 p
  • 连接Mysql出现Connection unexpectedly closed

    Mysql 版本 5 7 问题 本地服务可以正常连接MySQL 在服务器部署后连接出错 服务器日志 dev miku r2dbc mysql client MySqlConnectionClosedException Connection
  • IDEA2021从零开始搭建SSM框架手把手详细教程 (一)

    开发环境 macos IDEA 2021 mysql8 0 toma9 0 源码 https download csdn net download a2267542848 19730797 1 基本环境搭建 1 新建工程 新建后整个目录如下
  • nodejs的安装与配置

    NodeJs安装与配置 之前一直在网上自己找教程装 但是经常出问题 索性自己总结一个 1 安装nodejs 去网址 https nodejs org zh cn download msi和 zip msi是Windows installer
  • 物联锁项目失败原因分析

    一 背景 2022年3月份接手IM024物联锁项目救火 此项目主要用于医院共享轮椅 共享病床 此项目是从2021年初开始立项开发 投入了大量的人力物力 但是在2022年3月份时产品工作仍然不稳定 此项目基本上可以判定为一个失败的典型 为了吸
  • 在linux下jdk安装和建立Hadoop集群的过程实验报告(搭建Hadoop集群)。

    1 模板虚拟机环境准备 相关视频 半小时快速搭建Hadoop集群 哔哩哔哩 bilibilihttps www bilibili com video BV1x5411177Y spm id from 333 880 my history p
  • (pinia-plugin-persistedstate)pinia 持久化存储

    背景 我们使用pinia的时候 会遇到页面刷新的时候数据丢失 我们自己解决的话 就是在页面刷新之前将数据存储到本地 然后在页面打开的时候将数据从本地读出来 实现数据持久化 所以我们可以通过插件来直接帮我们完成这个操作来实现自动化存储 学习p
  • Qt QTextEdit 自动滚动内容/移动光标到最后一行

    QTextEdit往文本后添加内容超出视图 并不会自动滚动到最后 需要添加以下代码 ui gt StatustextEdit gt insertPlainText text 光标后添加文本 ui gt StatustextEdit gt m
  • STM32项目--基于STM32的办公室安保(智能家居)系统设计

    基于嵌入式系统的办公室安保系统设计 简介 设计一套基于STM32的办公室安防系统 系统内部包括门禁系统 灾害报警系统 人脸识别系统和交互中心四个子系统 门禁系统 主要实现对门禁卡的存储和读取并识别已存储卡片的信息并控制开门 如读取卡片为未存
  • px_em_rem

    px em rem px px是固定的像素 一旦设置了就无法因为适应页面大小而改变 em和rem em和rem相对于px更具有灵活性 他们是相对长度单位 意思是长度不是定死了的 更适用于响应式布局 就是说当父元素大小发生变化 相应的字体大小
  • (2021)Top5 免费视频编辑软件,视频剪辑必备工具

    全球排名前5的免费视频剪辑软件 Top5 VideoPad https www nchsoftware com videopad 免费版 和 付费版 Top4 VSDC http www videosoftdev com 免费版 和 付费版
  • 集群环境下Redis分布式锁

    一 前言 在上一篇文章中 已经介绍了基于Redis实现分布式锁的正确姿势 但是上篇文章存在一定的缺陷 它加锁只作用在一个Redis节点上 如果通过sentinel保证高可用 如果master节点由于某些原因发生了主从切换 那么就会出现锁丢失
  • 【IMGUI】 各种辅助类 EditorGUIUtility、EditorUtility、GUIUtility、GUILayoutUtility

    EditorGUIUtility class in Editor 继承自 GUIUtility EditorGUI 的各种辅助程序 EditorGUIUtility currentViewWidth 我尝试打印了下这个值和position
  • 网页验证码破解、使用cookie登录

    十二周内容笔记 day34 01 芝麻代理作业 主要是练习了一下显式等待 写起来还是比较麻烦 但是还挺好用 from selenium import webdriver from selenium webdriver chrome serv
  • 最新年龄估计综述(Deep learning approach for facial age classification: a survey of the state of the art)

    目录 TOC 文章目录 一 常用数据集 二 常用的年龄识别方法 1 多分类 MC 2 度量回归 metric regression MR 3 排序 ranking 4 深度标签分布学习 deep label distribution lea
  • ESP-IDF库开发教程之(4)--FLASH、BootLoader和FreeRTOS

    在之前的文章中 我描述了新的esp32芯片 并解释了如何设置开发环境 包括使用一种可选的图形IDE Eclipse 在开始开发程序之前 您需要了解框架的三个关键组件 flash bootloader和FreeRTOS操作系统 但别担心 在本