ESP32 教程:为 ESP32 编译 MicroPython

MicroPython 是 Python 3 编程语言的一个实现,它经过优化,可以在微控制器上运行。它支持许多流行的微控制器,如 STM32,Teensy,ESP8266 包括它的官方板、Pyboard,当然还有ESP32。

正如我之前所说,MicroPython 已经支持 ESP32。我们可以下载固件,并简单地将其烧录到任何基于 ESP32 的电路板上。那么,为什么我自己编写它呢?因为趣有兴趣深入了解一下它是如何工作的。

事实证明,ESP32 的 MicroPython 端口是在 ESP32 的官方开发框架 ESP-IDF 之上构建的。 这意味着如果您有使用 ESP-IDF 的知识和经验,您可以扩展 ESP32 的 MicroPython 端口并构建您自己的版本。

材料清单

  1. 最新版本的 MicroPython ESP32 代码
  2. 最新版本的 ESP-IDF

代码编译

为了编译代码,我们需要移到 MicroPython 的 ESP32 代码目录下的 ports/esp32 目录。该目录中有一个 README.md 文件。编写代码的完整说明写在那里。简而言之,我们需要编译交叉编译器,然后通过编译 ports/esp32 目录(包括ESP-IDF)中的代码来构建固件。

为了编译交叉编译器,我们需要移动到MicroPython根目录。 然后,我们运行以下命令:

make -C mpy-cross

再回到 ports/esp32 目录来构建固件。 在做任何编译之前,让我们看看 Makefile 中有什么。 事实证明,MicroPython 使用(不一定)旧版本的 ESP-IDF。

ESPIDF_SUPHASH := 2c95a77cf93781f296883d5dbafcdc18e4389656
ESPIDF_CURHASH := $(shell git -C $(ESPIDF) show -s --pretty=format:'%H')

这段代码从 Makefile 中的第 32 行到第 33 行。正如你所看到的,使用的提交哈希是 10 月 24 日发布的 2c95a77cf93781f296883d5dbafcdc18e4389656

如果我们进一步观察,如果我们的 ESP-IDF 版本与 MicroPython 使用的版本不同,那么运行 make 将会显示警告。现在,让我们坚持最新版本的ESP-IDF,看看编译过程如何。

如果我们进入 Makefile,你可能会注意到第 25 行到第 27 行。

ifeq ($(ESPIDF),)
$(error Please configure the ESPIDF variable)
endif

所以,我们需要将 ESP-IDF 的路径分配给 ESPIDF 变量。 如果我们正确安装了 ESP-IDF,我们应该有一个存储在名为 IDF_PATH 的环境变量中的 ESP-IDF 路径。

您还可以配置烧录固件的端口名称和波特率。看看第 17 至 22 行。

PORT ?= /dev/ttyUSB0
BAUD ?= 460800
FLASH_MODE ?= dio
FLASH_FREQ ?= 40m
FLASH_SIZE ?= 4MB
CROSS_COMPILE ?= xtensa-esp32-elf-

这些是烧录固件的默认值。 你可能只想改变 PORTBAUD 的值,如果你知道你在做什么,随意改变其余的部分。

现在编译代码:

ESPIDF=$IDF_PATH make -j4

在这里我们创建 4 个并行作业。

components/spi_flash/flash_ops.c:35:25: fatal error: esp_ota_ops.h: No such fileor directory
compilation terminated.

所以我们有一个错误,耶!错误表示编译器找不到 esp_ota_ops.h 文件。文件 esp_ota_ops.h 属于 app_update 组件,事实证明这个组件不包括在内。 我们来包含这个组件并重新编译。

将行添加到包含组件的第 84 行之后。

INC_ESPCOMP += -I$(ESPCOMP)/app_update/include

让我们重新编译代码。 希望我们不会收到任何编译错误。

LINK build/application.elf
build/components/spi_flash/flash_ops.o:(.literal.is_safe_write_address$part$0+0x0): undefined reference to `esp_ota_get_running_partition'
build/components/spi_flash/flash_ops.o: In function `is_safe_write_address$part$0':
flash_ops.c:(.text.is_safe_write_address$part$0+0x3): undefined reference to `esp_ota_get_running_partition'

所以我们有另一个错误。而不是编译错误,我们得到了一个链接器错误。 缺少的文件包含正确,但我认为该对象不链接。让我们来检查一下 Makefile。

看一下第 568 到 641 行,编译组件中的对象被分配给链接器参数。所以我们也需要从 app_update 分配对象。

OBJ_ESPIDF 定义之前添加此行。

ESPIDF_APP_UPDATE_O = $(addprefix $(ESPCOMP)/app_update/,esp_ota_ops.o)

还要在最后一次赋值给 OBJ_ESPID 变量之后添加这行。

OBJ_ESPIDF += $(addprefix $(BUILD)/, $(ESPIDF_APP_UPDATE_O))

我们定义一个变量,指向 app_update 组件的目标文件,并将其附加到 OBJ_ESPIDF 变量,以便将 app_update 组件与其他组件链接在一起。 现在让我们重新编译一下,看它是否有效。

LINK build/application.elf
   text    data     bss     dec     hex filename
 714850  171596  173456 1059902  102c3e build/application.elf
Create build/application.bin
esptool.py v2.1
Create build/firmware.bin
bootloader     16048
partitions      3072
application   886576
total         952112

It works!我们用最新的 ESP-IDF 成功编译了 MicroPython!

结论

我们已经编译了 ESP32 的 MicroPython 和 ESP-IDF 的最新版本。 我们需要修改 Makefile , 以通过包含缺少的组件头和对象文件来修复编译和链接器错误。

下一步是将固件刷到基于ESP32的电路板并测试固件,我们应该期望在运行时间中断一些事情。

原文链接:https://medium.com/@alwint3r/compiling-micropython-for-esp32-85cc1968e424

尚未评分
您的评分将帮助我们做出更好的玩法

观光\评论区

Copyright © 2017 玩点什么. All Rights Reserved.