您当前的位置: 首页 > 

lu-ming.xyz

暂无认证

  • 0浏览

    0关注

    115博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

esp32系列(2):工程结构学习,从新建工程到烧写程序

lu-ming.xyz 发布时间:2022-02-11 16:31:27 ,浏览量:0

ESP32学习记录:

  1. esp32系列(1):Hello world, 初识esp32 搭建VScode下的esp32开发环境,hello esp32。
  2. esp32系列(2):工程结构学习,从新建工程到烧写程序 熟悉工程的文件结构,各文件的含义,编译流程。以及VScode的具体操作。
  3. esp32系列(3):GPIO学习(以简单GPIO输入输出、ADC、DAC为例) 学习ESP32 GPIO与外设的几种输入输出方式,通过两个简单的例子学习简单GPIO与RTC GPIO输入输出的代码实现。

目录
  • 1 基本概念
    • 1.1 ESP-IDF 项目相关基本概念
    • 1.2 其他相关概念
  • 2 怎么构建一个项目?
    • 2.1 idf.py 命令行工具
    • 2.2 新建工程
      • 2.2.1 新建工程的文件结构
      • 2.2.2 各文件含义
      • 2.2.3 添加代码
    • 2.3 构建项目
      • 2.3.1 构建过程
  • 3 烧写过程

1 基本概念 1.1 ESP-IDF 项目相关基本概念

一个 ESP-IDF 项目可以看作是多个不同组件的集合。

  • 项目:特指一个目录,其中包含了构建可执行应用程序所需的全部文件和配置,以及其他支持型文件,例如分区表、数据/文件系统分区和引导程序。
  • 项目配置:保存在项目根目录下名为 sdkconfig 的文件中,可以通过 idf.py menuconfig 进行修改,且一个项目只能包含一个项目配置。
  • 应用程序:是由 ESP-IDF 构建得到的可执行文件。一个项目通常会构建两个应用程序:项目应用程序(可执行的主文件,即用户自定义的固件)和引导程序(启动并初始化项目应用程序)。
  • 组件:是模块化且独立的代码,会被编译成静态库(.a 文件)并链接到应用程序。部分组件由 ESP-IDF 官方提供,其他组件则来源于其它开源项目。
  • 目标:特指运行构建后应用程序的硬件设备。ESP-IDF 当前仅支持 esp32 和 esp32s2 以及 esp32c3 这三个硬件目标。 注意:
  • ESP-IDF 并不是项目的一部分,它独立于项目,通过 IDF_PATH 环境变量(保存 esp-idf 目录的路径)链接到项目,从而将 IDF 框架与项目分离。
  • 交叉编译工具链并不是项目的组成部分,它应该被安装在系统 PATH 环境变量中。
1.2 其他相关概念
  • Ninja: 构建工具 Ninja 是一个专注于速度的小型构建系统。它将文件的相互依赖关系(通常是源代码和输出可执行文件)作为输入,并快速编排构建它们。一般在Unix/Linux上的程序通过make/makefile来构建编译,而Ninja通过将编译任务并行组织,大大提高了构建速度。
2 怎么构建一个项目? 2.1 idf.py 命令行工具

提供了一个前端,可以帮助管理项目的构建过程,它管理了以下工具:

  • CMake,配置待构建的项目
  • Ninja 或 GNU Make,命令行构建工具
  • esptool.py,烧录目标硬件设备

在之前的hello world学习中,已经使用idf.py完成了hello world的编译与测试。

可以使用idf.py --help查看帮助文档。这里要注意使用安装ESP-IDF之后的工具ESP-IDF 4.4 CMDESP-IDF 4.4 Powershell打开的控制台才有用,因为这两个工具打开的时候会设置好CMD的环境变量。 在这里插入图片描述

如果要在当前CMD中配置环境变量,需要执行[Espressif安装路径]\frameworks\esp-idf-v4.4\export.bat命令。

idf.py 工具的常用命令:

  • idf.py set-target :设置构建项目的目标(芯片)。
  • idf.py menuconfig:运行 menuconfig 工具来配置项目。
  • idf.py build:构建在当前目录下找到的项目。构建过程是增量式的,如果自上次构建以来源文件或项目配置没有发生改变,则不会执行任何操作。主要步骤
    • 1 根据需要创建 build 构建目录,它用于保存构建过程的输出文件,可以使用 -B 选项修改默认的构建目录。
    • 2 根据需要运行 CMake 来配置项目,为主构建工具生成构建文件。
    • 3 运行主构建工具(Ninja 或 GNU Make)。默认情况下,构建工具会被自动检测,可以使用 -G 选项显式地指定构建工具。
  • idf.py clean:把构建输出的文件从构建目录中删除,从而清理整个项目。下次构建时会强制“重新完整构建”这个项目。清理时,不会删除 CMake 配置输出及其他文件。
  • idf.py fullclean:会将整个 build 目录下的内容全部删除,包括所有 CMake 的配置输出文件。下次构建项目时,CMake 会从头开始配置项目。请注意,该命令会递归删除构建目录下的 所有文件,请谨慎使用。项目配置文件不会被删除。
  • idf.py flash:会在必要时自动构建项目,并将生成的二进制程序烧录进目标 ESP32 设备中。-p 和 -b 选项可分别设置串口的设备名和烧录时的波特率。
  • idf.py monitor:用于显示目标 ESP32 设备的串口输出。-p 选项可用于设置主机端串口的设备名,按下 Ctrl-] 可退出监视器。

多个 idf.py 命令可合并成一个,例如,idf.py -p COM4 clean flash monitor 会依次清理源码树,构建项目,烧录进目标 ESP32 设备,最后运行串口监视器。

环境变量 ESPPORT 和 ESPBAUD 可分别用来设置 -p 和 -b 选项的默认值。在命令行中,重新为这两个选项赋值,会覆盖其默认值。

2.2 新建工程

官方文档是叫项目,我习惯叫工程,说明一下,以下的工程=项目,project。

命令:idf.py create-project 例子:idf.py create-project template_prj在当前路径创建名为template_prj的工程,–path选项可以指定路径。 在这里插入图片描述

2.2.1 新建工程的文件结构

创建的工程就是[IDF_PATH]\examples\get-started\sample_project中的模板工程。 文件结构:

[工程路径]\template_prj
├── CMakeLists.txt
└── main
    ├── CMakeLists.txt
    └── template_prj.c

这个是最简单的工程,完整的工程的目录树结构可能为:

myProject/
├── CMakeLists.txt
├── sdkconfig
├── components/ 
│       ├── component1/ 
│       │   ├── CMakeLists.txt
│       │   ├── Kconfig
│       │   └── src1.c
│       └── component2/ 
│           ├── CMakeLists.txt
│           ├── Kconfig
│           └── src1.c
│           └── include/ 
│               └── component2.h
├── main/       
│   ├── CMakeLists.txt
│   ├── src1.c
│   └── src2.c
│
└── build/
2.2.2 各文件含义
  • CMakeLists.txt 每个项目都有一个顶层 CMakeLists.txt 文件,包含整个项目的构建设置。 为了让cmake正常工作,项目的cmakelist中必须有以下三行代码:
    cmake_minimum_required(VERSION 3.5) # 必须放在 CMakeLists.txt 文件的第一行,它会告诉 CMake 构建该项目所需要的最小版本号。ESP-IDF 支持 CMake 3.5 或更高的版本。
    
    include($ENV{IDF_PATH}/tools/cmake/project.cmake) # 导入 CMake 的其余功能来完成配置项目、检索组件等任务。
    project(template_prj) # 创建项目本身,并指定项目名称。该名称会作为最终输出的二进制文件的名字,即 template_prj.elf 和 template_prj.bin。每个 CMakeLists 文件只能定义一个项目。
    
  • sdkconfig 项目配置文件,执行 idf.py menuconfig 时会创建或更新此文件,文件中保存了项目中所有组件(包括 ESP-IDF 本身)的配置信息。 sdkconfig 文件可能会也可能不会被添加到项目的源码管理系统中。
  • components(option) 可选的 “components” 目录中包含了项目的部分自定义组件,并不是每个项目都需要这种自定义组件,但它有助于构建可复用的代码或者导入第三方(不属于 ESP-IDF)的组件。或者,您也可以在顶层 CMakeLists.txt 中设置 EXTRA_COMPONENT_DIRS 变量以查找其他指定位置处的组件。如果项目中源文件较多,建议将其归于组件中,而不是全部放在 “main” 中。
  • main目录 目录是一个特殊的组件,它包含项目本身的源代码。”main” 是默认名称,CMake 变量 COMPONENT_DIRS 默认包含此组件,但您可以修改此变量。
  • build目录 存放构建输出的地方,如果没有此目录,idf.py 会自动创建。CMake 会配置项目,并在此目录下生成临时的构建文件。随后,在主构建进程的运行期间,该目录还会保存临时目标文件、库文件以及最终输出的二进制文件。此目录通常不会添加到项目的源码管理系统中,也不会随项目源码一同发布。

每个组件目录都包含一个 CMakeLists.txt 文件,里面会定义一些变量以控制该组件的构建过程,以及其与整个项目的集成。

每个组件还可以包含一个 Kconfig 文件,它用于定义 menuconfig 时展示的 组件配置 选项。某些组件可能还会包含 Kconfig.projbuild 和 project_include.cmake 特殊文件,它们用于 覆盖项目的部分设置。

2.2.3 添加代码

打开工程下main/template_prj.c,可以看到程序入口函数app_main,添加代码如下:

#include 
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"

void app_main(void)
{
    while (1)
    {
        printf("Hello world!\n");
        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }
    
}

功能为:每隔1s在监视器中输出”Hello world!“ 可以看到,此时因为没有为VScode指定头文件路径,所以显示找不到源文件。 在这里插入图片描述

解决:VScode 快捷键:ctrl+shift+P,运行C/C++:Edit Configurations (JSON)添加ESP-IDF路径。这样就可以很方便的查看源文件。 在这里插入图片描述

在这里插入图片描述

2.3 构建项目 2.3.1 构建过程

经过之前的学习可以知道,执行idf.py build命令或者点击VScode图形界面,可以完成项目的构建。

执行idf.py build命令等效于执行了如下命令:

mkdir -p build
cd build
cmake .. -G Ninja   # 或者 'Unix Makefiles'
ninja

在这里插入图片描述

cmake 命令对项目进行配置,并生成用于最终构建工具的构建文件。在这个例子中,最终构建工具是 Ninja: 运行 ninja 来构建项目。所以也可以直接通过CMake来构建工程。

3 烧写过程

烧写之前,可以通过Vscode图形化界面或者idf.py命令工具来完成串口号的设置。

  • Vscode图形化界面 在这里插入图片描述

  • idf.py命令工具 idf.py -p COM3 -b 460800 flash

同样的,烧写的过程也可以使用 Ninja 或者 Make 来完成。 命令:ninja flashmake app-flash

以这种方式烧录时,可以通过设置 ESPPORT 和 ESPBAUD 环境变量来指定串口设备和波特率。

演示: 在这里插入图片描述

关注
打赏
1655639048
查看更多评论
立即登录/注册

微信扫码登录

0.0410s