2020 年末,乐鑫推出安全、低功耗、低成本的 RISC-V MCU ESP32-C3,支持 2.4 GHz Wi-Fi 和 Bluetooth 5 (LE),广受用户关注。目前,ESP32-C3 已进入稳定量产.
对于已使用 ESP32 实现 Wi-Fi 和/或低功耗蓝牙连接功能的用户,ESP32-C3 是一个不错的升级选择。那么,我们先从这个角度对比一下 ESP32 和 ESP32-C3 的性能:
ESP32 和 ESP32-C3 性能对比
使用过 ESP32 的用户可能会问:ESP32-C3 只有 400 KB SRAM,如何跟 ESP32 的 520 KB SRAM 空间比?毕竟大部分情况下可用内存空间是开发嵌入式应用的一大重要因素。其实,ESP32-C3 可提供与 ESP32 同等或更多的剩余内存空间。本文中,我们将简单介绍 ESP32-C3 是如何改进存储空间管理的,并向大家展示与 ESP32 相比,ESP32-C3 如何为各种应用提供同等或更多的剩余内存空间。
内存子系统的改进和优化
动态 IRAM-DRAM 分区
ESP32 存储映射
ESP32-C3 存储映射
上面两张图分别展示了 ESP32 和 ESP32-C3 的存储映射方式。如图所示,ESP32 为静态 IRAM-DRAM 分区,整个 SRAM 中 192 KB 用于 IRAM,剩余 328 KB 用于 DRAM。部分 IRAM(32 KB 或 64 KB)配置为 cache 专用。链接器脚本会将因为功能或性能原因不能放入 flash 中的代码,填充到 IRAM 中。除此之外,未使用的 IRAM 空间将被闲置。
在 ESP32-C3 中,没有对 IRAM 和 DRAM 进行静态划分。SRAM 的前 16 KB 被配置为 cache 专用。与 ESP32 不同的是,ESP32-C3 的 IRAM 和 DRAM 地址在相同方向递增。基于应用需求,链接器脚本可将所需的空间配置为 IRAM,其后便为 DRAM 空间。因此相比 ESP32 来说,ESP32-C3 的存储空间使用效率更高。
减少 IRAM 占用
相比 ESP32,ESP32-C3 基于下述改进减少了对 IRAM 空间的占用:
- ESP32 的 IRAM 被积累了一段时间的 ROM 补丁占用,在 ESP32-C3 中,这些补丁被置于 ROM 中,从而释放了 IRAM 的空间。
- 在充分确认相关代码的稳定性后,一些额外的通信栈相关功能也被置于 ROM 中。
提升蓝牙存储管理
ESP32 的蓝牙子系统需要占用 DRAM 中某一固定位置的连续存储空间(双模式为 56 KB,低功耗蓝牙为 38 KB)。如果某个应用要使用蓝牙功能,但并不需要连续使用,这便是一个相当大的缺陷。此时,即使蓝牙功能未被使用,这些空间依然是占用状态。
ESP32-C3 的蓝牙子系统不要求其存储必须为某固定位置的连续空间。反之,它使用标准的系统堆来分配存储空间,因此应用可以在需要的时候打开或禁用蓝牙。要实现这一点,仅需确保堆中有足够的存储空间即可。
常见使用情况下的内存消耗
基于上述 3 个原因,ESP32-C3 可为应用提供更高效的内存使用方式。接下来,让我们以常见的应用为例,看看这些案例下 ESP32 和 ESP32-C3 的内存使用情况,以及可用的剩余内存空间。
下表对比实验中,已尽量确保 ESP32 和 ESP32-C3 的配置相同,且使用同一 SDK 版本 (IDF v4.3-beta3) 运行应用。
由上表明显可知:
- 对于不使用 Wi-Fi 或蓝牙的应用,ESP32-C3 可为其提供更多的剩余内存。这一点正是基于上文中提到的 IRAM-DRAM 动态分区实现。
- 对于仅使用 Wi-Fi 的应用,ESP32 和 ESP32-C3 可提供的剩余内存几乎等同。
- 对于使用蓝牙的应用,ESP32-C3 可提供的剩余内存比 ESP32 多 17 ~ 18 KB。
- 除此之外,ESP32-C3 支持重新启动低功耗蓝牙功能,而无需静态分配任何内存。
因此,正如上文所述,ESP32-C3 可为应用提供等同于或更多于 ESP32 的剩余内存空间。但如果您考虑选择 ESP32-C3 芯片或将原有 ESP32 程序迁移至 ESP32-C3 平台,也请您充分考虑芯片其他重要特性,比如 PSRAM 空间、IO 数量以及 CPU 性能等。