不修改固件为MicroPython添加库

默认情况下,mpy固件中已经编译好了很多库,但当我们的功能受限的时候,就需要添加库(这个库可以是C语言写的也可以是MicroPython写的)接下来我接受如何在不修改固件的情况下为ESP32添加库
首先,我们要知道MicroPython就相当于一个系统,它其实是有版本的,我们可以通过以下方式查看系统版本:

连上Thonny后使用sys.version这个命令即可查看MicroPython版本:前者3.4.0是固件版本,后者v1.20.0是MicroPython系统版本,接下来我们需要去GitHub找到历史版本 Releases · micropython/micropython · GitHub 对于01的PYWIFI系列单片机我们不需要挨个找,因为01已经开源了 GitHub - 01studio-lab/micropython: MicroPython - a lean and efficient Python implementation for microcontrollers and constrained systems

接下来我们需要准备工具Linux系统(需要安装好docker,自备魔法)这里我用WSL(Windows system for Linux,Windows上的Linux子系统)来演示,WSL和docker的安装不在此赘述
工具准备好后我们需要克隆01的MicroPython工程:

git clone https://github.com/01studio-lab/micropython

克隆完毕后我们需要安装esp-idfv4.4的docker镜像

docker run -it -v /root:/root espressif/idf:v4.4 /bin/bash

常用的docker命令我放在这里了:

下载镜像记得开魔法
接下来我们进入容器后需要进入01的MicroPython工程文件目录:/micropython/examples/natmod/
然后在此创建一个文件夹,例如add
进入add文件夹添加文件:Makefile内容为:

#MicroPython的根目录
MPY_DIR = ../../..

#模块名称
MOD = add

//源代码文件 (.c or .py)
SRC = add.c

#要构建的架构 (x86, x64, armv6m, armv7m, xtensa, xtensawin)
ARCH = xtensawin

#include以获取编译和链接模块的规则
include $(MPY_DIR)/py/dynruntime.mk

其中 armv7m,xtensa,xtensawin分别代表STM32,ESP8266,ESP32对应的架构
根据芯片,我们选择 xtensawin 然后我们在同目录创建一个 add.c 文件(.py文件也可以)
接下来写一个函数供MicroPython调用:

// 包含了头文件以便访问MicroPython API
#include "py/dynruntime.h"



// 这是 Python 将调用的函数,即 add(x)
static mp_obj_t add(mp_obj_t x_obj, mp_obj_t y_obj) 
{
    // 从MicroPyton输入的对象中提取整数
    mp_int_t x = mp_obj_get_int(x_obj);
    mp_int_t y = mp_obj_get_int(y_obj);

    // 把结果转换为MicroPython整数对象并返回
    return mp_obj_new_int(x + y);
}

// 定义上述函数的 Python 引用
// 修改为 MP_DEFINE_CONST_FUN_OBJ_2 因为 add 函数有两个参数
static MP_DEFINE_CONST_FUN_OBJ_2(add_obj, add);

// 这是入口点,在导入模块时被调用
mp_obj_t mpy_init(mp_obj_fun_bc_t *self, size_t n_args, size_t n_kw, mp_obj_t *args) 
{
    //这必须是第一项,因为它设置了 globals dict 和其他东西

    MP_DYNRUNTIME_INIT_ENTRY

    //使函数在模块的命名空间中可用
    mp_store_global(MP_QSTR_add, MP_OBJ_FROM_PTR(&add_obj));

    // 这必须是最后一个,它恢复全局dict
    MP_DYNRUNTIME_INIT_EXIT
}

保存后我们回到docker容器的终端,输入make:

看见此消息则为成功,我们可以看到同目录生成了一个add.mpy的二进制文件:

复制这个文件到板子的flash,这时候我们可以直接调用add()函数:

这样我们就用C语言为MicroPython添加了一个库,当MicroPython性能达不到的时候,我们可以直接把Arduino的库写成MicroPython的库:)