MicroPython 是一种适用于微控制器和其他受限环境的 Python 编程语言的实现。它旨在提供与 Python 3 语言的紧密兼容,同时考虑到内存和计算资源的限制。MicroPython 库是这门语言的核心组成部分,提供了一系列的模块和函数,使得开发者能够在硬件上执行各种任务。
下面将通过系列文章,逐一解读microPython,以便让读者了解掌握microPython的整个核心逻辑.,以便读者可以透过这个Python的最小内核,掌握Python解析器的核心实现逻辑,学习世界上最优秀的源码设计之一.
microPython Python最小内核源码解析
这段代码是 MicroPython 运行时环境的一部分,它定义了 micropython 模块以及其中包含的各种函数和对象。这些函数和对象提供了对 MicroPython 运行时环境的控制和管理,例如内存信息、栈使用情况、垃圾收集器的操作等。
#include <stdio.h>
#include "py/builtin.h" // 包含 MicroPython 内置对象和函数的头文件
#include "py/stackctrl.h" // 包含 MicroPython 栈控制的头文件
#include "py/runtime.h" // 包含 MicroPython 运行时环境的头文件
#include "py/gc.h" // 包含 MicroPython 垃圾收集机制的头文件
#include "py/mphal.h" // 包含 MicroPython 硬件抽象层的头文件
#if MICROPY_PY_MICROPYTHON // 如果定义了 MICROPY_PY_MICROPYTHON,则编译以下代码
// 以下代码是 MicroPython 运行时特有的各种内置函数,
// 它们位于 micropython 模块中
#if MICROPY_ENABLE_COMPILER // 如果启用了编译器支持
static mp_obj_t mp_micropython_opt_level(size_t n_args, const mp_obj_t *args) {
// 用于获取或设置优化级别
if (n_args == 0) {
// 如果没有参数,则返回当前的优化级别
return MP_OBJ_NEW_SMALL_INT(MP_STATE_VM(mp_optimise_value));
} else {
// 如果有参数,则设置优化级别
MP_STATE_VM(mp_optimise_value) = mp_obj_get_int(args[0]);
return mp_const_none; // 返回 None 对象
}
}
static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_micropython_opt_level_obj, 0, 1, mp_micropython_opt_level);
#endif
#if MICROPY_PY_MICROPYTHON_MEM_INFO // 如果定义了 MICROPY_PY_MICROPYTHON_MEM_INFO,则编译以下代码
#if MICROPY_MEM_STATS // 如果启用了内存统计
// 以下函数用于获取内存统计信息
static mp_obj_t mp_micropython_mem_total(void) {
// 返回总共分配的内存大小
return MP_OBJ_NEW_SMALL_INT(m_get_total_bytes_allocated());
}
static MP_DEFINE_CONST_FUN_OBJ_0(mp_micropython_mem_total_obj, mp_micropython_mem_total);
static mp_obj_t mp_micropython_mem_current(void) {
// 返回当前分配的内存大小
return MP_OBJ_NEW_SMALL_INT(m_get_current_bytes_allocated());
}
static MP_DEFINE_CONST_FUN_OBJ_0(mp_micropython_mem_current_obj, mp_micropython_mem_current);
static mp_obj_t mp_micropython_mem_peak(void) {
// 返回内存分配的峰值大小
return MP_OBJ_NEW_SMALL_INT(m_get_peak_bytes_allocated());
}
static MP_DEFINE_CONST_FUN_OBJ_0(mp_micropython_mem_peak_obj, mp_micropython_mem_peak);
#endif
// 用于显示内存信息
mp_obj_t mp_micropython_mem_info(size_t n_args, const mp_obj_t *args) {
(void)args;
#if MICROPY_MEM_STATS
// 打印内存统计信息
mp_printf(&mp_plat_print, "mem: total=" UINT_FMT ", current=" UINT_FMT ", peak=" UINT_FMT "\n",
(mp_uint_t)m_get_total_bytes_allocated(), (mp_uint_t)m_get_current_bytes_allocated(), (mp_uint_t)m_get_peak_bytes_allocated());
#endif
#if MICROPY_STACK_CHECK
// 打印栈使用情况
mp_printf(&mp_plat_print, "stack: " UINT_FMT " out of " UINT_FMT "\n",
mp_stack_usage(), (mp_uint_t)MP_STATE_THREAD(stack_limit));
#else
// 打印栈使用情况,不包括栈限制
mp_printf(&mp_plat_print, "stack: " UINT_FMT "\n", mp_stack_usage());
#endif
#if MICROPY_ENABLE_GC
// 打印垃圾收集器的信息
gc_dump_info(&mp_plat_print)</