
Zephyr 上的 ESP32 SoC 特性解析与 AMP 非对称多处理实践【免费下载链接】zephyrPrimary Git Repository for the Zephyr Project. Zephyr is a new generation, scalable, optimized, secure RTOS for multiple hardware architectures.项目地址: https://gitcode.com/GitHub_Trending/ze/zephyrESP32 是乐鑫Espressif推出的集成 Wi-Fi 与双模蓝牙的 Xtensa 双核 SoC也是 Zephyr 中支持最完善的平台之一。本文以 boards/espressif/common/soc-esp32-features.rst 为主线系统梳理 ESP32 在 Zephyr 下的硬件特性清单、双核 AMP非对称多处理运行机制、相关 Kconfig 与源码实现并结合构建烧录流程给出可落地的开发方案。读完本文你将掌握如何在 Zephyr 中为 ESP32 双核分别构建独立应用、通过 OpenAMP 交换数据以及理解 APPCPU 串口输出的限制与规避方法。ESP32 硬件特性总览根据 soc-esp32-features.rstESP32 在 Zephyr 中对外暴露的 SoC 级特性可归纳为五大类处理器与存储双核 Xtensa LX6 微处理器主频 160 MHz 或 240 MHz520 KB 片上 SRAMZephyr 中实际可配置用于内核堆的 RAM 以板级 yaml 为准例如 ESP32-DevKitC 的ram: 8192KB 口径包含 PSRAM 扩展支持单核与双核两种变体。无线连接Wi-Fi 802.11 b/g/n/e/i蓝牙 v4.2 BR/EDR 与 BLE。在 Zephyr 的设备树中这两个能力通过 esp32_devkitc_procpu.dts 中的节点显式启用esp32_bt_hci { status okay; }; wifi { status okay; };同时chosen中通过zephyr,bt-hci esp32_bt_hci;将蓝牙 HCI 指定为 ESP32 内置控制器应用层可直接使用 Zephyr 蓝牙协议栈。外设接口原文档列出的外设矩阵如下外设类别数量/规格12-bit ADC最多 18 通道8-bit DAC2 路触摸传感器10 路SPI4 路I2S2 路I2C2 路UART3 路SD/SDIO/MMC主机接口SDIO/SPI从机Slave接口EthernetMACCAN bus2.0IRRX/TXMotor PWM支持LED PWM最多 16 通道传感器Hall effect霍尔效应、温度传感器这些外设并非只是纸面规格Zephyr 中已有对应驱动并在板级设备树中完成 pinmux 与使能配置。例如 esp32_devkitc_procpu.dts 中i2c0 { status okay; clock-frequency I2C_BITRATE_STANDARD; sda-gpios gpio0 21 GPIO_OPEN_DRAIN; scl-gpios gpio0 22 GPIO_OPEN_DRAIN; pinctrl-0 i2c0_default; pinctrl-names default; };I2C0 工作于标准模式100 kHzSDA/SCL 复用 GPIO21/GPIO22SPI2/SPI3、UART0/1/2、I2S0/1、touch、trng 等在板级均给出默认使能与 pinctrl 配置gpio-reserved-ranges用于屏蔽与 flash/PSRAM 复用的 GPIO避免被普通 GPIO 应用误用。板级 yamlesp32_devkitc_procpu.yaml进一步声明了 Zephyr 对该 SoC 已支持的特性集合adc、dac、gpio、i2c、i2s、watchdog、uart、nvs、pwm、spi、counter、entropy、input、crypto、retained_mem、netif:wifi、pulse_io开发者在prj.conf中按需开启对应驱动 Kconfig 即可。密码学硬件加速ESP32 内置加密硬件加速单元支持RNG真随机数发生器ECC椭圆曲线密码RSASHA-2AES在 Zephyr 中对应crypto驱动与entropy驱动esp32_devkitc_procpu.dts 中trng0 { status okay; };即为熵源节点可支撑安全启动、TLS、固件加密等安全场景。低功耗深度睡眠电流低至 5 µA配合 Zephyr 电源管理soc/espressif/common下的power.c、poweroff.c、pmstats.c与retained_mem保留内存机制可设计电池供电的低功耗节点。非对称多处理AMP机制原文档指出搭载 ESP32 与 ESP32-S3 的板卡支持同时运行两个独立应用。利用双核架构每个核可以独立启动执行自定义任务也可以通过OpenAMP 框架交换数据。Zephyr 的ipc示例分类:zephyr:code-sample-category:ipc即提供 OpenAMP 相关的参考实现。AMP 模式下两个核的分工如下PROCPUCore 0运行 Zephyr 主应用负责系统初始化、外设管理与通信APPCPUCore 1运行独立的第二个应用镜像通过 OpenAMP RPMsg 与 PROCPU 交互。从仓库结构可以印证这一设计以 ESP32-DevKitC 为例boards/espressif/esp32_devkitc 目录同时提供 procpu 与 appcpu 两套板级定义esp32_devkitc_procpu.dts / esp32_devkitc_procpu.yaml /esp32_devkitc_procpu_defconfigesp32_devkitc_appcpu.dts / esp32_devkitc_appcpu.yaml /esp32_devkitc_appcpu_defconfig分区表使用espressif/partitions_0x1000_amp.dtsi为两个核分别划分 slot 分区。从 esp32_devkitc_appcpu.yaml 的testing.ignore_tags可以看出APPCPU 镜像主要面向 IPC 类测试网络、蓝牙、flash、内核等大块功能被显式排除——这正是 AMP 场景下“每个核执行独立定制任务”的体现。AMP 使能条件与内存配置AMP 能力由 soc/espressif/common/Kconfig.amp 控制关键约束如下config SOC_ENABLE_APPCPU bool default y depends on (IPM || MBOX) depends on SOC_SERIES_ESP32 || SOC_SERIES_ESP32S3只有启用IPM处理器间消息或 MBOX时PROCPU 才会映射并启动 APPCPU仅ESP32 与 ESP32-S3两个系列支持ESP32-C 系列为单核不在此列SOC_ESP32_APPCPU_TARGET标记当前构建目标是双核 SoC 的 APPCPUCore 1镜像。当SOC_ENABLE_APPCPU开启后可配置 APPCPU 的独立内存区域大小默认值配置项含义默认值ESP_APPCPU_IRAM_SIZEAPPCPU 指令 RAM0x10000(64 KB)ESP_APPCPU_DRAM_SIZEAPPCPU 数据 RAM0x10000(64 KB)ESP_APPCPU_IROM_SIZEAPPCPU 指令 ROMflash 映射0x100000(1 MB)ESP_APPCPU_DROM_SIZEAPPCPU 数据 ROMflash 映射0x100000(1 MB)这些区域由soc/espressif/esp32/default_appcpu.ld链接脚本承载用于将 APPCPU 镜像的代码段与数据段固定到独立地址空间。AMP 的源码级实现AMP 启动链路位于 soc/espressif/esp32/esp32-mp.c核心函数包括esp_appcpu_init()通过SYS_INIT(esp_appcpu_init, POST_KERNEL, ...)在内核启动后期自动执行非 MCUboot 场景从slot0_appcpu_partition分区读取 APPCPU 镜像esp_appcpu_image_load(hdr_offset, entry_addr)用 bootloader 的 mmap 接口读取 flash 中的 APPCPU 镜像校验 IRAM/DRAM 目标地址与入口点合法性后把 IRAM、DRAM 段搬运到目标内存esp_appcpu_start2(entry_point)解暂停unstallAPPCPU、使能时钟门控、复位 APPCPU 并设置启动地址esp_appcpu_image_stop()/esp_appcpu_image_start(hdr_offset)分别用于暂停与启动 APPCPU 镜像started静态标志保证 APPCPU 只启动一次。值得注意的是源码注释明确提示启动序列中的串口输出ets_printf/ ROM 字符发送对启动可靠性是必须的——即使是用k_busy_wait()精确复刻时序某些板卡仍会出现 APPCPU 无法启动的偶发挂起因此该段日志被刻意保留。AMP 串口输出限制重要原文档特别提示在当前的 Zephyr ESP32 实现中运行于 APPCPU 的应用尚不能访问由 Zephyr 管理的串口驱动如printk()、日志系统或 console UART串口输出 API 仅在 PROCPU 可用。作为规避方案APPCPU 上的应用可以使用ESP32 ROM 函数ets_printf()输出诊断或调试信息。这一约束也被 esp32-mp.c 印证APPCPU 启动序列全程使用ets_printf()与esp_rom_output_tx_one_char()而非 Zephyr 的printk()。设计 AMP 应用时应将日志输出集中在 PROCPUAPPCPU 仅承担计算/实时任务并通过 OpenAMP 将结果回传。构建、烧录与运行实践虽然特性文档本身不展开构建细节但 AMP/IPC 开发离不开烧录流程此处结合 boards/espressif/common/building-flashing.rst 给出与本文主题配套的实操步骤。Simple Boot单镜像直接启动不启用二级引导加载程序时板卡可加载单个二进制镜像直接运行这是不带额外配置构建应用的默认选项west build -b esp32_devkitc/esp32/procpu samples/hello_world west flash注意Simple Boot不提供任何安全特性也不支持 OTA 更新。使用 MCUboot 引导加载程序AMP 场景必需AMP 需要为两个核分别准备独立分区因此必须使用 MCUboot 并在板级默认配置中启用CONFIG_BOOTLOADER_MCUBOOTy有两种构建方式1. Sysbuild推荐自动构建并烧录全部镜像west build --sysbuild -b esp32_devkitc/esp32/procpu samples/hello_world默认情况下sysbuild 会生成 MCUboot 引导加载程序与应用两个镜像其输出目录按域domain组织build/ ├── hello_world │ └── zephyr │ ├── zephyr.elf │ └── zephyr.bin ├── mcuboot │ └── zephyr │ ├── zephyr.elf │ └── zephyr.bin └── domains.yaml2. 手动构建逐个镜像快速迭代引导加载程序只需烧录一次之后可分别构建 PROCPU 与 APPCPU 镜像west build -b esp32_devkitc/esp32/procpu samples/hello_world west flash west build -b esp32_devkitc/esp32/appcpu 你的-ipc-应用 west flash加速烧录的实用选项west flash --esp-skip-flashed当 flash 中的二进制与待烧录镜像一致时跳过写入设备端 MD5 校验加快开发循环west flash --esp-diff仅写入与上次烧录镜像存在差异的区域基于本地缓存对比若 flash 被其他工具/手动修改过则不要使用west flash --esp-no-progress抑制进度输出适合 CI 场景west flash --reset-type watchdog-reset当芯片停留在下载模式无法自动启动新镜像时用看门狗复位强制重启west espressif monitor打开串口监视器观察 PROCPU 输出。启动成功后串口监视器应看到类似输出***** Booting Zephyr OS vx.x.x-xxx-gxxxxxxxxxxxx ***** Hello World! board参考资料特性文档源文件boards/espressif/common/soc-esp32-features.rstAMP Kconfigsoc/espressif/common/Kconfig.ampAMP/SMP 启动实现soc/espressif/esp32/esp32-mp.c板级双核定义boards/espressif/esp32_devkitc构建与烧录指南boards/espressif/common/building-flashing.rstESP32 系列 SoC 支持矩阵soc/espressif更详尽的硬件寄存器与电气规格可查阅 ESP32 Datasheet 与 ESP32 Technical Reference Manual乐鑫官方文档。若需确认某一外设在 Zephyr 中的驱动支持状态建议以对应板卡目录下的设备树与supported列表为准。【免费下载链接】zephyrPrimary Git Repository for the Zephyr Project. Zephyr is a new generation, scalable, optimized, secure RTOS for multiple hardware architectures.项目地址: https://gitcode.com/GitHub_Trending/ze/zephyr创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考