esp32 的IDF本质上就是FreeRTOS,默认使用(arduino也可以直接使用rtos相关代码)

安装esp-idf,多数情况下需要先下载安装vscode,然后再插件搜索esp-idf,默认选择express并安装最新版即可

安装后,在左侧的Advance选择新项目向导

image-20260405233133797

然后在上方选择你的当前用的esp-idf版本

然后你会看到

image-20260405233248590

选择get-started->helloworld然后创建项目

image-20260405233337828

如下配置

ProjectName是你的项目名字,也就是你文件夹的名字

下面的那个是文件路径,推荐找个好记住的

Esp-IDF board 是你的板子,根据你板子选择,本次选择esp32-s3

端口一般默认不选择,因为你就连接一台足够了,多台后面再底部有个port可以选择

image-20260405233400245

然后创建项目

让我们分析代码结构
image-20260405234001193

main是你主要代码目录,那里存放主代码,今后操作也主要在这里进行

让我们打开main文件里面的main.c

/*
 * SPDX-FileCopyrightText: 2010-2022 Espressif Systems (Shanghai) CO LTD
 *
 * SPDX-License-Identifier: CC0-1.0
 */

#include <stdio.h>
#include <inttypes.h>
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_chip_info.h"
#include "esp_flash.h"
#include "esp_system.h"

void app_main(void)
{
    printf("Hello world!\n");

    /* Print chip information */
    esp_chip_info_t chip_info;
    uint32_t flash_size;
    esp_chip_info(&chip_info);
    printf("This is %s chip with %d CPU core(s), %s%s%s%s, ",
           CONFIG_IDF_TARGET,
           chip_info.cores,
           (chip_info.features & CHIP_FEATURE_WIFI_BGN) ? "WiFi/" : "",
           (chip_info.features & CHIP_FEATURE_BT) ? "BT" : "",
           (chip_info.features & CHIP_FEATURE_BLE) ? "BLE" : "",
           (chip_info.features & CHIP_FEATURE_IEEE802154) ? ", 802.15.4 (Zigbee/Thread)" : "");

    unsigned major_rev = chip_info.revision / 100;
    unsigned minor_rev = chip_info.revision % 100;
    printf("silicon revision v%d.%d, ", major_rev, minor_rev);
    if(esp_flash_get_size(NULL, &flash_size) != ESP_OK) {
        printf("Get flash size failed");
        return;
    }

    printf("%" PRIu32 "MB %s flash\n", flash_size / (uint32_t)(1024 * 1024),
           (chip_info.features & CHIP_FEATURE_EMB_FLASH) ? "embedded" : "external");

    printf("Minimum free heap size: %" PRIu32 " bytes\n", esp_get_minimum_free_heap_size());

    for (int i = 10; i >= 0; i--) {
        printf("Restarting in %d seconds...\n", i);
        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }
    printf("Restarting now.\n");
    fflush(stdout);
    esp_restart();
}

这是个c语言,编译型语言,学过的很熟悉很正常

include <stdio.h>

include <inttypes.h>

include "sdkconfig.h"

include "freertos/FreeRTOS.h"

include "freertos/task.h"

include "esp_chip_info.h"

include "esp_flash.h"

include "esp_system.h"

这几个头文件目前使用频率很高,日后注意

我们可以把这段代码分为四个部分来拆解:


1. 头文件与入口函数

#include "freertos/FreeRTOS.h" // FreeRTOS 基础库
#include "freertos/task.h"     // 任务相关 API(如 vTaskDelay)
#include "esp_system.h"        // 系统基础 API(如 esp_restart)
// ... 其他硬件信息查询相关的头文件

void app_main(void) { ... }
  • app_main: 这是 ESP-IDF 的程序入口点。不同于标准 C 语言的 main,在 ESP32 中,系统启动后会自动创建一个名为 main 的 FreeRTOS 任务并运行这个函数。

2. 获取芯片核心信息

代码通过 esp_chip_info_t 结构体来读取硬件参数:

esp_chip_info_t chip_info;
esp_chip_info(&chip_info); // 将硬件信息填充到结构体中

接下来是一连串的 printf,利用位运算(&)判断芯片支持的功能:

  • CONFIG_IDF_TARGET: 这是一个宏,在编译时由工具链确定(对于你来说就是 "esp32s3")。
  • CHIP_FEATURE_WIFI_BGN: 判断是否支持 Wi-Fi。
  • chip_info.revision: 获取芯片的硬件版本(Silicon Revision)。

3. 读取存储与内存

esp_flash_get_size(NULL, &flash_size); // 获取 Flash 容量
esp_get_minimum_free_heap_size();       // 获取历史最小剩余堆内存
  • Flash 大小: 这里计算出的结果通常是 4MB、8MB 或 16MB。
  • Heap Size: 堆内存大小对于排查程序是否“内存泄漏”至关重要。minimum_free_heap 告诉你在程序运行过程中,内存最紧张的时候还剩多少。

4. FreeRTOS 延时与重启

这是代码的最后一部分,展示了如何让系统“动起来”:

for (int i = 10; i >= 0; i--) {
    printf("Restarting in %d seconds...\n", i);
    vTaskDelay(1000 / portTICK_PERIOD_MS); // 关键点!
}
esp_restart(); // 软件重启
  • vTaskDelay: 这不是简单的忙等待(Sleep),它是 FreeRTOS 的阻塞延时。

    • 1000 / portTICK_PERIOD_MS 的意思是:将 1000 毫秒转换为系统的 Tick(时钟节拍)
    • 在延时期间,CPU 会让出执行权去处理其他后台任务(如 Wi-Fi 协议栈)。
  • esp_restart(): 触发软件复位,芯片会重新从 app_main 开始执行。

idf_component_register(SRCS "hello_world_main.c"

PRIV_REQUIRES

spi_flash

INCLUDE_DIRS "")

这个是CMakeLists.txt 后面添加文件,选择依赖都得靠他

然后看下面

image-20260405235214331

那个扳手是编译,闪电是写入,插头是选端口号设备

让我们先编译

先说一句,esp-idf的编译如果修改了依赖,要全量编译的,也就是清空了从头来,但是如果只是修改点东西,那也就是部分编译,很快的

image-20260405235504571

看到这个说明编译成功了
烧录设备也很简单,目前的开发板一经检测写入自动冷重启,无需你操作

然后就能看到

ESP-ROM:esp32s3-20210327
Build:Mar 27 2021
rst:0x1 (POWERON),boot:0x8 (SPI_FAST_FLASH_BOOT)
SPIWP:0xee
mode:DIO, clock div:1
load:0x3fce3808,len:0x370
load:0x403c9700,len:0x900
load:0x403cc700,len:0x2364
entry 0x403c98ac
I (14) cpu_start: Multicore app
I (11) cpu_start: GPIO 44 and 43 are used as console UART I/O pins
I (13) cpu_start: Pro cpu start user code
I (14) cpu_start: cpu freq: 160000000 Hz
I (14) app_init: Application information:
I (17) app_init: Project name:     hello_world
I (21) app_init: App version:      1
I (24) app_init: Compile time:     Apr  5 2026 23:54:20
I (29) app_init: ELF file SHA256:  000000000...
I (34) app_init: ESP-IDF:          v5.5.2
I (37) efuse_init: Min chip rev:     v0.0
I (41) efuse_init: Max chip rev:     v0.99 
I (45) efuse_init: Chip rev:         v0.0
I (49) heap_init: Initializing. RAM available for dynamic allocation:
I (56) heap_init: At 3FC95108 len 00054608 (337 KiB): RAM
I (60) heap_init: At 3FCE9710 len 00005724 (21 KiB): RAM
I (65) heap_init: At 3FCF0000 len 00008000 (32 KiB): DRAM
I (70) heap_init: At 600FE000 len 00001FE8 (7 KiB): RTCRAM
I (76) spi_flash: detected chip: gd
I (79) spi_flash: flash io: dio
I (82) sleep_gpio: Configure to isolate all GPIO pins in sleep state
I (89) sleep_gpio: Enable automatic switching of GPIO sleep configuration
I (96) main_task: Started on CPU0
I (106) main_task: Calling app_main()
Hello world!
This is esp32s3 chip with 2 CPU core(s), WiFi/BLE, silicon revision v0.0, 4MB external flash
Minimum free heap size: 392752 bytes
Restarting in 10 seconds...
Restarting in 9 seconds...
Restarting in 8 seconds...
Restarting in 7 seconds...
Restarting in 6 seconds...
Restarting in 5 seconds...
Restarting in 4 seconds...
Restarting in 3 seconds...
Restarting in 2 seconds...
Restarting in 1 seconds...
Restarting in 0 seconds...
Restarting now.

你的第一个esp32固件就这么编译成功了

最后修改:2026 年 04 月 06 日
如果觉得我的文章对你有用,请随意赞赏