赞
踩
因为 ESP32-CAM 内核是 ESP32,所以以下所有的说明来自 ESP32 技术参考手册。 ESP32 是一个双核系统,具有两个哈佛架构(Harvard Architecture) Xtensa LX6 CPU。所有嵌入式内存(embedded memory),外部内存(external memory)和外围设备(peripherals)位于这些 CPU 的数据总线和/或指令总线上。
两个 CPU 的地址映射是对称的,这意味着它们使用相同的地址访问相同的内存。系统中的多个外设可以通过 DMA (Direct Memory Access 直接内存存取,以下简称 DMA) 访问嵌入式内存。
这两个 CPU 被命名为 “PRO_CPU” 和 “APP_CPU”(分别代表“协议(Protocol)”和“应用程序(Application”),但是,对于大多数用途而言,这两个 CPU 是可以互换的。
地址空间
嵌入式内存
外部内存
片外(off-Chip) SPI (Serial Peripheral Interface串行外设接口, 以下简称 SPI)存储器可以映射到可用地址空间作为外部内存。部分的嵌入式内存可用作该外部内存的透明缓存。
外围设备
直接存取
常用存储器的介绍:
下图是 ESP32 系统架构图,PRO_CPU 和 APP_CPU 面对的是相同的地址空间,可以直接读取嵌入式内存与外围设备地址,而对于外部内存空间,需要透过快取 (Cache) 与内存管理单元 (Memory Management Unit, 以下简称 MMU) 才能进行存取。
图 01 ESP32 系统架构
图 02 ESP32 系统地址对应图
图 03 ESP32 系统地址对应表格
ESP32 从上电到运行 Micropython 中间所经历的启动流程步骤。
宏观上,启动流程可以分为如下 3 个步骤:
一级引导程序
ESP32 SoC (System on a Chip, 简称SoC)复位后,PRO CPU 会立即开始运行,执行复位向量代码,而 APP CPU 仍然保持复位状态。在启动过程中,PRO CPU 会执行所有的初始化操作。APP CPU 的复位状态会在应用程序启动代码的 call_start_cpu0 函数中失效。复位向量代码位于 ESP32 芯片掩膜 ROM 处,且不能被修改。二级引导程序二进制镜像会从 flash 的 0x1000 偏移地址处加载。
二级引导程序
ESP-IDF (Espressif IoT Development Framework, 以下简称 ESP-IDF) 是乐鑫官方推出的物联网开发框架,支持 Windows、Linux 和 macOS 操作系统。
下表总结了乐鑫芯片在 ESP-IDF 各版本中的支持状态,其中 supported 代表已支持,preview 代表目前处于预览支持状态。预览支持状态通常有时间限制,而且仅适用于测试版芯片。请确保使用与芯片相匹配的 ESP-IDF 版本。
表 01. ESP-IDF 各版本中的支持状态
芯片 | v4.1 | v4.2 | v4.3 | v4.4 | v5.0 | v5.1 |
---|---|---|---|---|---|---|
ESP32 | supported | supported | supported | supported | supported | supported |
ESP32-S2 | supported | supported | supported | supported | supported | |
ESP32-C3 | supported | supported | supported | supported | ||
ESP32-S3 | supported | supported | supported | |||
ESP32-C2 | supported | supported | ||||
ESP32-C6 | supported | |||||
ESP32-H2 beta1/2 | preview | preview | preview |
使用 ESP-IDF 针对 ESP32 芯片所编译出来的二进制镜像,透过烧录软件(esptool.py)烧录到 flash 的 0x1000 偏移地址处,那个二进制镜像就是二级引导程序。二级引导程序的源码可以在 ESP-IDF 的 components/bootloader 目录下找到。ESP-IDF 使用二级引导程序可以增加 flash 分区的灵活性(使用分区表),并且方便实现 flash 加密,安全引导和空中升级(Over The Air, OTA)等功能。
图 04 ESP-IDF 的二级引导程序源码所在
当一级引导程序校验并加载完二级引导程序后,它会从二进制镜像的头部找到二级引导程序的入口点,并跳转过去运行。二级引导程序默认从 flash 的 0x8000 偏移地址处(可配置的值)读取分区表。引导程序会寻找工厂分区和 OTA 应用程序分区。如果在分区表中找到了 OTA 应用程序分区,引导程序将查询 otadata 分区以确定应引导哪个分区。
应用程序
应用程序启动包含了从应用程序开始执行到 app_main 函数在主任务内部运行前的所有过程。可分为三个阶段:
端口初始化:端口层的初始化功能会初始化基本的 C 运行环境,并对 SoC 的内部硬件进行了初始配置。
系统初始化:主要的系统初始化任务包括以下
运行主任务:在所有其他组件都初始化后,主任务会被创建,FreeRTOS 调度器开始运行。做完一些初始化任务后,主任务在固件中运行应用程序提供的函数 app_main。
APP CPU 的内核启动流程
当运行系统初始化时,PRO CPU 上的代码会给 APP CPU 设置好入口地址,解除其复位状态,然后等待 APP CPU 上运行的代码设置一个全局标志,以表明 APP CPU 已经正常启动。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。