当前位置: 代码迷 >> 综合 >> ESP32 上应用启动流程中各阶段所需的时间测试及优化
  详细解决方案

ESP32 上应用启动流程中各阶段所需的时间测试及优化

热度:121   发布时间:2023-09-05 19:14:45.0

1. 测试前的准备

在这次测试中,我们使用了 ESP32-WROOM-32D开发板 进行测试,在安装了对应的 esp-idf工具链 后使用 esp-idf 里的 softAP 进行测试,测试工具使用了 Tektronix MDO3104 示波器 。


2. 测试过程

在这一节中,我们将测试过程需要的操作进行详细说明。

  • 1. 工具链的安装

    在进行测试之前,我们需要安装工具链。工具链的详细安装步骤可以在 ESP-IDF Programming Guide 找到, 这里与不多加以描述。

    注: esp-idf 使用 esp-iot-solution 同一套工具链, 所以如果你的平台上能够编译 esp-iot-solution 中的 example , 则工具链无须重复安装。

  • 2. 测试代码下载

    在工具链安装完成之后,我们接下来需要下载完整的 esp-idf 工程, 推荐使用如下指令:

    $ git clone https://github.com/espressif/esp-idf.git
    $ cd esp-idf
    $ git submodule update --init --recursive
    

    更新 submodule 时可能需要几分钟的时间, 如果本地已经有 esp-idf 仓库, 请及时更新到最新版本。

  • 3. 测试代码编译及下载

    在 esp-idf 文件夹里放置了很多示例工程, 一般是放在 esp-idf/examples 目录下. 所有代码编译方式都基本相同, 这里以 SoftAP 为示例( SoftAP 代码放在了 esp-idf/examples/wifi/getting_started/softAP 目录下)。

    • 1 工程配置
    $ make menuconfig
    

    menuconfig-->Serial flasher config 中修改串口号和波特率。

    • 2 代码编译
    $ cd esp-idf/examples/wifi/getting_started/softAP
    $ make 
    
    • 3 固件烧写

    代码编译通过后, 将编译生成的 .bin 文件烧写到开发板上。 首先将 GPIO0 拉低, 然后按下复位键让芯片进入下载模式. 同时我们可以通过 monitor 来打开串口监视。执行指令:

    $ make flash monitor
    

    注:波特率太高, 可能会下载失败, 太低则烧写过程缓慢. 一般可以配置成 921600


3. 测试结果及优化

1. 测试项一:未进行任何优化

在这一小节,我们直接按上述过程进行了编译下载,然后通过示波器观察测试结果。

测试说明 : 用示波器抓取系统从上电到进入 app_main 函数里进行 AP 连接这段时间内, ESP32 的供电电流变化波形图。 测试前已经确定与接收设备能够正常通信。

电流波形图如下:

  • stage1
  • stage2
ESP32 上应用启动流程中各阶段所需的时间测试及优化
  • stage3
ESP32 上应用启动流程中各阶段所需的时间测试及优化

根据供电电流的波动,可以将整个过程分为以下几个阶段

  • stage1 : 系统上电后的 stage1 阶段运行 romcode,这个过程持续时间约为 40 ms。

  • stage2 :2th bootloader 阶段, 从用示波器抓取的 Flash 时钟引脚上的信号发现, esp32 会在该阶段读取 flash 上的数据并运行 bootloader 第二阶段的代码, 最后跳转到用户程序,这个过程持续时间约为 426 ms。

  • stage3 : 此阶段会运行用户代码, 该过程电流波动较大, 该阶段完成 AP 连接。这个过程所花费总时间为 160 ms。

整个过程持续时间约为 626 ms。

未做优化的测试数据 :

stage duration
stage1 40 ms
stage2 426 ms
stage3 160 ms

2. 测试项二:关闭 RF 校验

在这一小节,我们将 esp-idf/components/esptool_py/esptool/esptool.py 中的 class ESP32FirmwareImage(BaseFirmwareImage): 中的 self.append_digest = True 改成 self.append_digest = False 按上述过程进行了编译下载,然后通过示波器观察测试结果。

整个测试过程抓取的波形如图所示

  • stage1
ESP32 上应用启动流程中各阶段所需的时间测试及优化
  • stage2
ESP32 上应用启动流程中各阶段所需的时间测试及优化
  • stage3
ESP32 上应用启动流程中各阶段所需的时间测试及优化

关闭 RF 校正后, 对 step1 和 step3 基本没有影响, 但 step2 阶段时间减少了约 88 ms。

stage duration
stage1 40 ms
stage2 338ms
stage3 160ms

3. 测试项三:关闭 RF 校正与 bootloader 阶段串口打印

此项优化是在关闭 RF 校正的基础上关闭 bootloader 阶段的串口打印.具体关闭串口打印的步骤是:

  1. 在终端中输入 make menuconfig 进入配置界面
  2. 进入 Bootloader config界面
  3. Bootloader log verbosity目前设置的 info 改成 no output

优化后的电流波形图如图所示:

  • stage1
ESP32 上应用启动流程中各阶段所需的时间测试及优化
  • stage2
ESP32 上应用启动流程中各阶段所需的时间测试及优化
  • stage3
ESP32 上应用启动流程中各阶段所需的时间测试及优化

关串口打印使整个过程耗费时间又减少约 100 ms。

关 RF 校正, 关串口打印后的测试数据

stage duration
stage1 30 ms
stage2 240 ms
stage3 168 ms

4. 总结

经过以上两步优化,花费的时间减少 188 ms。其中关串口打印能够有效降低系统的功耗。